【真正深入回測恆指每月第一個交易日/最後交易日規律】
Added 2024-03-04 11:59:16 +0000 UTC今篇文章會為大家解決以下一些回測常見問題:
- 回測季節性策略時要知道的一些Tricks及陷阱位
- 點樣用 真正統計學的技巧 (tail test) 去回測季節性規律?
- Groupby應該點樣有效使用?
- 點樣最有效搵出每月的第一個/最後的日歷日及交易日?
- 日回報應該用今日同琴日比較 定係 今日同聽日比較好?
市場一般認為,期指結算日轉倉及基金轉月配置,對恒指的第一個交易日及最後交易日價格變化有一定影響。好少人會做嘅係,有邊啲特別情況下係有規律而邊啲只係市場上一直誤傳的錯覺?
我們用 2001 年到 2022 年(共22年)的恒指每日收市價的數據來看看:


不過,有一個問題需要解決:每月第一個交易日及最後交易日的日子都是不固定的。
- 有些月份的第一個交易日是1號,有些是2號,有些更可能是6號!舉一個例子,如果2月1號是星期六、2月3號是年初一,那麼2月的第一個交易日是2月6號。
- 最後交易日的日子一樣,都是不固定的,有些是31號,有些是30號。
如何找到每月恒指的最後交易日?
我們今次會分享如何用 Python 去做資料處理(Data processing)。
(我們的團隊會每月不定期發放用Python去做量化交易的資料處理的文章。)
假設我們已經把恒指每日收市價的數據放入Python 中叫 df_hsi 的 Dataframe,處理的步驟如下:
-------------------------------------------------------------------------------------------------------------------
第一步:
為這個 df_hsi 建立 Year, Month, Day 這3個新的 columns
df_hsi.loc[:, "Year"] = df_hsi["Date"].dt.year
df_hsi.loc[:, "Month"] = df_hsi["Date"].dt.month
df_hsi.loc[:, "Day"] = df_hsi["Date"].dt.day

-------------------------------------------------------------------------------------------------------------------
第二步:
為這個 df_hsi 建立 trading_day_of_month_reverse 這個新的column
df_hsi["trading_day_of_month_reverse"] = (
df_hsi.groupby(["Year", "Month"])["Day"]
.rank(ascending=False, method="max")
.astype(int)
)
這段 Python code 所做的是:
1. 先把 Year 和 Month 兩個 columns 做 grouping key。這就會把每一個月份分做一個group,例如 「2001年1月」,「2001年2月」, 「2001年3月」, ... , 「2022年12月」都是不用的 group
2. 之後,每一個group都會找幫相對應的 Day 去找這個排行是多少。舉個例子:
- 2021-01-31 的Day是31,在2021-01這個月排第1,所以trading_day_of_month_reverse是1
- 2021-01-30 的Day是30,在2021-01這個月排第2,所以trading_day_of_month_reverse是2
- 2021-01-02 的Day是2,在2021-01這個月排第19,所以trading_day_of_month_reverse是19
這做到一個效果:
如果trading_day_of_month_reverse = 1,就代表這一日是該月的最後一個交易日
如果trading_day_of_month_reverse = 2,就代表這一日是該月的最後第二個交易日

除了最後交易日,我們也一起找每月第一個交易日:
為這個 df_hsi 建立 trading_day_of_month 這個新的column
df_hsi["trading_day_of_month"] = (
df_hsi.groupby(["Year", "Month"])["Day"]
.rank(ascending=True, method="max")
.astype(int)
)
這段 Python code 做到一個效果:
如trading_day_of_month = 1,就代表這一日是該月的第一個交易日
如trading_day_of_month = 2,就代表這一日是該月的第二個交易日
-------------------------------------------------------------------------------------------------------------------
第三步:
用Python去視化(visualise) 2001年至2022年的
- 每月第N日的平均日回報 (Average 1-day log return)
- 每月第N個交易日的平均日回報 (Average 1-day log return)
- 每月最後第N個交易日的平均日回報 (Average 1-day log return)

我們會使用 1-day log return 計算每日回報,這樣計算可以捕捉 1月3日當天間HSI的變化
例如2001年1月3日的 1-day log return
= log(2001年1月3日收市價) - log(2001年1月2日收市價)
= log(14589.58) - log(14869.94)
= -0.01903

接着下來,我會解釋三種圖表
圖表解釋:
1: 每月第N日的平均日回報 (Average 1-day log return)



我們把2001-2022所有的日曆日(Calendar Day)去計算平均日回報 (Average 1-day log return)
1. 如果日曆日是1
- sample size是123,這代表2001-2022有123個交易日是1號,
- Average 1-day log return 是 0.003226,
- One sample t-test 的 p-value 是 0.00577,代表如果日曆日是1,H1 : Average 1-day log return > 0 在統計上非常顯著!
2. 如果日曆日是31
- sample size是105,這代表2001-2022有105個交易日是31號,
- Average 1-day log return 是 0.001414,
- One sample t-test 的 p-value 是 0.08221,代表如果日曆日是31,H1 : Average 1-day log return > 0 在統計上不算顯著。
2: 每月第N個交易日的平均日回報 (Average 1-day log return)




我們把2001-2022所有的每月第N個交易日(Trading Day of Month)去計算平均日回報 (Average 1-day log return)
1. 如果去計算每月第1個交易日
- sample size是264,這代表2001-2022有264個交易日是每月第1個交易日
- Average 1-day log return 是 0.002656
- One sample t-test 的 p-value 是 0.00238,代表在每月第1個交易日,H1 : Average 1-day log return > 0 在統計上非常顯著! (比日曆日是1號的 p-value 0.00577更低,更顯著)
2. 如果去計算每月第23個交易日
- sample size是15,這代表2001-2022只有15個交易日是每月第23個交易日
- Average 1-day log return 是 -0.001413
- One sample t-test 的 p-value 是 0.30485,代表在每月第23個交易日,H1 : Average 1-day log return < 0 在統計上不算顯著。
3. 如果去計算每月第22個交易日
- sample size是72,這代表2001-2022只有72個交易日是每月第22個交易日
- Average 1-day log return 是 0.002477
- One sample t-test 的 p-value 是 0.01996,代表在每月第22個交易日,H1 : Average 1-day log return > 0 在統計上顯著。
3: 每月最後第N個交易日的平均日回報 (Average 1-day log return)



我們把2001-2022所有的每月最後第N個交易日(Trading Day of Month)去計算平均日回報 (Average 1-day log return)
1. 如果去計算每月最後交易日
- sample size是264,這代表2001-2022有264個交易日是每月最後交易日
- Average 1-day log return 是 0.000929
- One sample t-test 的 p-value 是 0.10197,代表在每月最後交易日,H1 : Average 1-day log return > 0 在統計上不算顯著。
2. 如果去計算每月最後第二個交易日
- sample size是264,這代表2001-2022有264個交易日是每月最後第二個交易日
- Average 1-day log return 是 0.001275
- One sample t-test 的 p-value 是 0.09721,代表在每月最後第二個交易日,H1 : Average 1-day log return > 0 在統計上不算顯著。
-------------------------------------------------------------------------------------------------------------------
總結:
在2001-2022年的HSI:
1. 每月第1個交易日和日曆日是1號的交易日的 Average 1-day log return 在統計上非常顯著是大於0
2. 每月最後交易日和每月最後第二個交易日的 Average 1-day log return 在統計上不算顯著是大於0
3. 不是每個月都有第22個交易日,在264月中只有72個月有第22個交易日,不過,第22個交易日的 Average 1-day log return 在統計上顯著是大於0
(數據及Codes在附件)
Comments
有hypothesis testing❤️ 唔like唔得!
Jacky
2025-06-05 09:09:47 +0000 UTC我諗無相當程度數底係睇唔明, 同學仔可以仲記得, 我既Stat已經還左俾學校...
Philip Chak
2024-08-07 18:06:02 +0000 UTC