跳转到内容

账户摘要

get_account_summary() 用来读取 TWS 账户窗口中“Summary / 摘要”一类的数据,例如账户类型、净清算值、现金、购买力、可用资金和剩余流动性。它对应原始 TWS API 的:

reqAccountSummary(reqId, groupName, tags)
-> accountSummary(reqId, account, tag, value, currency)
-> accountSummaryEnd(reqId)
cancelAccountSummary(reqId)

同步封装会帮你等待 accountSummaryEnd(),并在收到完整结果后自动调用 cancelAccountSummary(reqId) 取消订阅。

官方 Python API 包中的定义如下:

def get_account_summary(self, tags, group="All", timeout=5):
req_id = self.get_next_valid_id()
self.reqAccountSummary(req_id, group, tags)
summary = self._wait_for_response(req_id, "account_summary", timeout)
self.cancelAccountSummary(req_id)
return summary

参数说明:

参数含义
tags逗号分隔的账户字段名,例如 NetLiquidation,TotalCashValue
group账户组名称;普通个人账户通常使用 "All"
timeout等待 accountSummaryEnd() 的秒数

返回值是嵌套字典,结构如下:

{
"账户号": {
"字段名": {
"value": "字段值",
"currency": "币种"
}
}
}

实际开发中,账户号和金额都属于敏感信息。日志、公开材料、报错粘贴给别人之前,应该先脱敏。

from ibapi.account_summary_tags import AccountSummaryTags
from ibapi.sync_wrapper import TWSSyncWrapper, ResponseTimeout
tags = ",".join([
AccountSummaryTags.AccountType, # 账户类型
AccountSummaryTags.NetLiquidation, # 净清算值
AccountSummaryTags.TotalCashValue, # 总现金
AccountSummaryTags.BuyingPower, # 购买力
AccountSummaryTags.AvailableFunds, # 可用资金
AccountSummaryTags.ExcessLiquidity, # 剩余流动性
AccountSummaryTags.Cushion, # 剩余流动性占净清算值的比例
])
app = TWSSyncWrapper(timeout=8)
try:
if not app.connect_and_start("127.0.0.1", 7497, 945):
raise RuntimeError("连接 TWS API 失败")
summary = app.get_account_summary(tags, group="All", timeout=8)
for account, account_data in summary.items():
print(f"账户:{account[:3]}***")
for tag, item in account_data.items():
value = item["value"]
currency = item["currency"] or "-"
print(f"{tag}: {value} {currency}")
except ResponseTimeout:
print("已经发送账户摘要请求,但没有在超时时间内收到 accountSummaryEnd 回调")
finally:
app.disconnect_and_stop()

这段代码会打印账户字段值。公开分享日志时,应把账户号和金额替换成脱敏文本。

下面是只保留结构、不展示真实金额和账号的参考输出:

CONNECTED=True
ACCOUNT_COUNT=1
ROW_COUNT=7
TAGS=AccountType,AvailableFunds,BuyingPower,Cushion,ExcessLiquidity,NetLiquidation,TotalCashValue
CURRENCIES=EMPTY,USD
IS_CONNECTED_AFTER_STOP=False

这说明:

  • TWS 已接受连接。
  • reqAccountSummary() 成功返回账户摘要。
  • 收到了 accountSummaryEnd(),同步方法正常结束。
  • cancelAccountSummary() 已由方法执行。
字段中文含义常见用途
AccountType账户类型判断是现金账户、保证金账户等
NetLiquidation净清算值衡量账户总权益,常用于风控和仓位比例计算
TotalCashValue总现金查看账户现金余额
SettledCash已结算现金现金账户里尤其重要
AccruedCash应计现金利息、费用等尚未最终结算的现金项目
BuyingPower购买力估算还能买入多少保证金证券
EquityWithLoanValue含借贷价值权益现金、股票、债券、基金等综合权益
GrossPositionValue持仓总市值所有股票和权益期权持仓绝对值之和
InitMarginReq初始保证金要求开仓需要满足的保证金要求
MaintMarginReq维持保证金要求持仓需要维持的保证金要求
AvailableFunds可用资金可用于新交易的资金
ExcessLiquidity剩余流动性风控中常用,过低时接近强平风险
Cushion安全垫比例剩余流动性占净清算值的比例
DayTradesRemaining当日交易剩余额度PDT 规则相关;-1 通常表示不受该限制
Leverage杠杆率持仓总市值 / 净清算值

AccountSummaryTags.AllTags 会请求官方封装中列出的全部常用字段。新手调试时建议先只请求少量字段,等返回结构确认无误后再扩大范围。

普通个人账户通常使用:

summary = app.get_account_summary(tags, group="All", timeout=8)

group 主要给财务顾问账户或多账户结构使用。如果在 TWS 全局配置里创建了特定账户组,可以把这里改成对应组名。普通用户没有账户组时,不需要先去创建。

账户摘要适合读取一组概览字段;账户更新适合持续监听账户、持仓和组合变化。

接口更适合做什么
reqAccountSummary()读取账户概览,例如净清算值、购买力、可用资金
reqAccountUpdates()持续接收账户值、组合和持仓变化
reqPositions()读取持仓列表

如果只是下单前检查账户是否还有足够可用资金,账户摘要通常更直接。如果要构建完整交易系统的账户面板,还需要结合持仓和组合接口。

现象常见原因处理方式
ResponseTimeout没有收到 accountSummaryEnd()增大 timeout,确认 TWS 已登录并允许 API 连接
返回空字典标签名写错,或账户组不匹配先用 group="All" 和少量官方标签测试
某些字段没有币种该字段不是金额字段,例如 AccountTypeCushion代码里允许 currency 为空
数值是字符串TWS API 回调里的 value 本身就是字符串需要计算时再转成 Decimal,不要直接用浮点数处理金额
担心日志泄露账户号、金额、持仓都属于敏感信息生产日志只记录字段名、状态和脱敏后的账户标识

IBKR Campus: TWS API Documentation