摘要: 本文是“从零开始搭建期货量化交易系统”系列的第六篇,也是正式收官前的最后一篇实战文章。前面五篇我们完成了策略开发与回测引擎搭建,今天将迈出最关键的一步——将策略部署到实盘。我们将详细讨论实盘前的心理与资金准备、如何通过CTP接口接入期货公司、实盘风控的核心规则(账户风险度监控、自动强平预警、每日交易报告),以及实盘日志与策略迭代的最佳实践。读完本文,你将拥有一套从回测到实盘的完整落地方案,能够安全、稳健地运行自己的期货量化策略。
大家好,我是你们的老朋友。
如果把前面五篇文章比作造一辆赛车——我们设计了引擎(策略)、测试了性能(回测)、优化了零件(因子与风控),那么今天,我们终于要把它开上真正的赛道了。
实盘与回测之间,隔着一道巨大的鸿沟。回测中完美无瑕的净值曲线,在实盘中可能因为网络延迟、流动性不足、手续费计算偏差、甚至程序崩溃而面目全非。今天这篇文章的目的,就是帮你安全地跨越这道鸿沟。
一、实盘前的心理与资金准备
在按下“启动”按钮之前,有三件事比代码更重要。
1.1 心理准备:接受回撤与连续亏损
回顾我们在第三篇中讨论的海龟策略——它依赖少数几笔大盈利来覆盖大量小额亏损。这意味着,在实盘中你可能会连续止损五六次,账户资金持续缩水。如果每次亏损后你都忍不住手动干预,策略就永远无法等到属于它的那波大行情。
一个有效的心理建设方法是:在回测报告中找到历史最大连续亏损次数和最大回撤幅度,把它们写在便利贴上,贴在屏幕旁边。 当实盘中的回撤接近历史水平时,告诉自己:“这很正常,回测中发生过更糟的情况,策略最终都回来了。”
1.2 资金准备:永远不要押上全部身家
一个残酷的事实是:大多数量化策略在实盘的前3-6个月都会遭遇不同程度的“水土不服”。可能是参数需要微调,可能是市场环境变化,也可能是一些回测中未曾预料到的细节问题。
因此,实盘初期只投入总可用资金的20%-30%,留足缓冲空间。具体来说:
- 如果总可用资金为50万元,初期只投入10-15万元。
- 杠杆控制在2倍以内(即保证金占用不超过总权益的50%)。
- 单笔交易最大亏损不超过总资金的1%-2%。
1.3 技术准备:确保系统稳定运行
量化交易是“机器替你交易”,如果机器出问题,后果不堪设想。至少需要确保:
- 程序运行环境稳定:建议使用云服务器(阿里云、腾讯云),避免用个人电脑24小时开机。
- 网络延迟可控:服务器尽量选择离期货公司机房近的地域。
- 数据源有备用方案:主数据源故障时能自动切换到备用源。
- 程序异常自动通知:出现崩溃、断网、资金不足等情况时,立即发送邮件或微信通知。
二、接入期货交易接口
中国期货市场的标准交易接口是CTP,由上海期货信息技术有限公司开发。几乎所有期货公司都支持CTP接口。
2.1 获取CTP账号与权限
在期货公司开户后,联系客户经理申请CTP接入权限。你会收到以下信息:
- BrokerID:期货公司代码
- UserID:你的交易账号
- Password:交易密码
- AppID:应用ID(部分公司需要)
- AuthCode:授权码(部分公司需要)
- 前置地址:行情和交易服务器的IP与端口
2.2 选择开发框架
直接用CTP的C++接口开发难度较大。对Python用户来说,有两个主流选择:
- vnpy:国内最成熟的开源量化交易框架,封装了CTP接口,提供完整的交易、回测、风控功能。适合中高级用户。
- openctp:轻量级的CTP Python封装,更接近底层,适合希望完全掌控代码的用户。
对于本系列的读者,我建议从vnpy开始,因为它提供了开箱即用的功能,能大大降低实盘部署的门槛。
2.3 用vnpy接入CTP的简化示例
以下是使用vnpy连接CTP并订阅行情的核心代码:
from vnpy.gateway.ctp import CtpGateway
from vnpy.event import EventEngine
# 创建事件引擎
event_engine = EventEngine()
# 创建CTP网关
ctp_gateway = CtpGateway(event_engine)
# 设置连接参数
ctp_setting = {
'用户名': 'your_user_id',
'密码': 'your_password',
'经纪商代码': 'your_broker_id',
'交易服务器': 'tcp://your_trade_server:port',
'行情服务器': 'tcp://your_market_server:port',
'产品名称': 'your_product_name',
'授权编码': 'your_auth_code',
'产品信息': 'your_app_id'
}
# 连接CTP
ctp_gateway.connect(ctp_setting)
连接成功后,你就可以通过事件驱动的方式订阅行情、下订单、接收成交回报了。
2.4 实盘与回测的信号对接
在前几篇文章中,我们的策略输出是“信号”——比如{symbol: 1}表示做多螺纹钢。实盘中,你需要把这些信号转化为实际的订单。
一个简单的对接思路是:
如果你的策略是日线级别的趋势跟踪,手动执行交易是完全可以接受的,不需要追求全自动化。
三、实盘风控的核心规则
回测中的风控是“事后检查”,实盘中的风控必须是“事前拦截”。以下三条规则是底线中的底线。
3.1 账户风险度监控
期货账户有一个关键指标叫风险度:
风险度 = 已用保证金 / 客户权益 × 100%
当风险度超过100%时,期货公司会通知追加保证金;超过一定阈值(通常是交易所保证金标准),持仓会被强制平仓。
在实盘中,应该设置一个预警线和强平线:
- 预警线:风险度超过70%时,发送通知,提醒手动减仓或追加资金。
- 强平线:风险度超过85%时,程序自动平掉部分仓位,直到风险度降至安全范围。
以下是一个简化的风险度监控函数:
def check_risk(account):
"""检查账户风险度,返回是否需要强制减仓"""
risk_ratio = account.margin_used / account.equity
if risk_ratio > 0.85:
print(f'[严重警告] 风险度 {risk_ratio:.2%},超过强平线,自动减仓!')
return 'force_close'
elif risk_ratio > 0.70:
print(f'[警告] 风险度 {risk_ratio:.2%},超过预警线,请关注!')
return 'warning'
else:
return 'safe'
3.2 自动强平预警
在第五篇的回测引擎中,我们实现了can_open方法检查开仓前资金是否充足。实盘中,这个检查必须更严格——不仅要检查开仓时的资金,还要在持仓过程中持续监控。
def auto_risk_management(account, price_dict, max_risk=0.85):
"""自动风控:当风险度超过阈值时,平掉亏损最大的仓位"""
risk = account.margin_used / account.equity
if risk < max_risk:
return
# 找出亏损最大的持仓
worst_symbol = None
worst_loss = 0
for symbol, pos in account.positions.items():
if symbol in price_dict:
current_price = price_dict[symbol]
loss = (current_price – pos['entry_price']) * pos['direction']
if loss < worst_loss:
worst_loss = loss
worst_symbol = symbol
if worst_symbol:
print(f'自动减仓:平掉{worst_symbol},亏损{worst_loss:.0f}')
# 执行平仓操作
3.3 每日交易报告
实盘运行后,你需要每天收到一份简洁的交易报告,包括:
- 当日权益与净值变化
- 当前持仓与浮动盈亏
- 当日成交明细
- 风险度与可用资金
- 策略是否正常运行
以下是一个生成文本报告的示例函数:
def daily_report(account, date):
"""生成每日交易报告"""
report = f"""
========== {date} 交易报告 ==========
当前权益:{account.equity:,.0f}
可用资金:{account.cash:,.0f}
已用保证金:{account.margin_used:,.0f}
风险度:{account.margin_used/account.equity:.2%}
当前持仓数:{len(account.positions)}
— 持仓明细 —"""
for symbol, pos in account.positions.items():
report += f'\\n{symbol}: {"多" if pos["direction"]==1 else "空"} {pos["lots"]}手, 入场价{pos["entry_price"]}'
report += '\\n=================================='
return report
你可以将这个报告通过邮件或微信推送给自己,每天花一分钟过目即可。
四、实盘日志与策略迭代
4.1 记录实盘与回测的偏差
实盘运行一个月后,你应该将实盘净值与回测同期的净值做对比。如果两者偏差超过预期范围,需要分析原因:
- 手续费和滑点:实盘是否高于回测假设?如果是,调整回测参数。
- 信号执行延迟:实盘是否因为操作延迟而错过最佳入场点?如果是,优化执行流程。
- 数据源差异:实盘使用的数据源与回测是否一致?价格偏差是否显著?
4.2 定期回顾,决定是否调整
建议每季度对策略做一次全面回顾:
- 实盘是否跑赢了无风险收益(如3%)?
- 最大回撤是否超过了历史水平?
- 因子或规则是否出现了失效迹象(参考多因子轮动系列中的因子生命周期管理)?
如果一切正常,保持运行;如果出现连续两个季度跑输基准,考虑暂停实盘,回到回测环境重新优化。
4.3 保持进化
没有任何策略能永远有效。市场结构会变化,品种的波动特性会漂移,你的策略也需要持续进化。在第七篇(总结篇)中,我们将完整梳理策略进化的方法论。
五、本篇总结
今天我们完成了从回测到实盘的关键跨越。核心要点回顾:
| 心理准备 | 接受回撤,坚持纪律 | 不手动干预策略信号 |
| 资金准备 | 初期只投入20%-30%资金 | 永不押上全部身家 |
| 接口接入 | CTP + vnpy | 确保连接稳定,有备用方案 |
| 风控规则 | 风险度监控 + 自动强平预警 | 风险度不超过85% |
| 日常监控 | 每日交易报告 + 偏差记录 | 持续跟踪实盘与回测差异 |
下一篇预告:期货交易策略系列(七)——总结与进阶学习路径
下一篇将是本系列的正式收官之作。我们将回顾整个期货量化交易系统的构建流程,梳理你已经掌握的核心技能,并给出进一步学习的方向:日内CTA、高频交易、机器学习在期货中的应用,以及值得深入阅读的书籍和资源。咱们下篇见!


