🚀 AI 一键生成 qmt 策略代码

如何在 QMT 中通过 API 实时监控两融账户的负债与担保品,并进行风险预警?

qmt | 发布时间: 2025/12/4
以下内容由 EasyQuant 生成。

问题描述

如何通过代码查询我的两融账户的负债情况和担保品价值,来计算风险?

解决方案

在 QMT 中,查询两融(信用)账户的资产、负债和风险指标,主要通过 get_trade_detail_data 函数配合 'CREDIT'(信用账户)和 'ACCOUNT'(账号信息)参数来实现。

返回的对象是 CCreditAccountDetail,其中包含了计算风险所需的关键字段,如总资产(担保品价值)、总负债和维持担保比例。

核心逻辑与字段说明

  1. 获取数据函数get_trade_detail_data(accountID, 'CREDIT', 'ACCOUNT')
  2. 关键属性字段
    • 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}")

代码使用说明

  1. 账号替换:请务必将 init 函数中的 'YOUR_CREDIT_ACCOUNT_ID' 替换为您实际登录的信用资金账号。
  2. 运行模式:此代码需要在实盘模式下运行,因为回测模式通常不支持真实的账户资金查询接口。
  3. 维持担保比例m_dPerAssurescaleValue 是最直接的风险指标。如果该值为 0 或异常大,通常意味着当前没有负债。
  4. 负债明细:代码末尾提供了一个辅助函数 query_specific_debts,利用 get_debt_contract 接口可以查询到具体是哪一笔合约产生的负债,这对于决定优先偿还哪笔债务很有帮助。

Q&A

Q: 如何查询我当前具体的融资合约和融券合约明细?
A: 可以使用 get_debt_contract(accId) 函数。它返回一个列表,包含每一笔未了结的负债合约(StkCompacts 对象),从中可以读取合约代码、未还金额、未还利息、合约开仓日期等详细信息。

Q: m_dAvailablem_dFetchBalance 有什么区别?
A: m_dAvailable 通常指可用资金,即可以用来买入证券的资金余额;而 m_dFetchBalance可取资金,即可以转出到银行卡的资金。在两融账户中,由于维持担保比例的限制,可用资金往往大于可取资金。

Q: 为什么计算出的维持担保比例和券商APP上显示的有细微差别?
A: 这通常是因为资产估值的时间点不同。QMT 的 m_dBalance(总资产)通常是基于最近一次行情推送计算的,而券商 APP 可能使用的是实时流式计算或稍有延迟的快照。此外,对于停牌股票或特殊证券的估值方式(如公允价值 vs 收盘价)也可能导致细微差异。建议以 m_dPerAssurescaleValue 字段为准,这是柜台直接返回的计算结果。