期货量化浮动盈亏对不上账:position 与 get_account 字段对照
前言
国内期货量化程序跑在天勤 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
rough 与 delta 差距大时,查是否有出入金未记、或读账户太早(回报未到)。不要用手工累加各合约 float_profit 直接对比 balance 日间变化。
四、程序里怎么用
- 风控止损:用
balance或risk_ratio,别用单合约float_profit代表全账户。 - 品种归因:用各
position.position_profit或float_profit做贡献分析,但要标注口径。 - 日志快照:日终记
balance、margin、commission、每品种pos与position_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 字段含义与实盘一致,适合练核对流程。
六、分品种盈亏汇总示例
日终对每个交易 symbol 读 get_position,记 position_profit 与 float_profit,加总后与账户 position_profit 对比(允许小误差)。若某品种 pos==0 但 position_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_account 与 get_position,用权益恒等式而不是简单加总单合约浮盈。把字段含义写进策略日志注释,日后和期货公司结算单逐行对照会省很多时间。
FAQ
1)float_profit 和 position_profit 差很多?
隔夜持仓后很正常,结算价变了基准。
2)balance 为 nan?
刚连接尚未收到首包账户数据,多等几帧 wait_update。
3)多策略共账户怎么分盈亏?
天勤不按策略拆分,需自己按成交日志归因。
4)TqSim 手续费在哪?
看 account.commission 与 TqSim.set_commission 设置。
本文基于天勤 TqSdk 公开 API 整理,不构成投资建议。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)