账户摘要
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 AccountSummaryTagsfrom 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()这段代码会打印账户字段值。公开分享日志时,应把账户号和金额替换成脱敏文本。
脱敏参考输出
Section titled “脱敏参考输出”下面是只保留结构、不展示真实金额和账号的参考输出:
CONNECTED=TrueACCOUNT_COUNT=1ROW_COUNT=7TAGS=AccountType,AvailableFunds,BuyingPower,Cushion,ExcessLiquidity,NetLiquidation,TotalCashValueCURRENCIES=EMPTY,USDIS_CONNECTED_AFTER_STOP=False这说明:
- TWS 已接受连接。
reqAccountSummary()成功返回账户摘要。- 收到了
accountSummaryEnd(),同步方法正常结束。 cancelAccountSummary()已由方法执行。
常用字段中文解释
Section titled “常用字段中文解释”| 字段 | 中文含义 | 常见用途 |
|---|---|---|
AccountType | 账户类型 | 判断是现金账户、保证金账户等 |
NetLiquidation | 净清算值 | 衡量账户总权益,常用于风控和仓位比例计算 |
TotalCashValue | 总现金 | 查看账户现金余额 |
SettledCash | 已结算现金 | 现金账户里尤其重要 |
AccruedCash | 应计现金 | 利息、费用等尚未最终结算的现金项目 |
BuyingPower | 购买力 | 估算还能买入多少保证金证券 |
EquityWithLoanValue | 含借贷价值权益 | 现金、股票、债券、基金等综合权益 |
GrossPositionValue | 持仓总市值 | 所有股票和权益期权持仓绝对值之和 |
InitMarginReq | 初始保证金要求 | 开仓需要满足的保证金要求 |
MaintMarginReq | 维持保证金要求 | 持仓需要维持的保证金要求 |
AvailableFunds | 可用资金 | 可用于新交易的资金 |
ExcessLiquidity | 剩余流动性 | 风控中常用,过低时接近强平风险 |
Cushion | 安全垫比例 | 剩余流动性占净清算值的比例 |
DayTradesRemaining | 当日交易剩余额度 | PDT 规则相关;-1 通常表示不受该限制 |
Leverage | 杠杆率 | 持仓总市值 / 净清算值 |
AccountSummaryTags.AllTags 会请求官方封装中列出的全部常用字段。新手调试时建议先只请求少量字段,等返回结构确认无误后再扩大范围。
group 参数怎么填
Section titled “group 参数怎么填”普通个人账户通常使用:
summary = app.get_account_summary(tags, group="All", timeout=8)group 主要给财务顾问账户或多账户结构使用。如果在 TWS 全局配置里创建了特定账户组,可以把这里改成对应组名。普通用户没有账户组时,不需要先去创建。
和账户更新的区别
Section titled “和账户更新的区别”账户摘要适合读取一组概览字段;账户更新适合持续监听账户、持仓和组合变化。
| 接口 | 更适合做什么 |
|---|---|
reqAccountSummary() | 读取账户概览,例如净清算值、购买力、可用资金 |
reqAccountUpdates() | 持续接收账户值、组合和持仓变化 |
reqPositions() | 读取持仓列表 |
如果只是下单前检查账户是否还有足够可用资金,账户摘要通常更直接。如果要构建完整交易系统的账户面板,还需要结合持仓和组合接口。
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
ResponseTimeout | 没有收到 accountSummaryEnd() | 增大 timeout,确认 TWS 已登录并允许 API 连接 |
| 返回空字典 | 标签名写错,或账户组不匹配 | 先用 group="All" 和少量官方标签测试 |
| 某些字段没有币种 | 该字段不是金额字段,例如 AccountType 或 Cushion | 代码里允许 currency 为空 |
| 数值是字符串 | TWS API 回调里的 value 本身就是字符串 | 需要计算时再转成 Decimal,不要直接用浮点数处理金额 |
| 担心日志泄露 | 账户号、金额、持仓都属于敏感信息 | 生产日志只记录字段名、状态和脱敏后的账户标识 |