问题描述
解决方案
在 QMT 中,查询两融(信用)账户的资产、负债和风险指标,主要通过 get_trade_detail_data 函数配合 'CREDIT'(信用账户)和 'ACCOUNT'(账号信息)参数来实现。
返回的对象是 CCreditAccountDetail,其中包含了计算风险所需的关键字段,如总资产(担保品价值)、总负债和维持担保比例。
核心逻辑与字段说明
- 获取数据函数:
get_trade_detail_data(accountID, 'CREDIT', 'ACCOUNT') - 关键属性字段:
m_dBalance: 总资产(即担保品总价值,包含现金和持仓市值)。m_dTotalDebit: 总负债(包含融资负债、融券负债及利息费用等)。m_dPerAssurescaleValue: 维持担保比例(通常计算公式为:总资产 / 总负债)。这是券商衡量两融风险的核心指标(通常低于 130% 会触发追保)。m_dAvailable: 可用资金。
完整策略代码示例
以下代码展示了如何在 handlebar 中实时获取信用账户的负债和担保品价值,并打印风险状况。
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置您的信用资金账号
# 请务必将 'YOUR_CREDIT_ACCOUNT_ID' 替换为您真实的信用账号
ContextInfo.accid = 'YOUR_CREDIT_ACCOUNT_ID'
# 绑定账号,用于接收回报(虽然查询主要靠主动调取,但绑定是良好习惯)
ContextInfo.set_account(ContextInfo.accid)
print("策略初始化完成,准备查询两融账户信息...")
def handlebar(ContextInfo):
# 1. 调用 get_trade_detail_data 获取信用账户详情
# 参数说明:账号ID, 账号类型('CREDIT'), 数据类型('ACCOUNT')
account_info_list = get_trade_detail_data(ContextInfo.accid, 'CREDIT', 'ACCOUNT')
# 2. 检查是否获取到数据
if not account_info_list:
print(f"未获取到账号 {ContextInfo.accid} 的信用账户信息,请检查账号是否登录或类型是否正确。")
return
# 3. 解析数据对象 (通常列表里只有一个对象)
credit_account = account_info_list[0]
# --- 获取关键指标 ---
# 总资产 (担保品价值)
total_assets = credit_account.m_dBalance
# 总负债
total_debt = credit_account.m_dTotalDebit
# 维持担保比例 (风险指标)
# 注意:有些券商接口返回的是小数(如1.5),有些是百分比(如150),请根据实际打印值确认
maintenance_ratio = credit_account.m_dPerAssurescaleValue
# 净资产
net_assets = credit_account.m_dAssureAsset
# --- 打印输出 ---
print("=" * 30)
print(f"【两融账户风险监控】 账号: {ContextInfo.accid}")
print(f"担保品总价值 (总资产): {total_assets:,.2f}")
print(f"两融总负债: {total_debt:,.2f}")
print(f"净资产: {net_assets:,.2f}")
print(f"维持担保比例: {maintenance_ratio:.2f}%")
# --- 简单的风险预警逻辑示例 ---
# 假设维持担保比例低于 130% 为警戒线 (具体数值请参考您券商的规定)
# 注意:如果总负债为0,维持担保比例可能是一个极大的数或特定值,需处理
if total_debt > 0 and maintenance_ratio < 130:
print("!!! 警告:维持担保比例低于 130%,请注意追保风险 !!!")
elif total_debt == 0:
print("当前无负债,账户安全。")
else:
print("账户风险处于安全范围内。")
print("=" * 30)
# 如果需要查询具体的负债合约明细(例如具体哪只股票欠了多少钱),可以使用 get_debt_contract
# query_specific_debts(ContextInfo)
def query_specific_debts(ContextInfo):
"""
辅助函数:查询具体的负债合约明细
"""
debt_list = get_debt_contract(ContextInfo.accid)
if debt_list:
print(f"--- 负债合约明细 ({len(debt_list)} 条) ---")
for debt in debt_list:
print(f"合约: {debt.m_strInstrumentID}, 类型: {'融资' if debt.m_eCompactType==48 else '融券'}, "
f"未还金额: {debt.m_dUnRepayBalance}, 未还数量: {debt.m_nRealCompactVol}")
代码使用说明
- 账号替换:请务必将
init函数中的'YOUR_CREDIT_ACCOUNT_ID'替换为您实际登录的信用资金账号。 - 运行模式:此代码需要在实盘模式下运行,因为回测模式通常不支持真实的账户资金查询接口。
- 维持担保比例:
m_dPerAssurescaleValue是最直接的风险指标。如果该值为 0 或异常大,通常意味着当前没有负债。 - 负债明细:代码末尾提供了一个辅助函数
query_specific_debts,利用get_debt_contract接口可以查询到具体是哪一笔合约产生的负债,这对于决定优先偿还哪笔债务很有帮助。
Q&A
Q: 如何查询我当前具体的融资合约和融券合约明细?
A: 可以使用 get_debt_contract(accId) 函数。它返回一个列表,包含每一笔未了结的负债合约(StkCompacts 对象),从中可以读取合约代码、未还金额、未还利息、合约开仓日期等详细信息。
Q: m_dAvailable 和 m_dFetchBalance 有什么区别?
A: m_dAvailable 通常指可用资金,即可以用来买入证券的资金余额;而 m_dFetchBalance 指可取资金,即可以转出到银行卡的资金。在两融账户中,由于维持担保比例的限制,可用资金往往大于可取资金。
Q: 为什么计算出的维持担保比例和券商APP上显示的有细微差别?
A: 这通常是因为资产估值的时间点不同。QMT 的 m_dBalance(总资产)通常是基于最近一次行情推送计算的,而券商 APP 可能使用的是实时流式计算或稍有延迟的快照。此外,对于停牌股票或特殊证券的估值方式(如公允价值 vs 收盘价)也可能导致细微差异。建议以 m_dPerAssurescaleValue 字段为准,这是柜台直接返回的计算结果。