🚀 AI 一键生成 ptrade 策略代码

PTrade 两融精算:如何精确计算融资利息成本?

ptrade | 发布时间: 2025/12/23
以下内容由 EasyQuant 生成。

问题描述

如何在策略中计算融资合约的利息?

解决方案

在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("未查询到合约信息。")

注意事项

  1. 权限要求:上述函数仅在两融交易模块(或两融回测环境)中可用。如果在普通股票账户环境下运行会报错或返回空值。
  2. 数据更新real_compact_interest(日间实时利息)通常在交易时间内会变动,而 compact_interest 通常是日终清算后更新的数值。计算当前总负债成本时,建议将两者考虑在内。
  3. Python版本:代码兼容 Python 3.5+,使用了 % 格式化字符串以确保兼容性。

Q&A

Q: get_margin_assertget_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 相加。