前言

国内期货量化程序跑在天勤 TqSdk 上时,风控和复盘都要读账户与持仓:主循环 wait_update() 之后,api.get_account() 给出资金账户(权益 balance、可用 available、风险度 risk_ratio 等),api.get_position("SHFE.rb2510") 给出各合约持仓与盈亏。有人用 balance 画资金曲线,又把各品种 float_profit 简单相加去核对,结果差几百块,怀疑程序算错。

其实国内期货盈亏口径有多层:持仓 float_profit 相对开仓价,账户 position_profit 相对昨结算,账户 balance 还叠了手续费、出入金。天勤在 objs.py 里把这些字段完整暴露,关键是同一帧 wait_update 后读对字段。下面做账户层与持仓层对照说明。

一、账户层字段(get_account)

字段 文档含义 核对用途
balance 账户权益(动态权益) 资金曲线主指标
available 可用资金 开仓前检查
float_profit 浮动盈亏 账户汇总浮盈
position_profit 持仓盈亏(相对昨结算) 与结算单对照
close_profit 当日平仓盈亏 日内已实现
commission 当日手续费 扣减项
margin 保证金占用 风险度计算
risk_ratio 保证金/权益 风控
pre_balance 昨日权益 日初基准
deposit / withdraw 当日出入金 调账必看

risk_ratio 定义为 margin / balance,接近 1 时加仓空间很小。

二、持仓层字段(get_position)

字段 含义 注意
float_profit 相对开仓价的浮动盈亏 多空合并净额
float_profit_long / _short 分方向浮盈 对冲持仓
position_profit 相对昨结算的持仓盈亏 期权持仓为 0
open_price_long / open_price_short 开仓均价 估算用
pos 净持仓 手数正负

单品种浮盈之和一般不等于账户 float_profit,因为账户层还含未分摊到合约的费用、期权市值等;更可靠的是用 balance 与昨日 pre_balance、出入金、已实现盈亏做恒等式检查。

三、推荐核对公式(日内)

wait_update() 之后同一帧:

acc = api.get_account()
# 理论权益变化 ≈ 持仓盈亏 + 平仓盈亏 - 手续费 + 出入金净额(示意)
delta = acc.balance - acc.pre_balance
rough = acc.position_profit + acc.close_profit - acc.commission + acc.deposit - acc.withdraw

roughdelta 差距大时,查是否有出入金未记、或读账户太早(回报未到)。不要用手工累加各合约 float_profit 直接对比 balance 日间变化。

四、程序里怎么用

  • 风控止损:用 balancerisk_ratio,别用单合约 float_profit 代表全账户。
  • 品种归因:用各 position.position_profitfloat_profit 做贡献分析,但要标注口径。
  • 日志快照:日终记 balancemargincommission、每品种 posposition_profit
def snapshot_account(api, logger):
    api.wait_update()
    acc = api.get_account()
    logger.info(
        "acct balance=%.2f avail=%.2f margin=%.2f risk=%.4f comm=%.2f",
        acc.balance, acc.available, acc.margin, acc.risk_ratio, acc.commission,
    )

五、与快期客户端对照

快期 APP 显示的权益应与 balance 接近;若 persistent 偏差,查是否多账户读错、是否 TqMultiAccount 未指定 account。模拟盘 TqSim 字段含义与实盘一致,适合练核对流程。

六、分品种盈亏汇总示例

日终对每个交易 symbolget_position,记 position_profitfloat_profit,加总后与账户 position_profit 对比(允许小误差)。若某品种 pos==0position_profit 非零,可能是当日已平完仓的实现盈亏仍在账户汇总里,属正常。

七、风控线用哪个字段

日亏停策略应基于 balance 相对日初 pre_balance 的变化,或 close_profit + position_profit - commission 的组合,不要用单合约 float_profit 触发全账户 emergency。risk_ratio 接近 1 时,available 可能已不足以开新仓,即使 float_profit 看起来还行。

八、日志快照模板

def log_eod(api, symbols, logger):
    api.wait_update()
    acc = api.get_account()
    logger.info("eod balance=%.2f pos_pnl=%.2f close_pnl=%.2f comm=%.2f",
                acc.balance, acc.position_profit, acc.close_profit, acc.commission)
    for s in symbols:
        p = api.get_position(s)
        logger.info("eod %s pos=%s float_pnl=%.2f pos_pnl=%.2f",
                    s, p.pos, p.float_profit, p.position_profit)

总结

浮动盈亏对不上账,多半是口径混用:持仓 float_profit 相对开仓价,账户 position_profit 相对昨结算,balance 又叠了手续费和出入金。天勤把这些字段完整暴露,程序化核对应在同一帧 wait_update 后读 get_accountget_position,用权益恒等式而不是简单加总单合约浮盈。把字段含义写进策略日志注释,日后和期货公司结算单逐行对照会省很多时间。

FAQ

1)float_profit 和 position_profit 差很多?

隔夜持仓后很正常,结算价变了基准。

2)balance 为 nan?

刚连接尚未收到首包账户数据,多等几帧 wait_update

3)多策略共账户怎么分盈亏?

天勤不按策略拆分,需自己按成交日志归因。

4)TqSim 手续费在哪?

account.commissionTqSim.set_commission 设置。


本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐