第七十四章 回测框架
书名:AI时代:码农的涅盘重生 作者:Flint8
第七十四章 回测框架
窗外的鹏城科技园在晨光中苏醒,高楼玻璃幕墙反射着金色的阳光。林晨坐在书桌前,屏幕上不是股票行情,而是一行行 python 代码。
昨晚测试完情绪指标模型后,一个问题像根刺一样扎在他心里——回测。
他用的那些量化平台提供的回测功能,总觉得哪里不对劲。手续费计算太粗糙,滑点模拟不真实,最关键的是,无法同时对比多个策略在完全相同条件下的表现。
“代码可以骗人,但逻辑不会”。林晨喃喃自语,这是他这段时间形成的口头禅。
他决定自己写一个。
上午九点,送完乐乐去幼儿园的苏婉轻轻推开书房门,看到丈夫正对着白板画架构图。白板上已经写满了模块名称:数据
“又要开新项目”?苏婉端着温水进来。
林晨接过水杯,眼睛还盯着白板:“得有个靠谱的回测框架。那些平台的回测,就像用尺子量空气——看起来有模有样,实际误差大到能坑死人”。
“需要多久”?
“三五天吧”。林晨喝了口水,“这次得写扎实点,以后所有策略都基于这个框架测试,相当于给自己建个实验室”。
苏婉点点头,没多问技术细节,只是轻声说:“别太拼,中午记得吃饭”。
书房门轻轻关上。林晨重新面对白板,思维像手术刀一样精准地解剖问题。
回测的核心是什么?
是模拟真实交易环境。但“真实”二
林晨在“交易层”模块下又画出几个子模块。每细化一层,他就更清楚那些量化平台的回测为什么不可信——它们做了太多理想化假设。
“从今天起,我的系统里没有‘理想’二字”。林晨对着空荡荡的房间说。
他打开 VS code,新建项目文件夹:quantbacktestFramework。创建 REAdmE
“一个尽可能逼近 A 股真实交易环境的回测框架,支持多策略并行对比,可视化分析,为实盘提供可靠依据”。
接下来的三天,林晨进入了心流状态。
早晨七点起床,八点开始编码,中午简单吃个外卖,下午继续,晚上陪家人两小时,九点后又回到电脑前。这种节奏让他想起刚毕业那会儿在鹏城加班赶项目的日子,但心境完全不同——那时是被迫,现在是主动;那时为别人写代码,现在为自己建系统。
第一天,数据层。
他设计了一个统一的数据接口,支持从本地 cSV 文件、数据库、甚至在线 ApI 获取历史数据。数据必须包含最基本的 ohLcV(开盘、最高、最低、收盘、成交量),还要能扩展自定义字段——比如他之前做的情绪指标。
关键点在于处理 A 股的特殊性:除权除息。如果回测时忽略这个,收益率计算会严重失真。林晨写了个复权因子计算模块,确保价格序列连续可比。
“这就对了”。他测试了几只股票,看着复权后的 K 线图平滑连贯,满意地点点头。
第二天,策略层。
这是框架的核心。林晨设计了策略基类 baseStrategy,所有具体策略都必须继承这个类,实现几个关键方法:i
为了让多策略对比成为可能,他引入了策略组合的概念。可以同时加载三个、五个甚至十个策略,在完全相同的时间序列、相同的初始资金、相同的交易规则下运行。
“让我看看,到底是双均线策略厉害,还是我的情绪增强模型更强”。林晨写测试代码时,嘴角微微上扬。
第三天,交易层与评估层。
这是最繁琐的部分。林晨几乎翻遍了 A 股交易规则文档。
佣金:他按万分之二点五计算(这是他能找到的较低费率),单笔最低 5 元。
滑点模拟:他设置了三种模式——固定滑点(如
涨跌停限制:买入时如果信号触发涨停价,实际无法成交;卖出时跌停同理。
。这个规则对短线策略影响巨大。
林晨把这些规则一个个编码实现,每写完一个模块就测试几种边界情况。过程中他发现不少量
“怪不得回测收益看着很美,实盘就漏水”。他摇头苦笑。
评估层相对简单些,但指标必须全面。年化收益率、夏普比率、最大回撤、胜率、盈亏比、交易次数、持仓周期、资金曲线……林晨参考了专业量化基金的评估体系,设计了二十多个关键指标。
第四天,可视化层。
这是给“用户体验”的。林晨用 matplotlib 和 pyecharts 结合,开发了一套可视化面板。
运行回测后,会
资金曲线对比图——多个策略的资金曲线叠加显示,一眼看出孰优孰劣。
收益分布直方图——看盈利交易和亏损交易的分布情况。
月度收益热力图——哪个月份策略表现好,哪个月份差,颜色深浅一目了然。
回撤曲线——最大回撤发生在什么时候,持续了多久。
持仓分析——平均持仓时间、仓位利用率等。
交易明细表格——每笔交易的时间、价格、数量、盈亏都可追溯。
林晨特意把界面做得简洁专业,没有花哨的动画,但信息密度很高。这是他做了十年后端开发的审美——功能至上,清晰第一。
第五天下午,框架基本成型。
林晨深吸一口气,准备进行第一次完整测试。他选择了三只股票:贵州茅台、宁德时代、比亚迪,时间范围是 2020 年 1 月 1 日到 2023 年 12 月 31 日,整整四年。
策略 c:最新的情绪指标增强模型。
初始资金都设为 10 万元,交易规则完全一致。
点击运行。
屏幕上代码滚动,进度条缓慢推进。林晨起身倒了杯水,站在窗前看着科技园里穿梭的人群。那些穿着格子衫的程序员,那些行色匆匆的白领,他们中有多少人也在寻找出路?
二十分钟后,运行完成。
浏览器自动弹出回测报告页面。林晨坐回椅子上,屏住呼吸看向屏幕。
资金曲线对比图上,三
策略 A(双均线)的曲线在 2021 年之前缓慢上升,之后开始震荡,最终
策略 c(情绪增强模型)的曲线最漂亮——前期平稳上升,2022 年市场大跌时回撤明显小于前两个策略,2023 年快速修复并创新高,最终
“漂亮”。林晨忍不住出声。
更关键的是风险指标。策略 c
月度收益热力图上,策略 c 的绿色(正收益)月份明显多于红色。交易明细显示,策略 c 四年只交易了 47 次,平均持仓周期 21 天;策略 b 交易了 112 次,策略 A 更是高达 189 次。
“频率越低,质量越高”。林晨记下这个观察。
但真正让他警醒的是另一个发现。
他把回测时间缩短到最近一年(2023 年),重新运行。
结果变了。
“市场风格变了。”林晨盯着屏幕,“2020—2022 年的逻辑,到 2023 年不完全适用。”
这就是回测的陷阱——过去表现好,不代表未来持续好。但他的框架至少能帮他看清这个陷阱,而不是美化它。
林晨又做了几个测试:更改手续费率、调整滑点设置、加入冲击成本模拟……每次更改,收益率都会下降几个百分点。
。”他得
傍晚六点,苏婉敲门叫他吃饭。
餐桌上,林晨难得地主动谈起技术细节:“我今天把回测框架写完了”。
“测试了吗”?
“测了。
苏婉眼睛一亮:“那很好啊”。
“但那是回测”。而且市场在变,策略得持续优化”。
”。苏婉认真地说,“那些凭感觉炒股的人,连回测是什么都不知道”。
林晨笑了笑,心里却清楚:专业只是门槛。在这个市场上,专业的人很多,能持续盈利的很少。
晚饭后,他回到书房,没有继续编码,而是打开了一个空白文档。
文档标题:《回测与实盘的差距分析》。
过度拟
每写一条,他就思考如何在框架中防范或标记。
写到第十条时,窗外已是深夜。科技园的灯光依然璀璨,但林晨书房的台灯,是这片璀璨中一个安静的光点。
他保存文档,关掉电脑,走到阳台。
晚风带着鹏城湾的潮湿气息扑面而来。远处,深圳湾大桥的灯光连成一条金色的线,横跨在黑暗的海面上。
林晨想起这几个月走过的路:从被裁员时的茫然,到自学 AI 的挣扎,再到开发投资系统的专注。每一步都踩在现实的荆棘上,但每一步都让他更接近真相。
回测框架完成了,但这只是个开始。
真正的挑战,永远是下一个交易日、下一个决策、下一个未知。
他深吸一口气,夜风灌满胸腔。
明天,该用这个框架测试更多策略了。然后,选择一个,投入实盘。
那将是代码与现实的第一次正面交锋。