第74章 回测框架(1/2)
窗外的鹏城科技园在晨光中苏醒,高楼玻璃幕墙反射着金色的阳光。林晨坐在书桌前,屏幕上不是股票行情,而是一行行Python代码。
昨晚测试完情绪指标模型后,一个问题像根刺一样扎在他心里——回测。
他用的那些量化平台提供的回测功能,总觉得哪里不对劲。手续费计算太粗糙,滑点模拟不真实,最关键的是,无法同时对比多个策略在完全相同条件下的表现。
“代码可以骗人,但逻辑不会”。林晨喃喃自语,这是他这段时间形成的口头禅。
他决定自己写一个。
上午九点,送完乐乐去幼儿园的苏婉轻轻推开书房门,看到丈夫正对着白板画架构图。白板上已经写满了模块名称:数据层、策略层、交易层、评估层、可视化层……
“又要开新项目”?苏婉端着温水进来。
林晨接过水杯,眼睛还盯着白板:“得有个靠谱的回测框架。那些平台的回测,就像用尺子量空气——看起来有模有样,实际误差大到能坑死人”。
“需要多久”?
“三五天吧”。林晨喝了口水,“这次得写扎实点,以后所有策略都基于这个框架测试,相当于给自己建个实验室”。
苏婉点点头,没多问技术细节,只是轻声说:“别太拼,中午记得吃饭”。
书房门轻轻关上。林晨重新面对白板,思维像手术刀一样精准地解剖问题。
回测的核心是什么?
是模拟真实交易环境。但“真实”二字包含无数细节:交易时间、涨跌停限制、T+1制度、手续费(印花税、佣金、过户费)、滑点(报价与实际成交价的偏差)、资金利用率、分批建仓的冲击成本……
林晨在“交易层”模块下又画出几个子模块。每细化一层,他就更清楚那些量化平台的回测为什么不可信——它们做了太多理想化假设。
“从今天起,我的系统里没有‘理想’二字”。林晨对着空荡荡的房间说。
他打开VSCode,新建项目文件夹:QuantBacktestFrawork。创建README.d文件时,他在第一行写下项目目标:
“一个尽可能逼近A股真实交易环境的回测框架,支持多策略并行对比,可视化分析,为实盘提供可靠依据”。
接下来的三天,林晨进入了心流状态。
早晨七点起床,八点开始编码,中午简单吃个外卖,下午继续,晚上陪家人两小时,九点后又回到电脑前。这种节奏让他想起刚毕业那会儿在鹏城加班赶项目的日子,但心境完全不同——那时是被迫,现在是主动;那时为别人写代码,现在为自己建系统。
第一天,数据层。
他设计了一个统一的数据接口,支持从本地CSV文件、数据库、甚至在线API获取历史数据。数据必须包含最基本的OHLCV(开盘、最高、最低、收盘、成交量),还要能扩展自定义字段——比如他之前做的情绪指标。
关键点在于处理A股的特殊性:除权除息。如果回测时忽略这个,收益率计算会严重失真。林晨写了个复权因子计算模块,确保价格序列连续可比。
“这就对了”。他测试了几只股票,看着复权后的K线图平滑连贯,满意地点点头。
第二天,策略层。
这是框架的核心。林晨设计了策略基类BaseStrategy,所有具体策略都必须继承这个类,实现几个关键方法:itialize初始化,handle_bar处理每个交易日的数据,gee_signal生成交易信号。
为了让多策略对比成为可能,他引入了策略组合的概念。可以同时加载三个、五个甚至十个策略,在完全相同的时间序列、相同的初始资金、相同的交易规则下运行。
“让我看看,到底是双均线策略厉害,还是我的情绪增强模型更强”。林晨写测试代码时,嘴角微微上扬。
第三天,交易层与评估层。
这是最繁琐的部分。林晨几乎翻遍了A股交易规则文档。
印花税:卖出时收取成交金额的0.1%。
佣金:他按万分之二点五计算(这是他能找到的较低费率),单笔最低5元。
过户费:沪市股票成交金额的0.002%,深市免收。
滑点模拟:他设置了三种模式——固定滑点(如0.01元)、百分比滑点(如0.1%)、以及基于成交量的动态滑点(流动性差的股票滑点更大)。
涨跌停限制:买入时如果信号触发涨停价,实际无法成交;卖出时跌停同理。
T+1制度:今天买入的股票,明天才能卖出。这个规则对短线策略影响巨大。
林晨把这些规则一个个编码实现,每写完一个模块就测试几种边界情况。过程中他发现不少量化平台的回测漏洞——有些平台居然允许T+0交易,有些忽略涨跌停,有些手续费计算简化到可笑的程度。
“怪不得回测收益看着很美,实盘就漏水”。他摇头苦笑。
评估层相对简单些,但指标必须全面。年化收益率、夏普比率、最大回撤、胜率、盈亏比、交易次数、持仓周期、资金曲线……林晨参考了专业量化基金的评估体系,设计了二十多个关键指标。
第四天,可视化层。
这是给“用户体验”的。林晨用atplotlib和pyecharts结合,开发了一套可视化面板。
运行回测后,会自动生成一个HTML报告页面,包含:
资金曲线对比图——多个策略的资金曲线叠加显示,一眼看出孰优孰劣。
收益分布直方图——看盈利交易和亏损交易的分布情况。
月度收益热力图——哪个月份策略表现好,哪个月份差,颜色深浅一目了然。
回撤曲线——最大回撤发生在什么时候,持续了多久。
持仓分析——平均持仓时间、仓位利用率等。
交易明细表格——每笔交易的时间、价格、数量、盈亏都可追溯。
林晨特意把界面做得简洁专业,没有花哨的动画,但信息密度很高。这是他做了十年后端开发的审美——功能至上,清晰第一。
第五天下午,框架基本成型。
林晨深吸一口气,准备进行第一次完整测试。他选择了三只股票:贵州茅台、宁德时代、比亚迪,时间范围是2020年1月1日到2023年12月31日,整整四年。
加载三个策略:
本章未完,点击下一页继续阅读。