这是一个从零搭建的 Python 项目,覆盖了需求文档中的四个主模块:
- 数据获取与本地缓存:使用
akshare真实数据源,缓存到 SQLite。 - 数据分析:计算收益、风险、Alpha/Beta、跟踪误差、持仓集中度、行业分布、仓位估算等指标。
- 策略:基金多因子评分、基于技术指标的择时、基金组合仓位分配。
- 回测:事件驱动、逐日净值推进、交易费率建模、交易记录与持仓记录、参数扫描。
fund_timing_system/
analysis/
backtest/
data/
reporting/
strategy/
utils/
examples/
main.py
README.md
python3 main.py --config examples/demo_config.yaml --force-refresh如果要增量更新基金净值缓存,可以执行:
python3 main.py update-nav --config examples/demo_config.yaml --end-date 2024-12-31如果要缓存指数历史并查询最新值,可以执行:
python3 main.py update-index --config examples/demo_config.yaml --symbol HSTECH --market hk --end-date 2026-03-31 --lookback-days 365
python3 main.py latest-index --config examples/demo_config.yaml --symbol HSTECH --market hk如果要用真实的恒生科技指数数据跑最近两年的择时回测,可以执行:
python3 examples/hstech_real_backtest.py --start-date 2024-03-31 --end-date 2026-03-31如果要对比 Qbot 风格策略并输出同场回测排行榜,可以执行:
python3 examples/hstech_real_backtest.py --symbol HSTECH --market hk --start-date 2024-03-31 --end-date 2026-03-31 --rebalance-frequency D --compare-qbot --output-dir output/hstech_qbot_compare
python3 examples/hstech_real_backtest.py --symbol sh000001 --market cn --display-name "Shanghai Composite Index" --start-date 2025-03-31 --end-date 2026-03-31 --rebalance-frequency D --compare-qbot --output-dir output/sh000001_qbot_compare支持的策略族包括:
base:当前默认的regime + 风控 + 交易抑制策略qbot_sma:参考 Qbot 的均线突破/均线交叉思路qbot_boll:参考 Qbot 的布林带均值回归思路qbot_adx:参考 Qbot 的ADX + MACD + EMA趋势确认思路qbot_fusion:将 Qbot 趋势票和当前regime风控框架做融合
如果要启用双层策略(先判断 market regime,再调整仓位),可以执行:
python3 examples/hstech_real_backtest.py --start-date 2024-03-31 --end-date 2026-03-31 --regime-overlay --output-dir output/hstech_regime如果要让双层策略按每日调仓执行,从而让止损和趋势反转退出更快生效,可以执行:
python3 examples/hstech_real_backtest.py --start-date 2024-03-31 --end-date 2026-03-31 --regime-overlay --rebalance-frequency D --output-dir output/hstech_regime_daily当前默认的双层日调仓版本还内置了最小交易金额和最小权重变化阈值,用来抑制频繁小额再平衡;推荐直接运行:
python3 examples/hstech_real_backtest.py --start-date 2024-03-31 --end-date 2026-03-31 --regime-overlay --rebalance-frequency D --output-dir output/hstech_regime_daily_costcontrolled如果要自动搜索更高收益的参数组合,可以执行:
python3 examples/hstech_real_backtest.py --start-date 2024-03-31 --end-date 2026-03-31 --optimize --output-dir output/hstech_optimized如果要做训练期/验证期拆分,并用更稳健的目标函数选参数,可以执行:
python3 examples/hstech_real_backtest.py --start-date 2024-03-31 --end-date 2026-03-31 --train-validate --train-ratio 0.7 --objective-mode robust --output-dir output/hstech_split_robust如果要做滚动 walk-forward 验证,可以执行:
python3 examples/hstech_real_backtest.py --start-date 2024-03-31 --end-date 2026-03-31 --walk-forward --train-ratio 0.5 --validation-ratio 0.2 --step-ratio 0.1 --objective-mode robust --output-dir output/hstech_walk_forward说明:
- 数据源为
AkShare -> 新浪财经港股指数历史行情接口。 - 如果
2026-03-31当天尚未收盘或接口未更新,脚本会自动以不晚于该日期的最后一个交易日为准。 - 输出默认写入
output/hstech_real/。
执行后会在 output/ 下生成:
data_cache.sqlite:本地缓存fund_metrics.csv:基金分析指标selected_funds.csv:综合打分后的入选基金timing_signals.csv:市场择时信号equity_curve.csv:组合净值曲线trades.csv/positions.csv:交易与持仓明细backtest_metrics.csv:核心回测指标monthly_returns.csv/annual_returns.csv:月度和年度收益summary.md/equity_curve.png:摘要报告与图表
- 当前默认数据源为
akshare,需要本地安装akshare且运行环境允许联网。 - 基金净值、指数行情和基准数据都可以缓存到同一个 SQLite 中。
- 如果后续接入 Tushare、聚宽或基金公司开放接口,推荐在
fund_timing_system/data/providers.py中新增 Provider。
- 本地缓存使用 SQLite。
- 支持基金净值增量更新和指数历史缓存。
- 支持重试机制,避免网络抖动导致任务中断。
- 当前实现了基金基础信息、历史净值、持仓、分红、申赎流量、基准行情这几类数据结构。
- 收益类:区间收益、年化收益、超额收益相关基础。
- 风险类:年化波动率、最大回撤、夏普、索提诺、卡玛。
- 选品类:Alpha、Beta、信息比率、跟踪误差。
- 持仓类:重仓股集中度、行业分布、换手率。
- 择时类:净值波动衍生的仓位估算字段。
- 基金选择策略:对收益、风险调整收益、回撤、Alpha、经理稳定性综合打分。
- 市场择时策略:使用均线、RSI、MACD、布林带构成风险预算。
- 组合策略:在入选基金中按评分分配基准权重,再乘以择时风险预算。
项目目前已经从最初的基础框架,迭代到了一个可跑真实指数、支持多轮稳健性验证的版本:
- 已完成项目骨架:
data / analysis / strategy / backtest / reporting - 已支持
akshare真实基金与指数数据 - 已支持恒生科技指数和上证指数的真实历史回测
- 已实现参数搜索、训练期/验证期拆分、walk-forward 滚动验证
- 已实现双层策略:先识别
market regime,再执行择时规则 - 已实现日调仓、止损、趋势反转退出、恢复加仓
- 已实现交易抑制:最小调仓幅度、冷却期、最小交易金额、最小权重变动
- 已支持按
symbol自动命名输出文件 - 已支持基金净值增量更新与指数最新值查询
当前系统更偏向“风控优先、尽量减少过拟合”的研究型择时框架,而不是只追求单次样本内最高收益。
当前这版择时策略可以概括为:日频双层 regime 策略 + 风控层 + 交易抑制。
先识别当前市场处于哪类 regime:
trend_uptrend_up_high_volsidewaysdowntrenddowntrend_high_vol
判断依据主要包括:
- 短均线和长均线关系
- 中期动量
- 近期实现波动率
这一层的作用是先决定“市场值不值得积极参与”。
在 regime 之下,再计算基础择时信号,主要使用:
- MA
- RSI
- MACD
- 布林带
- 可选 breakout / momentum
这些信号会合成为一个基础 risk_budget,表示理论目标仓位。
再根据市场状态去缩放基础仓位:
- 强趋势时允许较高仓位
- 高波动上涨时适度降仓
- 震荡市只保留小仓位
- 下跌和高波动下跌阶段尽量空仓
在满足更强的趋势确认条件时,会进一步放宽仓位:
- 短均线显著强于长均线
- 价格站上长均线
- MACD 仍偏强
- 中期动量明显为正
- 波动率仍在可接受范围内
这一层的目的是:
- 在明显强趋势里少一些“过度保守”
- 尽量多吃趋势段收益
- 但仍然不直接放弃风控
风控优先级高于趋势增强:
- 回撤止损:当价格相对滚动高点回撤过大时,仓位强制压低
- 趋势反转退出:跌破长均线并且 MACD 转弱时,强制降低仓位
- 恢复加仓:回到趋势向上状态后,再恢复到中等以上仓位
为了避免日调仓带来大量无效小额交易,系统还加入:
min_weight_change:目标仓位变化太小则不调整cooldown_days:刚调仓后短时间内不重复调min_trade_value:交易金额太小不执行min_trade_weight_change:当前权重和目标权重差异太小不执行
这让策略更接近真实可执行的版本,而不是理想化的“每天精确贴仓位”。
截至当前版本,比较有代表性的结果有:
恒生科技指数基础风控日调仓版: 输出目录
output/hstech_regime_daily_costcontrolled年化约4.97%最大回撤约-10.26%交易次数45恒生科技指数强趋势增强版: 输出目录
output/hstech_regime_daily_trendboost_best年化约9.45%最大回撤约-9.81%交易次数44上证指数最近一年增强版: 输出目录
output/sh000001_last_year_trendboost年化约7.46%最大回撤约-6.10%交易次数57
这些结果说明:
- 强趋势增强版相对基础版确实能提升收益
- 风控层有效压制了回撤
- 策略目前更像“稳健择时”而不是“极致收益”模型
- 在一些强单边上涨样本上,仍然可能跑不赢买入持有
这是当前系统的一个真实特征,不是 bug,主要因为:
- 策略本质偏防守型,不会长期满仓
regime过滤、止损和交易抑制都会主动放弃一部分上涨段- 交易成本和再平衡损耗真实存在
- 当前优化目标偏稳健,而不是只按样本内最高收益排序
换句话说,这套策略当前优先追求的是:
- 控回撤
- 降过拟合
- 提升验证期和 walk-forward 稳定性
而不是在任何上涨行情里都去硬拼买入持有。
- 严格按调仓日执行目标权重,不使用未来数据。
- 费用模型包含申购费、赎回费、管理费、托管费、佣金、印花税。
- 支持简单 Grid Search,对
top_n和risk_on_threshold做敏感性分析。
回测结果仅供研究参考,不构成投资建议。接入真实基金数据源后,请在实盘前重新验证数据质量、交易规则和费用模型。