🚀 AI 一键生成 qmt 策略代码
立即体验

QMT 多资产风控:如何实时计算股票市值与期货期权保证金配比防止爆仓?

qmt | 发布时间: 2026/8/13
以下内容由 EasyQuant 生成。

问题描述

QMT 多资产风控:动态对比股票市值与期权/期货保证金占用比例
如何在 QMT 中实时计算股票持仓市值与期货期权保证金的动态配比以防止爆仓?

解决方案

在进行跨资产(如“股票+股指期货”或“股票+个股期权”)的量化对冲交易时,多资产账户的资金安全和风控至关重要。如果期货或期权端因市场剧烈波动导致保证金不足,而股票端市值无法及时变现,极易引发强制平仓(爆仓)。

本文将介绍如何利用 QMT Python API 实时获取股票持仓市值与期货/期权保证金占用,并动态计算风控配比,实现自动化预警。


一、 核心风控逻辑与 API 接口

要实现动态风控,我们需要实时获取以下两类数据:

  1. 股票端资产:通过股票持仓对象 position 获取股票市值 m_dMarketValue,以及股票账户的可用资金 m_dAvailable
  2. 衍生品端资金:通过期货/期权账户对象 account 获取当前占用的保证金 m_dMargin(或期权的 m_dRealUsedMargin)。

关键 API 接口:

  • ContextInfo.set_account(account):在 init 中绑定需要监控的股票和期货/期权账号。
  • get_trade_detail_data(accountID, strAccountType, strDatatype)
    • strDatatype='POSITION' 时,获取持仓列表,累加 m_dMarketValue 得到股票总市值。
    • strDatatype='ACCOUNT' 时,获取账户资金详情,读取 m_dMargin(占用保证金)和 m_dAvailable(可用资金)。
  • ContextInfo.run_time():设置定时器,在盘中高频(如每5秒)执行风控算法。

二、 QMT 多资产风控策略源码

以下是一个完整的 QMT 盘中风控监控策略示例。该策略通过定时器实时计算 “期货保证金 / (股票市值 + 股票可用资金)” 的比例,当比例超过安全阈值时触发报警。

#coding:gbk
import time

def init(ContextInfo):
    # 1. 设定需要监控的资金账号(请替换为您的实际账号)
    ContextInfo.stock_account = '6000000248'  # 股票/信用账户
    ContextInfo.future_account = '110476'     # 期货/期权账户
    
    # 2. 绑定账号以订阅交易主推
    ContextInfo.set_account(ContextInfo.stock_account)
    ContextInfo.set_account(ContextInfo.future_account)
    
    # 3. 设置风控阈值(例如:期货保证金占股票总资产的比例不得超过 40%)
    ContextInfo.risk_threshold = 0.40
    
    # 4. 注册定时器:盘中每 5 秒执行一次风控检查
    ContextInfo.run_time("check_multi_asset_risk", "5nSecond", "2023-01-01 09:30:00", "SH")
    print("【风控系统】多资产动态风控初始化成功,监控阈值设定为: ", ContextInfo.risk_threshold * 100, "%")

def check_multi_asset_risk(ContextInfo):
    # ---- 步骤 1:计算股票端总资产(持仓市值 + 可用资金) ----
    stock_market_value = 0.0
    stock_available_cash = 0.0
    
    # 获取股票持仓
    stock_positions = get_trade_detail_data(ContextInfo.stock_account, 'STOCK', 'POSITION')
    if stock_positions:
        for pos in stock_positions:
            stock_market_value += pos.m_dMarketValue
            
    # 获取股票账户可用资金
    stock_accounts = get_trade_detail_data(ContextInfo.stock_account, 'STOCK', 'ACCOUNT')
    if stock_accounts:
        stock_available_cash = stock_accounts[0].m_dAvailable
        
    total_stock_assets = stock_market_value + stock_available_cash
    
    # ---- 步骤 2:获取期货端已占用保证金 ----
    future_margin = 0.0
    future_accounts = get_trade_detail_data(ContextInfo.future_account, 'FUTURE', 'ACCOUNT')
    if future_accounts:
        future_margin = future_accounts[0].m_dMargin
        
    # ---- 步骤 3:动态计算风控配比 ----
    if total_stock_assets > 0:
        margin_ratio = future_margin / total_stock_assets
        
        # 打印实时监控日志
        print(f"【实时监控】股票总资产: {total_stock_assets:.2f} 元 (市值: {stock_market_value:.2f}, 可用: {stock_available_cash:.2f}) | 期货已用保证金: {future_margin:.2f} 元 | 当前保证金占比: {margin_ratio*100:.2f}%")
        
        # ---- 步骤 4:触发风控预警与自动处置 ----
        if margin_ratio > ContextInfo.risk_threshold:
            print(f"【风控警报】当前保证金占比 {margin_ratio*100:.2f}% 已超过安全阈值 {ContextInfo.risk_threshold*100:.2f}%!存在爆仓风险!")
            # 实际交易中,此处可调用 passorder() 执行对冲平仓,例如:
            # passorder(EOFF_THOST_FTDC_OF_Close, 1101, ContextInfo.future_account, 'IF2309.IF', 5, -1, 1, ContextInfo)
    else:
        print("【风控系统】暂未获取到有效的股票资产数据,请检查账户登录状态。")

def handlebar(ContextInfo):
    pass

三、 进阶风控优化建议

  1. 信用账户维持担保比例(个人维持担保比例)
    如果您使用的是两融信用账户,可以直接通过 CCreditAccountDetail 对象的 m_dPerAssurescaleValue 属性获取个人维持担保比例,当该比例逼近 130% 警戒线时,自动减少期货端的风险敞口。
  2. 滑点与冲击成本预估
    在极端行情下,平仓可能面临流动性不足。建议在计算风控配比时,将股票市值乘以一个折价系数(如 0.95),以应对市场暴跌时的变现损耗。
  3. 多账户主推订阅
    确保在 init 中完整调用了 ContextInfo.set_account(),否则盘中无法实时接收到柜台的资金与持仓变动主推,导致风控计算延迟。