问题描述
解决方案
在 QMT 中,查询信用账户(两融账户)的融资负债和担保品主要使用以下两个 API 函数:
get_debt_contract(accId):获取信用账户负债合约明细。通过该函数可以查询到具体的融资合约、未还金额、截止日期等。get_assure_contract(accId):获取信用账户担保合约明细。通过该函数可以查询账户中作为担保品的持仓股票信息。
策略代码实现
以下是一个完整的 Python 策略代码示例。请注意,你需要将代码中的 YOUR_CREDIT_ACCOUNT_ID 替换为你实际的信用资金账号。
# -*- coding: gbk -*-
import time
def init(ContextInfo):
# 设置账户类型为信用账户 'CREDIT'
ContextInfo.accountType = 'CREDIT'
# 【重要】请在此处填写您的信用资金账号
ContextInfo.accid = 'YOUR_CREDIT_ACCOUNT_ID'
# 绑定账号,以便接收交易回报(虽然查询函数不强制绑定,但建议加上)
ContextInfo.set_account(ContextInfo.accid)
print("策略初始化完成,准备查询信用账户信息...")
def handlebar(ContextInfo):
# 为了避免在回测或历史K线上重复打印,只在最新的一根K线上执行查询
if not ContextInfo.is_last_bar():
return
# 获取当前账号
acc_id = ContextInfo.accid
print("=" * 50)
print(f"开始查询账号 {acc_id} 的两融信息")
print("=" * 50)
# ---------------------------------------------------
# 1. 查询融资负债 (Financing Debts)
# ---------------------------------------------------
print("【融资负债明细】:")
# 调用 get_debt_contract 获取负债合约列表
debt_list = get_debt_contract(acc_id)
if len(debt_list) == 0:
print("当前无融资负债合约。")
else:
# 遍历每一个负债合约对象
for obj in debt_list:
# 提取常用字段
code = obj.m_strInstrumentID # 证券代码
name = obj.m_strInstrumentName # 证券名称
debt_balance = obj.m_dUnRepayBalance # 负债金额 (未还金额)
contract_date = obj.m_nOpenDate # 合约开仓日期
end_date = obj.m_nRetEndDate # 归还截止日
compact_type = obj.m_eCompactType # 合约类型 (48:融资, 49:融券)
type_str = "融资" if compact_type == 48 else "融券"
print(f"合约类型: {type_str} | 代码: {code} ({name}) | "
f"负债金额: {debt_balance:.2f} | 开仓日: {contract_date} | 到期日: {end_date}")
print("-" * 50)
# ---------------------------------------------------
# 2. 查询担保品 (Collateral / Assurance)
# ---------------------------------------------------
print("【担保品明细】:")
# 调用 get_assure_contract 获取担保合约明细
assure_list = get_assure_contract(acc_id)
if len(assure_list) == 0:
print("当前无担保品持仓。")
else:
# 遍历每一个担保品对象
for obj in assure_list:
# 提取常用字段
code = obj.m_strInstrumentID # 证券代码
name = obj.m_strInstrumentName # 证券名称
# 注意:get_assure_contract 返回的对象属性可能因券商柜台差异略有不同
# 通常包含代码和名称,具体持仓数量建议结合 get_trade_detail_data('POSITION') 确认
# 尝试获取折算率 (部分柜台支持)
ratio = obj.m_dAssureRatio if hasattr(obj, 'm_dAssureRatio') else 0.0
print(f"担保品代码: {code} ({name}) | 折算率: {ratio}")
print("=" * 50)
代码说明
-
初始化 (
init):- 设置了
ContextInfo.accid。请务必将其修改为你真实的信用账号。 - 使用
ContextInfo.set_account()绑定账号。
- 设置了
-
执行逻辑 (
handlebar):if not ContextInfo.is_last_bar(): return:这行代码确保查询逻辑只在策略运行到最新行情时执行一次,防止在回测历史数据时刷屏。
-
查询负债 (
get_debt_contract):- 返回的是一个对象列表,每个对象代表一笔合约。
- 关键属性:
m_strInstrumentID: 标的代码。m_dUnRepayBalance: 最核心的数据,即该笔合约当前的负债金额(未还金额)。m_nRetEndDate: 负债归还的截止日期,用于风控管理。m_eCompactType: 区分是融资(48)还是融券(49)。
-
查询担保品 (
get_assure_contract):- 返回的是信用账户中作为担保品的持仓明细。
- 关键属性:
m_strInstrumentID: 担保品代码。m_dAssureRatio: 担保品折算率(注意:并非所有柜台接口都准确返回此字段,具体以实盘打印为准)。
常见问题 Q&A
Q: 为什么 get_assure_contract 查出来的数量和我的持仓数量不完全一致?
A: get_assure_contract 主要侧重于担保品的属性(如折算率、是否可作为担保)。如果你需要查询精确的持仓数量和持仓市值,建议配合使用 get_trade_detail_data(acc_id, 'CREDIT', 'POSITION'),那个接口返回的是标准的持仓对象,包含 m_nVolume (持仓量) 和 m_dMarketValue (市值)。
Q: 如何区分融资负债和融券负债?
A: 在 get_debt_contract 返回的对象中,检查 m_eCompactType 属性。通常 48 代表融资,49 代表融券。
Q: 这些函数在回测模式下有效吗?
A: 无效。get_debt_contract 和 get_assure_contract 是交易接口,仅在实盘模式下连接柜台后才能获取真实数据。回测模式下返回为空或模拟数据。