3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行跨资产(如“股票+股指期货”或“股票+个股期权”)的量化对冲交易时,多资产账户的资金安全和风控至关重要。如果期货或期权端因市场剧烈波动导致保证金不足,而股票端市值无法及时变现,极易引发强制平仓(爆仓)。
本文将介绍如何利用 QMT Python API 实时获取股票持仓市值与期货/期权保证金占用,并动态计算风控配比,实现自动化预警。
要实现动态风控,我们需要实时获取以下两类数据:
position 获取股票市值 m_dMarketValue,以及股票账户的可用资金 m_dAvailable。account 获取当前占用的保证金 m_dMargin(或期权的 m_dRealUsedMargin)。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 盘中风控监控策略示例。该策略通过定时器实时计算 “期货保证金 / (股票市值 + 股票可用资金)” 的比例,当比例超过安全阈值时触发报警。
#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
CCreditAccountDetail 对象的 m_dPerAssurescaleValue 属性获取个人维持担保比例,当该比例逼近 130% 警戒线时,自动减少期货端的风险敞口。0.95),以应对市场暴跌时的变现损耗。init 中完整调用了 ContextInfo.set_account(),否则盘中无法实时接收到柜台的资金与持仓变动主推,导致风控计算延迟。