3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在期货量化交易中,保证金占用率是衡量账户风险的核心指标。由于交易所或期货公司可能会动态调整保证金率,硬编码保证金参数极易导致风控失效。本文将介绍如何通过 QMT API 实时获取多头保证金率(LongMarginRatio),并构建动态仓位风控系统。
获取合约详情:ContextInfo.get_instrumentdetail(stockcode)
该接口返回一个字典,其中包含合约的关键属性:
LongMarginRatio:多头保证金率(如 0.12 代表 12%)。VolumeMultiple:合约乘数(每手对应的标的单位数量)。获取账户资金:get_trade_detail_data(accountID, 'FUTURE', 'ACCOUNT')
用于获取期货账户的实时资金对象,其核心属性包括:
m_dBalance:总资产(动态权益)。m_dMargin:当前已占用保证金。m_dAvailable:可用资金。以下是一个完整的 QMT Python 策略示例。该策略在运行过程中会实时监控账户的保证金占用率(已用保证金 / 总资产),一旦超过设定的安全阈值(如 60%),将触发风控警报并限制开仓;在安全范围内,则根据实时保证金率动态计算最大可开仓手数。
#coding:gbk
import time
def init(ContextInfo):
# 1. 设置期货资金账号
ContextInfo.acc_id = '123456' # 请替换为您的真实期货账号
ContextInfo.set_account(ContextInfo.acc_id)
# 2. 设置监控的期货合约
ContextInfo.symbol = 'IF2406.IF' # 示例:沪深300股指期货合约
ContextInfo.set_universe([ContextInfo.symbol])
# 3. 设置风控阈值:保证金占用/总资产的最大安全比例(例如 60%)
ContextInfo.risk_threshold = 0.60
def handlebar(ContextInfo):
# 只在最新 Bar 运行风控逻辑
if not ContextInfo.is_last_bar():
return
# 1. 获取合约详情(实时保证金率与合约乘数)
detail = ContextInfo.get_instrumentdetail(ContextInfo.symbol)
if not detail:
print(f'无法获取合约 {ContextInfo.symbol} 的详细信息')
return
long_margin_ratio = detail.get('LongMarginRatio', 0.15) # 默认15%
multiplier = detail.get('VolumeMultiple', 300) # 默认300
# 2. 获取账户实时资金状况
acct_info = get_trade_detail_data(ContextInfo.acc_id, 'FUTURE', 'ACCOUNT')
if not acct_info:
print('未能获取到账户资金信息')
return
account = acct_info[0]
balance = account.m_dBalance # 动态权益(总资产)
margin = account.m_dMargin # 已占用保证金
available = account.m_dAvailable # 可用资金
# 3. 计算当前账户的保证金占用率
current_risk_ratio = margin / balance if balance > 0 else 0
print(f'--- 动态风控监控中 ---')
print(f'合约: {ContextInfo.symbol} | 实时多头保证金率: {long_margin_ratio*100:.2f}% | 合约乘数: {multiplier}')
print(f'账户总资产: {balance:.2f} | 已用保证金: {margin:.2f} | 保证金占用率: {current_risk_ratio*100:.2f}%')
# 4. 动态风控逻辑判定
if current_risk_ratio > ContextInfo.risk_threshold:
print(f'【风控警报】当前保证金占用率 {current_risk_ratio*100:.2f}% 已超过安全阈值 {ContextInfo.risk_threshold*100:.2f}%!')
print('【风控操作】系统已锁定开仓权限。若风险继续扩大,请手动或通过平仓函数减仓。')
# 可在此处调用平仓函数,例如:
# passorder(6, 1101, ContextInfo.acc_id, ContextInfo.symbol, 5, -1, 1, ContextInfo) # 平多优先平今
else:
# 5. 安全状态下,动态计算最大可开仓手数
full_tick = ContextInfo.get_full_tick([ContextInfo.symbol])
if ContextInfo.symbol in full_tick:
last_price = full_tick[ContextInfo.symbol]['lastPrice']
# 单手多头所需保证金 = 最新价 * 合约乘数 * 保证金率
one_contract_margin = last_price * multiplier * long_margin_ratio
# 计算在安全阈值内,剩余可用于开仓的保证金度量
safe_remaining_margin = (ContextInfo.risk_threshold * balance) - margin
if safe_remaining_margin > one_contract_margin:
max_safe_lots = int(safe_remaining_margin / one_contract_margin)
print(f'【风控安全】当前最大可安全增持多头: {max_safe_lots} 手 (单手保证金约: {one_contract_margin:.2f} 元)')
else:
print('【风控提示】剩余安全保证金不足以开仓一手。')
LongMarginRatio 会同步更新,策略会自动调低最大可开仓手数,避免因保证金不足导致被动强平。risk_threshold(如 60%),在账户整体资金层面保留了 40% 的抗波动安全垫,有效抵御极端行情下的穿仓风险。