|
|
3 周之前 | |
|---|---|---|
| .. | ||
| configs | 3 周之前 | |
| data | 3 周之前 | |
| memory | 3 周之前 | |
| outputs | 3 周之前 | |
| src | 3 周之前 | |
| tests | 3 周之前 | |
| .codex | 3 周之前 | |
| MEMORY.md | 3 周之前 | |
| README.md | 3 周之前 | |
| TASK_PROMPT.md | 3 周之前 | |
| TASK_PROMPT_PHASE2.md | 3 周之前 | |
| USER.md | 3 周之前 | |
| pyproject.toml | 3 周之前 | |
本仓库当前已实现:
当前仍然是指数研究层回测,不包含个股逻辑、ETF 选择逻辑或实盘交易接口。
data/ 分层clean/features 衍生结果,不访问网络configs/
instruments.yaml
strategy/
top2_weekly.yaml
top2_every_5_days.yaml
data/
raw/
clean/
features/
meta/
src/
data/
signals/
trend.py
ranker.py
scorer.py
selector.py
portfolio/
allocator.py
rebalance.py
backtest/
execution.py
engine.py
metrics.py
run.py
tests/
raw:provider 原始缓存clean:标准化日线features:只基于本地 clean 计算的 rolling 特征第二阶段 v1 使用的核心字段来自 features:
closedaily_returnret_5d / ret_10d / ret_20d / ret_60dma_20 / ma_60vol_10d / vol_20d在 signal_date 对每个指数检查:
close > ma_20close > ma_60ma_20 > ma_60ret_20d > 0默认满足至少 2 条时,trend_pass = True。
可通过策略配置中的 trend_min_rules 调整阈值,例如提高到 3 条以收紧入选条件。
只允许 trend_pass=True 的标的进入最终选择,但横截面 rank 仍基于当日 4 个指数计算。
动量分数:
ret_5d * 0.20ret_10d * 0.25ret_20d * 0.30ret_60d * 0.25风险惩罚:
vol_10d * 0.60vol_20d * 0.40最终分数:
final_score = score_mom - 0.30 * score_risk_penalty
Top2:若合格标的数 >= 2,持有前两名,各 50%Top2:若合格标的数 = 1,单标的 100%Top1:只持有第一名= 0,空仓risk_penalty_multiplier 调整风险惩罚强度(默认 0.30)当前支持:
weeklyevery_5_daysdaily(用于测试和最小实现,不是主配置)这是第二阶段最重要的约束:
t 日收盘后,使用 t 日 close 与历史数据生成信号t+1 日执行调仓t 日收盘信号按 t 日收盘成交当前回测只有日频 close 数据,因此 v1 采用保守语义:
t+1 当天先计入旧仓位从 t -> t+1 的日收益t+1 收盘执行调仓t+2 的日收益开始生效这能明确避免未来函数和时点错配。测试已覆盖该约束。
当前统一使用三档成本场景:
optimistic = 10bp 总成本base = 15bp 总成本(默认研究基准)conservative = 20bp 总成本配置文件位于:
configs/research/cost_scenarios.yaml
后续比较策略时,优先看 base,并同时检查 optimistic / conservative 两侧的稳定性。
回测至少输出:
cumulative_returnannual_returnmax_drawdownannual_volatilitysharpecalmarturnoverrebalance_countcash_days_ratio同时输出:
daily_nav.csvdaily_holdings.csvrebalances.csvTop2 周频:
python3 -m src.backtest.run --config configs/strategy/top2_weekly.yaml
Top2 每 5 个交易日:
python3 -m src.backtest.run --config configs/strategy/top2_every_5_days.yaml
Top1 每 5 个交易日(较强风险惩罚候选配置):
python3 -m src.backtest.run --config configs/strategy/top1_every_5_days_p05.yaml
Top1 每 5 个交易日(更强风险惩罚,适合低成本场景对比):
python3 -m src.backtest.run --config configs/strategy/top1_every_5_days_p06.yaml
Top1 每 5 个交易日(主候选 + 成本敏感性配置):
python3 -m src.backtest.run --config configs/strategy/top1_every_5_days_p05_cost10bp.yaml
python3 -m src.backtest.run --config configs/strategy/top1_every_5_days_p05_cost15bp.yaml
python3 -m src.backtest.run --config configs/strategy/top1_every_5_days_p05_cost20bp.yaml
默认输出目录:
outputs/backtests/<config_name>/
生成统一对比表:
python3 -m src.backtest.compare
默认会输出:
outputs/research/strategy_comparison.csv
outputs/research/strategy_comparison.md
例如:
outputs/backtests/top2_weekly/summary.jsonoutputs/backtests/top2_weekly/daily_nav.csvoutputs/backtests/top2_weekly/daily_holdings.csvoutputs/backtests/top2_weekly/rebalances.csv首次全量初始化:
python3 -m src.data.bootstrap --all
按上次成功抓取位置增量更新:
python3 -m src.data.update --since-last
单标的历史回补:
python3 -m src.data.backfill --instrument sse50 --start 2003-12-31
从本地层修复下游层:
python3 -m src.data.repair --instrument sse50 --layer features
查看状态:
python3 -m src.data.status
python >= 3.10pandasPyYAMLpyarrowakshare运行全量测试:
python3 -m unittest discover -s tests -v
当前测试覆盖:
Top1 / Top2 / 空仓 分配t 日信号、t+1 执行的时点约束当前版本仍有意保持最小化:
若进入下一阶段,优先建议: