期货量化模拟盘资金曲线:天勤 get_account balance 采样记录
前言
国内期货量化策略在回测阶段,天勤TqBacktest会自动产出资金曲线;进入模拟盘阶段,程序改成TqApi(account=TqSim())或TqKq(),主循环仍是while True: api.wait_update(),均线等信号触发后TargetPosTask调仓。很多人回测报告很漂亮,模拟盘跑了两周却没有同等口径的权益记录——程序里从没把get_account().balance(账户动态权益)落盘,说不清最大回撤多少、日亏风控线有没有误触,上线只能凭感觉。
天勤get_account()的balance随每次wait_update()更新,与快期客户端权益同口径。只要在主循环里按 K 线收盘或日频采样写入 csv,就能在模拟盘画出与实盘可对照的资金曲线。下面说明采哪些字段、频率怎么定。
一、该采哪些字段
| 字段 | 用途 |
|---|---|
balance | 权益曲线纵轴 |
available | 可用资金变化 |
margin | 保证金占用 |
risk_ratio | 风险度曲线 |
float_profit | 浮盈贡献 |
commission | 成本累积 |
datetime | 横轴,用quote.datetime或本机 UTC |
同时记策略版本version、环境mode=sim/kq/live。
二、采样频率怎么定
- 日频:每个交易日收盘后采一次,对齐结算。
- intraday:每根 K 线收盘采一次,用
is_changing(klines.iloc[-1], "datetime")触发。 - 事件驱动:成交或
set_target_volume后采一次,点更密。
避免每个 tick 写盘,IO 会拖慢wait_update循环。
三、示例代码
importcsvfromdatetimeimportdatetimedefsample_equity(api,quote,path,version="v1"):acc=api.get_account()ifacc.balance!=acc.balance:returnts=quote.datetime# 纳秒,或转成可读时间row={"ts":ts,"balance":acc.balance,"available":acc.available,"margin":acc.margin,"risk_ratio":acc.risk_ratio,"commission":acc.commission,"version":version,}withopen(path,"a",newline="",encoding="utf-8")asf:w=csv.DictWriter(f,fieldnames=row.keys())iff.tell()==0:w.writeheader()w.writerow(row)主循环片段:
klines=api.get_kline_serial(SYMBOL,300,data_length=200)whileTrue:api.wait_update()ifapi.is_changing(klines.iloc[-1],"datetime"):sample_equity(api,api.get_quote(SYMBOL),"equity_sim.csv")四、画图与对比
用 pandas 读 csv,balance归一化后与TqBacktest导出的权益对比。关注最大回撤、夏普(需无风险利率自行处理)、手续费占比。模拟盘曲线若长期高于回测,检查TqSim.set_commission是否过低。
五、TqKq 与 TqSim 区别
TqKq走快期模拟环境,规则更接近柜台;TqSim本地模拟,便于批量测试。两者get_account()字段一致,曲线口径可统一,但不应与实盘曲线直接等同。
六、用 pandas 画净值
importpandasaspd df=pd.read_csv("equity_sim.csv")df["nav"]=df["balance"]/df["balance"].iloc[0]# df["nav"].plot()叠加risk_ratio子图,可看杠杆是否随净值恶化。
七、与回测曲线叠图
回测导出权益序列,与模拟盘按日期 align。偏差大于 5% 连续一周,先查 commission 与成交模式,再怀疑策略逻辑。
八、断线缺口处理
曲线中balance平直而行情在动,多半是断线未采样。重连后补点并标注gap字段,避免误判策略回撤。
九、采样策略选择
日内高频策略可用 K 线收盘采一次;日频策略用日盘结束采一次即可;多策略共账户应在同一文件用strategy_id分列,或只记账户总权益、分策略记贡献成交。无论哪种,采样时刻应固定写进交付文档,避免后人用不同频率重画曲线得出相反结论。
总结
模拟盘资金曲线不自动生成,需要程序在wait_update后采样get_account().balance等字段落盘。按 K 线收盘或日频记录,配上version与mode,就能在TqSim/TqKq阶段画出与回测可对照的权益轨迹,为是否上实盘提供第二份证据。采样别在每个 tick 写文件,以免反过来影响模拟表现。曲线本身不是目的,能解释回撤、能对上手续费、能发现断线缺口,才是模拟盘留痕的价值。
FAQ
1)balance 跳动很抖?
正常,含浮盈波动;可看日频曲线。
2)多品种共账户怎么记?
一条账户曲线即可,品种归因另记 position 快照。
3)能否用 api.get_trade 重算权益?
成交可辅助,账户以get_account为准。
4)断线后曲线缺口?
重连后补采一点,标注断线区间。
本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。
