问题描述
解决方案
在PTrade量化交易平台中,计算融资合约的利息主要涉及两个API接口:get_margin_assert(查询信用资产)和 get_margin_contract(查询合约详情)。
您可以根据需求选择获取账户总的融资利息,或者获取单笔合约的具体利息。
以下是具体的实现方法和代码示例。
方法一:获取账户总融资利息
如果您只需要知道当前账户所有融资合约累计产生的总利息,可以使用 get_margin_assert() 函数。该函数返回一个字典,其中 fin_compact_interest 字段即为融资合约总利息。
方法二:获取单笔合约的详细利息
如果您需要分析每一笔融资开仓对应的利息(例如为了计算单笔交易的净盈亏),可以使用 get_margin_contract() 函数。该函数返回一个 DataFrame,包含每一笔合约的详细信息。
- compact_interest: 合约利息金额(通常指已结息或累计利息)。
- real_compact_interest: 日间实时利息金额(当天的实时利息)。
- compact_type: 合约类别('0' 代表融资,'1' 代表融券)。
完整策略代码示例
以下代码展示了如何在策略中同时实现上述两种查询方式,并打印相关日志。
def initialize(context):
# 初始化策略
g.security = '600570.SS'
set_universe(g.security)
# 设置为融资融券业务模式(回测时需在界面配置,实盘自动识别)
# 注意:此代码仅演示查询逻辑,不包含开仓逻辑
def handle_data(context, data):
# ---------------------------------------------------
# 方式一:查询账户层面的总融资利息
# ---------------------------------------------------
margin_assets = get_margin_assert()
if margin_assets:
# fin_compact_interest: 融资合约利息
total_fin_interest = margin_assets.get('fin_compact_interest', 0.0)
# fin_compact_fare: 融资合约费用(通常指手续费等)
total_fin_fare = margin_assets.get('fin_compact_fare', 0.0)
log.info("【账户总览】融资总利息: %.2f, 融资总费用: %.2f" % (total_fin_interest, total_fin_fare))
# ---------------------------------------------------
# 方式二:查询每一笔融资合约的详细利息
# ---------------------------------------------------
contracts_df = get_margin_contract()
if contracts_df is not None and not contracts_df.empty:
# 筛选出融资合约 (compact_type == '0')
# 注意:PTrade返回的DataFrame列名通常为小写
fin_contracts = contracts_df[contracts_df['compact_type'] == '0']
if not fin_contracts.empty:
log.info("【合约详情】正在遍历融资合约...")
for index, row in fin_contracts.iterrows():
contract_id = row['compact_id'] # 合约编号
stock_code = row['stock_code'] # 证券代码
interest = float(row['compact_interest']) # 合约利息
real_interest = float(row['real_compact_interest']) # 实时利息
# 计算该合约当前总利息成本
current_total_interest = interest + real_interest
log.info("合约号: %s, 标的: %s, 已结利息: %.2f, 实时利息: %.2f, 合计: %.2f" % (
contract_id, stock_code, interest, real_interest, current_total_interest
))
else:
log.info("当前没有未了结的融资合约。")
else:
log.info("未查询到合约信息。")
注意事项
- 权限要求:上述函数仅在两融交易模块(或两融回测环境)中可用。如果在普通股票账户环境下运行会报错或返回空值。
- 数据更新:
real_compact_interest(日间实时利息)通常在交易时间内会变动,而compact_interest通常是日终清算后更新的数值。计算当前总负债成本时,建议将两者考虑在内。 - Python版本:代码兼容 Python 3.5+,使用了
%格式化字符串以确保兼容性。
Q&A
Q: get_margin_assert 和 get_margin_contract 有什么区别?
A: get_margin_assert 返回的是账户级别的汇总数据(如总资产、总负债、总利息),适合宏观风控;get_margin_contract 返回的是每一笔具体合约的明细数据(如某一天融资买入某只股票的合约),适合精细化管理单笔交易成本。
Q: 为什么回测时获取到的利息可能是0?
A: 在回测环境中,利息的计算依赖于回测引擎的费率设置。如果回测时间过短(例如当天开仓当天平仓),或者费率设置不正确,可能导致利息显示为0。此外,利息通常是按日计提的。
Q: 如何计算融券合约的利息?
A: 方法类似。在 get_margin_assert 中使用 slo_compact_interest 字段;在 get_margin_contract 中筛选 compact_type == '1' 的记录。
Q: real_compact_interest 是什么意思?
A: 它代表“日间实时利息金额”。由于利息通常是过夜产生的,但在某些券商柜台系统中,当日产生的利息或未归档的利息会体现在这个字段中。为了计算准确的平仓成本,建议将 compact_interest(已归档利息)与 real_compact_interest 相加。