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