前言
“用 Python 写期货自动交易程序”在国内通常指:用 Python 连接期货行情与交易接口,在螺纹钢、股指、原油等国内期货合约上,按你的规则自动下单、跟踪成交、管理持仓。读者可能是交易员转程序化,也可能是程序员刚接触期货,尚未开户或尚未区分“研究回测”和“实盘循环”。
本文不给空泛架构图,而是给出能跑通的最小框架(基于天勤TqSdk),并解释每一块在期货场景里解决什么问题:TqApi是什么、get_kline_serial和datetime从哪来、wait_update为何不能省、TargetPosTask与手写报单如何选。你可以先照搬骨架,再替换自己的信号。
一、五块骨架(期货程序化通用)
| 模块 | 在期货场景里干什么 | 天勤常见入口 |
|---|---|---|
| 环境 | 连模拟或实盘、认证 | TqApi(TqSim()/TqKq()/TqAccount(...), auth=TqAuth(...)) |
| 数据 | 订合约行情、K 线 | get_quote,get_kline_serial |
| 循环 | 等数据更新 | wait_update() |
| 触发 | 何时算信号 | is_changing(kl.iloc[-1], "datetime")等 |
| 执行/核对 | 下单、对账 | TargetPosTask或insert_order;get_position |
期货与日股不同:有夜盘、保证金、平今平昨、合约到期换月,所以执行与核对模块在国内尤其不能省。
二、最小可运行示例(带注释说明)
fromtqsdkimportTqApi,TqAuth,TqSim,tafuncfromtqsdk.libimportTargetPosTask# 1)环境:TqSim 为进程内模拟,适合第一次联调api=TqApi(TqSim(),auth=TqAuth("快期账户","密码"))symbol="SHFE.rb2510"# 2)数据:60 秒周期 K 线,data_length 要大于均线周期kl=api.get_kline_serial(symbol,60,data_length=200)task=TargetPosTask(api,symbol)try:whileTrue:api.wait_update()# 3)循环:收包并更新 kl 表(含 datetime 列)ifnotapi.is_changing(kl.iloc[-1],"datetime"):continue# 4)触发:仅在新 K 线时进入ma5=tafunc.ma(kl.close,5)ma20=tafunc.ma(kl.close,20)ifma5.iloc[-2]>ma20.iloc[-2]:task.set_target_volume(1)# 5)执行:目标净仓 1 手elifma5.iloc[-2]<ma20.iloc[-2]:task.set_target_volume(-1)else:task.set_target_volume(0)exceptKeyboardInterrupt:passfinally:api.close()读这段时请关注:datetime来自 K 线表,由行情服务更新;[-2]是上一根已收盘 bar;set_target_volume之后循环仍要继续,task 才能在后续 wait_update 里发单。
三、文件如何随策略变复杂而拆分
config.py:合约列表、K 线周期秒数、手数、MODE(sim/kq/live)signals.py:输入kl,输出目标手数,不要在里面创建 TqApimain.py:make_api()+ 循环 +close()
换模拟/实盘只改环境层,避免三份策略拷贝。
四、第一步建议做什么
安装 TqSdk、注册快期账户、跑通上面脚本直到能打印 K 线datetime推进。再改均线参数、加交易时段过滤、换TqKq在 APP 里对持仓。不要第一天就接实盘。
五、常见误区
- 没有
wait_update就insert_order(数据截面可能是旧的) - 没有
datetime过滤,每个 tick 算均线 - 进程结束不
close(),下次连接异常
总结
想用 Python 写国内期货自动交易程序,从五块骨架入手:环境、订阅、wait_update 循环、按 K 线datetime触发、TargetPosTask 执行与 position 核对。天勤把行情表、交易对象放在同一 API 下,适合个人从模拟过渡到实盘。
先跑通最小示例,再拆文件、加风控;比一上来就接 CTP 回调更符合多数人的学习曲线。
FAQ
1)要先学 CTP 吗?
可先会用天勤 API,拒单与规则遇问题再补。
2)能否只做行情不下单?
可以只订 quote/kl,但自动交易必须接交易单元。
3)多策略如何部署?
一策略一进程一 Api,同账户避免多进程抢单。
4)回测?
TqApi(backtest=TqBacktest(...)),结束捕获BacktestFinished。
风险提示
本文用于入门结构说明,不构成投资建议。