fix(rotation): signal_date改用日历日前一天以捕获外盘假期数据

- 将 signal_date = trading_calendar[i-1] 改为 date - timedelta(days=1)
- 解决A股长假期间美股继续交易但动量计算丢失外盘数据的问题
- 同步修复 export_results 中的 signal_date 映射逻辑
This commit is contained in:
2026-06-03 01:25:09 +08:00
parent 524fa5f513
commit 972bbbe706

View File

@@ -505,12 +505,10 @@ class SimpleRotationStrategy:
# Signal timing: 9:00 AM on day T
# At this moment, T's market has NOT opened yet.
# Only T-1 close data is available for all markets.
# So momentum must be computed from T-1 close (prev_date).
# Use calendar day -1 (not A-share prev trading day) so that
# foreign markets (US/HK) that traded during A-share holidays are captured.
# Execution happens at 9:30 AM using T's ETF prices.
if i > 0:
signal_date = self.trading_calendar[i - 1] # T-1 close
else:
signal_date = date # First day: no prior trading day available
signal_date = date - timedelta(days=1)
new_holdings, factors, bond_momentum = self._generate_signals(signal_date)
@@ -826,11 +824,9 @@ class SimpleRotationStrategy:
tracked_entry: Dict[str, dict] = {}
prev_holdings = []
# Build date index map for signal_date lookup (T-1)
# Build date index map for signal_date lookup (calendar T-1, not A-share prev trading day)
date_list = [pd.Timestamp(rec['date']) for rec in self.daily_records]
date_to_signal_date = {}
for i, d in enumerate(date_list):
date_to_signal_date[d] = date_list[i - 1] if i > 0 else d
date_to_signal_date = {d: d - timedelta(days=1) for d in date_list}
for rec in self.daily_records:
date = pd.Timestamp(rec['date'])