问题描述
解决方案
在 QMT 量化交易平台中,查询信用账户(两融账户)中哪些股票可以作为担保品(担保标的),需要使用交易函数 get_assure_contract()。
该函数返回一个包含担保标的信息的对象列表,通过遍历该列表可以获取具体的股票代码、名称以及折算率等信息。
核心步骤
- 设置账户:确保在
init中设置了信用账户账号。 - 调用函数:使用
get_assure_contract(accountID)获取担保品列表。 - 解析数据:遍历返回的对象列表,访问其属性(如
m_strInstrumentID代码,m_dAssureRatio折算率等)。
代码实现
以下是一个完整的策略示例,用于查询并打印指定信用账户的所有担保品及其折算率。
# -*- coding: gbk -*-
def init(ContextInfo):
# 设置资金账号,请替换为您的实际信用账号
ContextInfo.accid = '6000000248'
# 标记是否已经查询过,防止在handlebar中重复查询
ContextInfo.has_queried = False
def handlebar(ContextInfo):
# 仅在最后一根K线(实时行情)且未查询过时执行
if not ContextInfo.is_last_bar() or ContextInfo.has_queried:
return
# 获取信用账户担保标的明细
# 参数为信用账户ID
assure_list = get_assure_contract(ContextInfo.accid)
print(f'查询账号 {ContextInfo.accid} 的担保品列表,共找到 {len(assure_list)} 条记录:')
# 遍历返回的列表
for obj in assure_list:
# 获取证券代码
code = obj.m_strInstrumentID
# 获取证券名称
name = obj.m_strInstrumentName
# 获取交易所代码
exchange = obj.m_strExchangeID
# 获取担保品折算比例 (例如 0.7 表示 70%)
ratio = obj.m_dAssureRatio
# 打印详细信息
print(f"代码: {code}.{exchange}, 名称: {name}, 折算率: {ratio}")
# 标记为已查询
ContextInfo.has_queried = True
返回对象属性说明
get_assure_contract 返回的是 StkSubjects 对象列表,主要属性如下:
- m_strInstrumentID: 证券代码(如 '600000')
- m_strInstrumentName: 证券名称(如 '浦发银行')
- m_strExchangeID: 交易所代码(如 'SH' 或 'SZ')
- m_dAssureRatio: 担保品折算比例(关键数据,决定了该股票能充抵多少保证金)
- m_eAssureStatus: 是否可做担保(状态位)
注意事项
- 账号类型:此函数仅适用于信用账户(两融账户),普通股票账户调用可能返回空列表或无效数据。
- 调用频率:该函数涉及查询柜台或本地缓存的静态数据,建议在
init或特定的触发条件下调用,不要在每一根 K 线或每一个 Tick 中频繁调用,以免影响策略性能。 - 数据更新:券商的担保品名单和折算率可能会调整,实盘交易中建议每日开盘前或盘中定时更新获取最新数据。
Q&A
Q: get_assure_contract 函数返回的数据是实时的吗?
A: 该数据通常反映的是券商柜台当日的静态设置。担保品名单和折算率通常按日更新,盘中极少变动。
Q: 如何查询某只股票是否可以融资买入(作为融资标的)?
A: 可以使用 get_debt_contract(accId) 查询负债合约,或者查看 StkSubjects 对象中的 m_dFinRatio(融资保证金比例)和 m_eFinStatus(融资状态)属性。虽然 get_assure_contract 主要用于担保品,但返回的对象结构通常包含多维度的两融属性。
Q: 如果返回列表为空是什么原因?
A: 可能原因包括:1. 填写的账号不是信用账号;2. 账号未登录或连接断开;3. 券商柜台数据未同步到本地终端。建议检查交易连接状态。