问题描述
解决方案
在PTrade中,计算信用账户(两融账户)的维持担保比例,主要依赖于 get_margin_assert() 函数。该函数返回一个包含信用资产信息的字典,其中包含了计算所需的“担保资产”和“负债总额”。
计算公式
$$ \text{维持担保比例} = \frac{\text{担保资产 (assure_asset)}}{\text{负债总额 (total_debit)}} \times 100% $$
实现步骤
- 调用
get_margin_assert()获取信用资产数据。 - 从返回的字典中提取
assure_asset(担保资产)和total_debit(负债总额)。 - 进行除法运算计算比例(注意处理负债为0的情况,避免除以零错误)。
代码示例
以下是一个完整的策略示例,展示如何在 handle_data 中计算并打印当前的维持担保比例:
def initialize(context):
# 初始化策略,设置股票池(示例)
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 1. 获取信用资产信息
# 注意:该函数仅在两融交易模块(实盘或两融回测)中可用
margin_assets = get_margin_assert()
if margin_assets:
# 2. 提取担保资产和负债总额
# assure_asset: 担保资产
total_assets = margin_assets.get('assure_asset', 0.0)
# total_debit: 负债总额
total_liabilities = margin_assets.get('total_debit', 0.0)
# 3. 计算维持担保比例
# 必须判断负债是否大于0,避免除以0报错
if total_liabilities > 0:
# 维持担保比例 = 担保资产 / 负债总额
maintenance_ratio = total_assets / total_liabilities
# 打印结果 (保留4位小数)
log.info("当前担保资产: %.2f, 当前负债总额: %.2f" % (total_assets, total_liabilities))
log.info("当前维持担保比例: %.4f%%" % (maintenance_ratio * 100))
# 示例逻辑:如果维保比例低于140% (1.4),发出警告
if maintenance_ratio < 1.4:
log.warning("警报:维持担保比例低于140%,请注意风险!")
else:
# 如果没有负债,维持担保比例通常视为无穷大或安全状态
log.info("当前无负债,无需计算维持担保比例。担保资产: %.2f" % total_assets)
else:
log.info("未能获取到信用资产信息,请检查是否处于两融账号环境。")
关键字段说明
根据PTrade API文档,get_margin_assert() 返回的字典中包含以下关键字段:
assure_asset: 担保资产(浮点数)。即账户中所有可用作担保的现金和证券市值的总和。total_debit: 负债总额(浮点数)。即融资合约金额、融券合约金额以及相关利息费用的总和。
注意事项
- 适用环境:此代码仅在两融交易(信用账户)环境中有效。如果在普通股票账户回测中调用
get_margin_assert(),可能会返回空字典或报错。 - 除零保护:在编写策略时,务必检查
total_debit是否为0。如果账户没有融资融券负债,分母为0会导致程序崩溃。 - 数据更新:
get_margin_assert()获取的是柜台提供的实时或准实时数据,具体更新频率取决于券商柜台的推送机制。
Q&A
Q: get_margin_assert() 函数在普通股票账户回测中能用吗?
A: 不能。该函数仅支持 PTrade 客户端可用,且仅在两融交易模块(包括两融回测和实盘)可用。普通账户调用会返回空数据或无效数据。
Q: 维持担保比例低于多少会被平仓?
A: 这取决于券商的具体规定。通常情况下,维持担保比例低于 130% 会触发追保(追加保证金),低于 110% 或 115% 可能会触发强制平仓。建议在策略中设置高于券商警戒线的阈值(如140%或150%)进行风控。
Q: 如何获取具体的融资或融券负债明细?
A: 可以通过 get_margin_assert() 返回字典中的其他字段获取,例如:
fin_compact_balance: 融资合约金额slo_compact_fare: 融券合约费用fin_compact_interest: 融资合约利息
具体字段请参考 API 文档中的get_margin_assert部分。