先别急着选框架 想清楚这三件事
很多人一上来就问用哪个框架。这个问题没有标准答案,就像问一个厨师用哪把刀好。你得先知道自己要切什么菜,厨房有多大,手劲怎么样。
第一件事,你主要交易什么品种。股票和期货对框架的要求完全不同。股票有T+1限制,有集合竞价,有涨跌停板,数据频率通常是分钟级或者日线级。期货是T+0,有夜盘,有保证金杠杆,行情跳动快,对订单执行速度要求更高。你如果只做股票日线级别轮动,随便一个轻量框架都够用。你如果做期货日内或者高频,框架的延迟和稳定性就是命门。
第二件事,你的编程底子在哪里。如果你连Python的列表推导式都写不利索,硬上C++框架就是给自己找罪受。反过来,你如果是计算机科班出身,写过多线程和网络编程,用Python框架做高频会觉得处处受限。
第三件事,你是想自己从头造轮子,还是想站在别人肩膀上改。有人享受从零搭建的掌控感,有人只想赶紧跑通策略赚钱。前者适合用底层库自己拼,后者适合用成熟框架。

Python系框架 个人量化的主战场
对于绝大多数个人交易者,Python是性价比最高的选择。语法简单,社区活跃,回测和实盘都能覆盖。下面几个框架各有各的脾气。
vn.py 期货股票通吃的老大哥
vn.py是国内个人量化圈子里知名度最高的开源框架之一。它最大的优势是接口全。国内期货公司CTP接口、股票接口、甚至数字货币交易所接口,它都有现成的封装。你不需要自己去啃期货公司那几百页的API文档,装好环境改改配置就能连上模拟盘。
它的架构设计是事件驱动型。行情来了触发一个事件,策略收到事件做判断,发单又是一个事件。这种模式贴近真实交易节奏,做期货日内策略很顺手。
缺点是学习曲线不算平缓。你要理解它的EventEngine、MainEngine这些概念,新手直接看源码会晕。文档虽然不少,但有些地方更新不及时。社区版够用,但遇到冷门接口问题,得自己啃代码。
适合谁:想做国内期货程序化交易,愿意花一两周时间学习框架,有Python基础的人。
Backtrader 回测界的瑞士军刀
Backtrader的定位很清晰,就是做回测。它把数据加载、指标计算、订单模拟、绩效统计全部打包好了。你写一个Strategy类,在里面定义买入卖出的逻辑,跑一遍就能看到资金曲线、最大回撤、夏普比率。
它的优点是灵活。内置了一百多个技术指标,你也可以自己写。支持多数据源、多时间框架,股票期货都能回测。社区里有很多现成的策略例子,拿过来改改就能跑。
缺点是实盘接入比较麻烦。Backtrader本身不直接连国内期货接口,需要自己写broker对接。很多人用它做完回测,再换vn.py或者自己写实盘模块。另外它处理高频数据时性能一般,分钟级以下的数据跑起来会卡。
适合谁:主要精力放在策略逻辑验证上,对实盘执行要求不高,喜欢先跑通回测再说的交易者。
自己用pandas加numpy搭 最自由也最累
有些人不喜欢框架的约束,直接用pandas处理数据,numpy算指标,自己写循环模拟交易。这样做的好处是每一个细节都在自己掌控之中,没有黑箱。坏处是回测里那些坑你得自己踩一遍。
滑点怎么算,手续费怎么扣,涨跌停板成交不了怎么办,停牌怎么处理。这些细节在成熟框架里已经帮你考虑好了,自己写就要一个个填。很多人回测曲线漂亮得不行,一上实盘就亏钱,问题就出在这些细节上。
适合谁:编程能力强,喜欢完全掌控,不介意花时间造轮子的人。
C++系框架 速度与激情的代价
如果你做的是期货高频或者股票T+0,延迟要求进入毫秒甚至微秒级别,Python的解释器开销就成了瓶颈。这时候要考虑C++框架。
国内期货高频领域,很多自营团队用C++自己写交易系统。开源的C++量化框架相对少,学习门槛高,调试麻烦。你不仅要懂策略,还要懂网络编程、内存管理、多线程同步。一个指针错误可能让整个系统崩溃。
对于个人交易者,除非你本身就是C++程序员,否则不建议一上来就搞C++框架。先用Python把策略逻辑跑通,验证有稳定收益之后,再考虑用C++重写执行模块。
选框架的实操建议
第一步,用模拟盘跑通一个最简单策略。不管选哪个框架,先去期货公司开个模拟账户,拿到模拟环境的账号密码。写一个均线金叉买入、死叉卖出的策略,跑一天看看能不能正常收到行情、正常发单、正常成交。这一步能筛掉大部分环境配置问题。
第二步,用历史数据做回测。把模拟盘跑通的策略放到历史数据上回测。重点看回测的成交逻辑和实盘是否一致。有些框架回测用收盘价成交,实盘却要等下一根K线,这种偏差会让回测收益虚高。
第三步,小资金实盘验证。模拟盘和实盘的心理压力完全不同。用最小手数跑一两个月,观察滑点、手续费、成交速度对策略收益的影响。这个阶段不要想着赚钱,想着别亏太快就行。
一个简单的回测代码示例
用Backtrader写一个双均线策略,感受一下框架的写法。
import backtrader as bt
class DualMA(bt.Strategy):
params = (('fast', 5), ('slow', 20),)
def __init__(self):
self.fast_ma = bt.indicators.SMA(self.data.close, period=self.params.fast)
self.slow_ma = bt.indicators.SMA(self.data.close, period=self.params.slow)
self.crossover = bt.indicators.CrossOver(self.fast_ma, self.slow_ma)
def next(self):
if not self.position:
if self.crossover > 0:
self.buy(size=1)
elif self.crossover < 0:
self.close()
cerebro = bt.Cerebro()
cerebro.addstrategy(DualMA)
data = bt.feeds.GenericCSVData(dataname='rb_main.csv', dtformat='%Y-%m-%d', timeframe=bt.TimeFrame.Days)
cerebro.adddata(data)
cerebro.broker.setcash(100000.0)
cerebro.broker.setcommission(commission=0.0001)
cerebro.run()
print('最终资金: %.2f' % cerebro.broker.getvalue())
这段代码定义了一个策略类,在初始化时计算两条均线和一个交叉信号。next方法里判断,没有持仓且快线上穿慢线就买入,有持仓且快线下穿慢线就平仓。然后创建引擎,加载CSV数据,设置初始资金和手续费,跑出结果。
你可以把这段代码复制到本地,换一个期货品种的历史数据文件,改改均线参数,看看不同参数下的收益差别。这就是量化交易最基础的实验方式。
别在框架选择上纠结太久
框架只是工具,策略才是核心。你花一个月比较框架,别人已经用最简单的框架跑了二十个策略回测。先选一个能跑起来的,把精力放在策略逻辑和市场理解上。等你真正遇到框架解决不了的问题时,再换也不迟。
期货和股票市场的钱不好赚,框架帮不了你预测涨跌。它能做的是让你把想法快速变成代码,把代码快速变成交易,把交易结果快速统计出来。剩下的,靠你对市场的认知。