4. vn.py回测引擎初始化:创建回测引擎实例、设置回测参数、加载历史数据
好,咱们今天来聊聊回测引擎的初始化。这一步说白了,就是给我们的量化策略搭一个「试验台」。你想想看,没有这个台子,策略再好也跑不起来。
我个人习惯把回测引擎的初始化分成三个步骤:创建实例 → 设置参数 → 加载数据。这三步走完,你的策略就可以开始模拟交易了。
4.1 创建回测引擎实例
在vn.py里,回测引擎的核心类是 CtaBacktestEngine。我刚开始用的时候,以为直接 new 一个对象就行了,结果发现事情没那么简单。
核心要点:回测引擎实例是全局唯一的,不要重复创建。
来看代码:
from vnpy.app.cta_backtester import CtaBacktestEngine
# 创建引擎实例
engine = CtaBacktestEngine()
# 我个人习惯在这里设置日志级别
engine.set_log_level("INFO")
嗯,这里要注意:CtaBacktestEngine 的构造函数会自动初始化事件引擎、数据库连接等底层组件。如果你在循环里反复创建,内存会爆掉的——我曾经踩过这个坑。
4.2 设置回测参数
引擎创建好了,接下来就是「喂参数」。这一步很关键,参数设错了,回测结果就是废纸。
主要设置三个东西:
- 起始资金:你打算拿多少钱来跑策略
- 合约:交易什么品种(比如螺纹钢、沪深300)
- 周期:K线的时间粒度(1分钟、5分钟、日线等)
代码示例:
# 设置回测参数
engine.set_parameters(
start_capital=1_000_000, # 起始资金100万
contract="rb2205.SHFE", # 螺纹钢2205合约
interval="1m", # 1分钟K线
start_date="20220101", # 回测开始日期
end_date="20220331" # 回测结束日期
)
我的经验:起始资金不要设得太少。我见过有人设1万块跑螺纹钢,结果一手都开不了,回测结果全是0。建议至少覆盖合约保证金的3-5倍。
合约代码的格式是 品种代码.交易所。比如 rb2205.SHFE 代表上海期货交易所的螺纹钢2205合约。这个格式写错了,引擎会报错——我刚开始就老记混。
4.3 加载历史数据
参数设好了,但引擎里还是空的。你得把历史K线数据喂进去。vn.py支持从数据库、CSV文件、甚至网络接口加载数据。
最常用的方式是从数据库加载:
# 从数据库加载历史数据
engine.load_data(
symbol="rb2205.SHFE",
interval="1m",
start_date="20220101",
end_date="20220331"
)
如果你用的是CSV文件,可以这样:
# 从CSV文件加载
engine.load_csv_data(
file_path="./data/rb2205_1m.csv",
symbol="rb2205.SHFE",
interval="1m"
)
避坑指南:我曾经加载了3年的1分钟数据,结果内存直接爆了。建议按需加载,别贪多。一般回测3-6个月的数据就够用了。
数据加载完成后,引擎内部会做两件事:
- 把K线数据按时间排序,存到内存里
- 检查数据是否有缺失(比如某天没有数据)
如果数据有缺失,引擎会给出警告。这时候你得回去检查数据源——我遇到过好几次,数据源本身就有问题。
4.4 整体流程梳理
把上面三步串起来,完整的初始化流程是这样的:
from vnpy.app.cta_backtester import CtaBacktestEngine
# 1. 创建引擎
engine = CtaBacktestEngine()
# 2. 设置参数
engine.set_parameters(
start_capital=1_000_000,
contract="rb2205.SHFE",
interval="1m",
start_date="20220101",
end_date="20220331"
)
# 3. 加载数据
engine.load_data(
symbol="rb2205.SHFE",
interval="1m",
start_date="20220101",
end_date="20220331"
)
# 4. 加载策略(下一章会讲)
# engine.add_strategy(MyStrategy, {})
你看,其实就这几行代码。但每一步都有细节要注意。我刚开始做回测时,经常在参数设置上翻车——比如日期格式写错了,或者合约代码少了个点。
下面这张图可以帮你理清整个初始化流程:
嗯,到这里,回测引擎的初始化就完成了。你可能会问:「数据加载完了,然后呢?」别急,下一章我们会讲如何把策略挂载到引擎上,然后真正跑起来。
总结一下:
- 创建引擎实例要全局唯一
- 参数设置要准确,特别是合约代码和日期格式
- 数据加载按需进行,别贪多
- 初始化完成后,检查一下日志,确认没有警告
我个人觉得,初始化这一步虽然简单,但却是整个回测的基石。基础打好了,后面的策略开发和优化才能顺利进行。好了,今天就到这里,咱们下章见。