跳转到内容

账户值字段 key

updateAccountValue(key, val, currency, accountName) 里的 key 是账户字段名。它决定了 val 应该怎么解释:有些是金额,有些是比例,有些是文本状态,还有一些是按币种拆分的 Ledger 字段。

写账户面板、资金检查或风控提示时,不要只保存 key -> val。更稳妥的唯一键是:

(accountName, key, currency)

这样可以避免同一个字段在不同币种、不同账户或不同账户分段里互相覆盖。

官方文档把账户值 key 分成三类:

key 形式中文含义例子
无后缀总计口径NetLiquidationAvailableFunds
-SSecurities,证券分段NetLiquidation-SAvailableFunds-S
-CCommodities,商品分段NetLiquidation-CAvailableFunds-C

实际 TWS 版本和账户类型还可能返回其他扩展后缀,例如这次验证里出现了 -P。程序不要因为没见过某个后缀就丢弃字段;建议保留原始 key,同时把已知后缀解析成更友好的显示名称。

def split_account_value_key(key):
if key.endswith("-S"):
return key[:-2], "证券分段"
if key.endswith("-C"):
return key[:-2], "商品分段"
if key.endswith("-P"):
return key[:-2], "TWS 扩展分段"
return key, "总计或未分段"
key中文含义说明
AccountCode账户代码真实账户号,公开输出必须脱敏。
AccountType账户类型例如模拟、现金、保证金等账户类型信息,按实际返回为准。
AccountReady账户是否就绪官方提醒:如果返回 false,表示 IB 服务器可能正在重置账户数据,这批值之后的数据可能过期或不准确。
ColumnPrioTWS 账户窗口列优先级多用于 TWS 展示,不常作为交易逻辑判断。
SegmentTitle账户分段标题常和 -S-C 等分段字段一起出现。
TradingType交易类型/分段类型可能随账户结构返回,不建议写死枚举。
WhatIfPMEnabled是否启用组合保证金 What-If 相关能力用于判断部分保证金预估能力。
NLVAndMarginInReview净清算值与保证金是否复核中如果为复核状态,账户风控展示要更谨慎。

AccountReady 是这一组里最值得重点处理的字段。新手容易只看金额字段,但当 AccountReady=false 时,后面的金额字段可能并不适合直接用于下单前判断。

key中文含义常见用途
NetLiquidation净清算值账户总权益核心字段之一。
TotalCashValue总现金价值观察现金余额。
SettledCashByDate按日期结算的现金结算资金相关展示。
AccruedCash应计现金利息、费用等应计现金口径。
AccruedDividend应计股息股息相关应计值。
EquityWithLoanValue含借贷价值的权益保证金账户常用权益口径。
GrossPositionValue总持仓市值观察持仓规模。
PASharesValue投资组合分析股份价值账户窗口可能返回的组合分析相关值。

这些字段很多都会出现无后缀、-S-C 或其他扩展后缀。展示时最好把“总计”和“证券/商品分段”分开,不要把它们直接加总。

key中文含义常见用途
BuyingPower购买力粗略判断账户还能买入多少保证金证券。
AvailableFunds可用资金下单前资金余量检查常用字段。
ExcessLiquidity超额流动性保证金压力观察,过低时要警惕。
Cushion安全垫比例通常用于观察账户离保证金压力的距离。
InitMarginReq初始保证金要求该口径下开仓需要的初始保证金。
MaintMarginReq维持保证金要求持仓需要维持的保证金。
SMASpecial Memorandum Account美股保证金账户常见字段。
RegTEquityReg T 权益Reg T 保证金口径相关。
RegTMarginReg T 保证金Reg T 保证金要求相关。
FullInitMarginReq完整口径初始保证金要求完整保证金口径下的初始保证金。
FullMaintMarginReq完整口径维持保证金要求完整保证金口径下的维持保证金。
FullAvailableFunds完整口径可用资金完整保证金口径下的可用资金。
FullExcessLiquidity完整口径超额流动性完整保证金口径下的超额流动性。

下单前不要只看一个字段。更稳妥的做法是同时观察 AvailableFundsExcessLiquidityBuyingPower、订单预检查和真实订单回调。

key中文含义说明
LookAheadNextChange下一次前瞻值生效时间未来保证金口径发生变化的时间。
LookAheadInitMarginReq前瞻初始保证金要求未来口径下的初始保证金要求。
LookAheadMaintMarginReq前瞻维持保证金要求未来口径下的维持保证金要求。
LookAheadAvailableFunds前瞻可用资金未来口径下的可用资金。
LookAheadExcessLiquidity前瞻超额流动性未来口径下的超额流动性。

这些字段适合做风险提示,不适合单独作为“能不能下单”的最终判断。

$LEDGER- 开头的字段通常表示按币种或账户账本口径拆分的值。常见 Ledger key 包括:

key中文含义
$LEDGER-AccountOrGroup账本对应的账户或分组
$LEDGER-Currency账本币种
$LEDGER-RealCurrency真实币种
$LEDGER-ExchangeRate汇率
$LEDGER-CashBalance现金余额
$LEDGER-TotalCashBalance总现金余额
$LEDGER-AccruedCash应计现金
$LEDGER-FxCashBalance外汇现金余额
$LEDGER-NetLiquidationByCurrency按币种计算的净清算值
$LEDGER-StockMarketValue股票市值
$LEDGER-OptionMarketValue期权市值
$LEDGER-FutureOptionValue期货期权价值
$LEDGER-FundValue基金价值
$LEDGER-MutualFundValue共同基金价值
$LEDGER-MoneyMarketFundValue货币市场基金价值
$LEDGER-CorporateBondValue公司债价值
$LEDGER-TBillValue国库券价值
$LEDGER-TBondValue国债价值
$LEDGER-WarrantValue权证价值
$LEDGER-Cryptocurrency加密货币价值
$LEDGER-RealizedPnL已实现盈亏
$LEDGER-UnrealizedPnL未实现盈亏
$LEDGER-FuturesPNL期货盈亏
$LEDGER-NetDividend净股息

Ledger 字段经常和 currency 一起使用。保存时不要只用 $LEDGER-CashBalance 当唯一键,否则不同币种的现金余额可能互相覆盖。

key中文含义说明
Billable可计费值账户窗口相关字段,是否有用取决于账户类型。
Guarantee担保/保证相关值常见于账户窗口分段字段。
IndianStockHaircut印度股票折扣/扣减特定市场或账户场景才可能有意义。
IncentiveCoupons激励券特定账户活动或优惠相关。
PhysicalCertificateValue实物凭证价值很少用于自动交易判断。
PostExpirationExcess到期后超额流动性衍生品到期相关风险字段。
PostExpirationMargin到期后保证金衍生品到期相关保证金字段。
TotalDebitCardPendingCharges借记卡待处理费用账户资金相关辅助字段。
Leverage杠杆可能以分段后缀出现。

这些字段不一定每个账户都会返回。程序应该按“看到什么 key 就保存什么 key”设计,而不是假设字段全集固定。

下面示例订阅一次账户更新,只统计 updateAccountValue() 里的 key、币种和类型,不打印真实金额。

import threading
from collections import Counter
from decimal import Decimal, InvalidOperation
from ibapi.client import EClient
from ibapi.wrapper import EWrapper
INFO_CODES = {2100, 2104, 2106, 2158}
class AccountValueKeysApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
self.ready = threading.Event()
self.managed_ready = threading.Event()
self.download_end = threading.Event()
self.managed_accounts = []
self.rows = []
self.errors_seen = []
def nextValidId(self, orderId):
self.ready.set()
def managedAccounts(self, accountsList):
self.managed_accounts = [item for item in accountsList.split(",") if item]
self.managed_ready.set()
def updateAccountValue(self, key, val, currency, accountName):
value_type = "empty"
if val:
try:
Decimal(val)
value_type = "decimal"
except InvalidOperation:
value_type = "text"
self.rows.append((key, currency or "EMPTY", value_type))
def accountDownloadEnd(self, accountName):
self.download_end.set()
def error(self, reqId, errorTime, errorCode, errorString, advancedOrderRejectJson=""):
if errorCode not in INFO_CODES:
self.errors_seen.append((reqId, errorCode, errorString))
app = AccountValueKeysApp()
try:
app.connect("127.0.0.1", 7497, clientId=972)
thread = threading.Thread(target=app.run, daemon=True)
thread.start()
if not app.ready.wait(8):
raise RuntimeError("等待 nextValidId 超时")
app.reqManagedAccts()
if not app.managed_ready.wait(8):
raise RuntimeError("等待 managedAccounts 超时")
account = app.managed_accounts[0]
app.reqAccountUpdates(True, account)
if not app.download_end.wait(8):
raise RuntimeError("等待 accountDownloadEnd 超时")
app.reqAccountUpdates(False, account)
finally:
if app.isConnected():
app.disconnect()
keys = sorted(set(key for key, _, _ in app.rows))
currency_counts = Counter(currency for _, currency, _ in app.rows)
type_counts = Counter(value_type for _, _, value_type in app.rows)
print(f"ROW_COUNT={len(app.rows)}")
print(f"UNIQUE_KEY_COUNT={len(keys)}")
print("CURRENCIES=" + ",".join(f"{key}:{value}" for key, value in sorted(currency_counts.items())))
print("VALUE_TYPES=" + ",".join(f"{key}:{value}" for key, value in sorted(type_counts.items())))
print("LEDGER_KEY_COUNT=" + str(sum(1 for key in keys if key.startswith("$LEDGER-"))))
print("NON_INFO_ERROR_COUNT=" + str(len(app.errors_seen)))

使用 TWS 模拟账户检查时,脱敏后的输出如下:

ROW_COUNT=183
UNIQUE_KEY_COUNT=158
CURRENCIES=BASE:25,EMPTY:19,USD:139
VALUE_TYPES=decimal:164,text:19
LEDGER_KEY_COUNT=25
NON_INFO_ERROR_COUNT=0

这次验证里,updateAccountValue() 返回 183 行、158 个去重 key。其中 25 个 key 以 $LEDGER- 开头,说明账户更新流不仅返回普通账户窗口字段,也会返回按账本或币种拆分的字段。

问题建议
同一个字段有多个币种(accountName, key, currency) 保存。
key 带 -S-C按证券分段、商品分段展示,不要和总计字段混在一起。
key 带未识别后缀保留原始 key,先展示为扩展分段,不要丢弃。
val 是数字字符串Decimal 解析,不建议用 float 做资金计算。
val 是文本原样保存,例如账户类型、状态、币种等。
AccountReady=false不要立即用这批金额做下单判断,等待账户数据恢复稳定。

IBKR Campus: TWS API Documentation