问题描述
解决方案
在PTrade量化交易平台中,查询和计算信用账户(融资融券账户)的维持担保比例,主要依赖于 get_margin_assert() 函数。
该函数用于获取信用账户的资产负债信息,通过返回字典中的 担保资产 (assure_asset) 和 负债总额 (total_debit) 两个字段即可计算出维持担保比例。
计算公式
$$ \text{维持担保比例} = \frac{\text{担保资产 (assure_asset)}}{\text{负债总额 (total_debit)}} \times 100% $$
实现步骤
- 调用
get_margin_assert()获取信用资产信息字典。 - 从字典中提取
assure_asset(担保资产)和total_debit(负债总额)。 - 进行除法运算计算比例(需注意分母为0的情况,即无负债时)。
策略代码示例
以下是一个完整的策略示例,展示了如何在盘中实时监控维持担保比例:
def initialize(context):
# 初始化策略,设置一个标的用于回测或交易环境启动
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取信用账户资产信息
# 注意:该函数仅在两融交易模块或两融回测中可用
margin_info = get_margin_assert()
# 判空保护,确保获取到了数据
if margin_info:
# 1. 获取担保资产 (总资产)
assure_asset = margin_info.get('assure_asset', 0.0)
# 2. 获取负债总额
total_debit = margin_info.get('total_debit', 0.0)
log.info("担保资产: %.2f, 负债总额: %.2f" % (assure_asset, total_debit))
# 3. 计算维持担保比例
if total_debit > 0:
# 计算比例
maintenance_ratio = assure_asset / total_debit
# 转换为百分比格式
ratio_percent = maintenance_ratio * 100
log.info("当前维持担保比例: %.2f%%" % ratio_percent)
# 示例风控逻辑:如果比例低于140%,打印警告
if ratio_percent < 140:
log.warning("警告:维持担保比例低于140%,请注意风险!")
else:
# 负债为0,说明没有融资融券负债,账户安全
log.info("当前无负债,维持担保比例为安全状态 (无限大)")
else:
log.info("未能获取到信用资产信息,请检查是否为两融账号或两融回测环境。")
关键字段说明
在使用 get_margin_assert() 返回的字典中,以下是相关的关键字段:
| 字段名 | 类型 | 说明 |
|---|---|---|
assure_asset |
float | 担保资产。即信用账户内的总资产(现金+证券市值)。 |
total_debit |
float | 负债总额。包含融资合约金额、融券合约金额及相关利息费用等。 |
enable_bail_balance |
float | 可用保证金。 |
fin_enable_quota |
float | 融资可用额度。 |
slo_enable_quota |
float | 融券可用额度。 |
注意事项
- 适用环境:
get_margin_assert函数仅支持 Ptrade客户端 可用,且仅在 两融回测 或 两融交易 模块可用。如果在普通股票账户回测中调用,可能会返回空字典或报错。 - 除零错误:在编写代码时,务必判断
total_debit是否大于0。如果账户没有融资或融券负债,分母为0会导致程序报错。 - 数据更新频率:在实盘交易中,资产和负债数据通常由柜台推送或查询更新,建议在
handle_data或run_interval中调用以获取最新状态。
Q&A
Q: 为什么我在回测中调用 get_margin_assert 返回了空字典?
A: 请检查您的回测环境设置。该函数仅在“融资融券”业务类型的回测中有效。如果您选择的是“普通股票”业务类型,该函数将无法获取数据。
Q: 维持担保比例低于多少会被平仓?
A: 这取决于券商的具体规定。通常情况下,维持担保比例低于130%即进入追保线(需追加担保物),低于110%或115%可能会触发强制平仓。具体数值请咨询您的开户券商。
Q: 如何获取具体的融资或融券合约负债?
A: 可以使用 get_margin_contract() 函数查询具体的合约明细,或者通过 get_margin_assert() 返回字典中的 fin_compact_balance (融资合约金额) 和 slo_compact_balance (融券合约金额,需结合数量和价格计算) 来查看。