vnpy Alpha 回测链路实战拆解:从因子信号到组合绩效
【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpy
本文拆解 vnpy(VeighNa)vnpy/alpha/模块的回测链路,说明"因子数据集—机器学习模型—组合回测"三块如何拼接,以及历史 K 线如何变成夏普、最大回撤这类组合级指标。面向想验证机器学习选股策略的开发者,示例贯穿沪深300日频信号轮动场景。
对齐因子研究与组合回测的职责
多数回测停留在单品种技术策略,而"持有哪些标的、仓位如何分配、何时调仓"这类组合问题需要单独的信号层。vnpy/alpha/把链路拆成三个抽象:AlphaDataset负责特征计算与 train/valid/test 分段,AlphaModel负责拟合与预测,AlphaStrategy负责把预测值转成目标持仓;AlphaLab则是文件化的研究工作区,数据与产物以 parquet 形式落盘。全链路只依赖少数核心库:polars 做特征计算,lightgbm 做树模型,plotly 出图,pyarrow 存 parquet。研究阶段与回测阶段共用同一份数据和信号文件,回测区间或策略改变时不必重训模型。
加载指数成分与 K 线数据
AlphaLab初始化时自动建子目录:daily/minute 存 K 线(每个合约一个 parquet),component 存指数成分变化,dataset/model/signal 分别存放研究产物。先建工作区,再按指数历史成分批量拉取日线数据:
lab = AlphaLab("./lab/csi300") symbols = lab.load_component_symbols("000300.SSE", "2008-01-01", "2023-12-31") df = lab.load_bar_df(symbols, Interval.DAILY, "2008-01-01", "2023-12-31", extended_days=100)成分股按时间变化取数,是避免幸存者偏差的关键;extended_days=100额外向前取 100 天预热窗口,防止期初滚动特征样本不足。
计算特征并生成每日信号
用字符串表达式描述特征与标签
可以直接使用内置的Alpha158特征集(价格、量、RSV 及截面统计共 158 个特征),标签同样写成一个表达式,并给训练段配置归一化处理器:
dataset = Alpha158(df, ("2008-01-01", "2015-12-31"), ("2016-01-01", "2019-12-31"), ("2020-01-01", "2023-12-31")) dataset.set_label("ts_mean(close / ts_delay(close, 1) - 1, 5)") dataset.add_processor("learn", process_robust_zscore_norm) dataset.prepare_data() dataset.process_data()处理器区分 infer/learn 两类任务:归一化这类依赖样本统计量的操作放在 learn 段拟合,推理段走 infer 流程,避免引入未来信息。处理完可用lab.save_dataset缓存,省去重复计算。
训练段拟合、测试段预测
在训练段拟合模型,再对测试段输出逐日信号:
model = LgbModel(seed=42) model.fit(dataset) pre = model.predict(dataset, Segment.TEST)预测结果是含日期、合约代码、信号值的 polars DataFrame,lab.save_signal("300_lgb", signal)落盘后即可被多次回测复用。
用信号数据驱动组合回测
设置目标仓位并批量调仓
BacktestingEngine按日回放历史,策略只需告诉引擎"应该持有多少"。内置EquityDemoStrategy是多空受限的轮动策略:每日按信号排序保留 top_k 只、剔除末尾 n_drop 只,持仓不足 min_days 不卖出,最后统一调仓。装配引擎与策略:
engine = BacktestingEngine(lab) engine.set_parameters(symbols, Interval.DAILY, datetime(2020, 1, 1), datetime(2023, 12, 31), capital=100_000_000) engine.add_strategy(EquityDemoStrategy, {"top_k": 30, "n_drop": 3}, signal) engine.run_backtesting()撮合委托并结算成本
委托不在发出瞬间成交,而是走cross_order限价撮合:下一根 bar 的价格区间覆盖委托价才成交。set_parameters的fill_price="vwap"可按该 bar 的 VWAP(turnover/volume)成交,更接近真实执行。手续费按合约配置long_rate/short_rate计算,持仓按当日收盘价盯市,calculate_result()汇总出逐日盈亏表。
对照基准评估超额收益与回撤
calculate_statistics()输出夏普比率、最大回撤、收益回撤比等组合指标;show_performance("000300.SSE")画基准指数超额曲线,并给出扣除累计交易成本后的超额收益及其回撤两条线,两线差距即换手成本。复盘结果时,净超额收益与换手率比毛收益更值得盯。
扩展参数优化与单因子诊断
多核并行参数优化
vnpy/trader/optimize.py提供run_bf_optimization与run_ga_optimization,前者穷举、后者基于 deap 遗传算法,评估函数返回单个标量指标即可,参数空间由OptimizationSetting.add_parameter定义,回测评估天然适合并行。
单因子分层图
单个特征未进模型前,可先调dataset.show_feature_performance(name)生成分位数分层图(IC、单调性、换手率),快速筛掉无效因子再谈组合。
第一次跑,建议先用examples/alpha_research/目录下的 notebook 配EquityDemoStrategy走通一遍日频数据,得到一整套回测输出,再替换模型或特征,对比同一回测配置下的指标变化。
【免费下载链接】vnpy基于Python的开源量化交易平台开发框架项目地址: https://gitcode.com/vnpy/vnpy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考