🚀 AI 一键生成 ptrade 策略代码
立即体验

如何在 ptrade 中实时监控融资融券合约发生额及日间利息变化?

ptrade | 发布时间: 2026/8/11
以下内容由 EasyQuant 生成。

问题描述

ptrade 两融实时监控:利用 get_margin_contractreal 追踪信用账户流水
如何通过 ptrade 接口实时监控我的融资融券合约发生额及日间利息变化?

解决方案

在 ptrade 量化交易平台中,监控融资融券(两融)账户的实时流水、合约发生额以及日间利息变化,主要依赖于信用账户专属的查询接口。通过结合 get_margin_contractreal(实时合约流水查询)和 get_margin_contract(合约查询)两个接口,您可以实现高频、精细化的信用账户监控。

一、 核心接口解析

  1. get_margin_contractreal() - 实时合约流水查询

    • 功能:获取日间实时的合约流水变动。
    • 关键监控字段
      • occur_balance: 发生金额(融资金额变化)
      • occur_amount: 发生数量(融券数量变化)
      • occur_interest: 发生利息
      • post_balance / post_interest: 变动后的余额与余利息
      • compact_type: 合约类别(0-融资,1-融券,2-其他负债)
  2. get_margin_contract() - 合约明细查询

    • 功能:查询当前未结清或已结清的合约明细。
    • 关键监控字段
      • real_compact_interest: 日间实时利息金额(动态更新的累计利息)
      • real_compact_balance: 日间实时合约金额
      • total_debit: 负债总额

二、 实时监控策略源码示例

以下示例展示了如何在 ptrade 中利用 run_interval 定时器,每隔 10 秒自动获取并对比两融流水与利息变化:

def initialize(context):
    # 设置操作标的
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 开启定时任务,每10秒监控一次信用账户流水与利息
    run_interval(context, monitor_margin_account, seconds=10)
    
    # 记录上次处理的流水ID,避免重复打印
    g.last_processed_flow_ids = set()

def monitor_margin_account(context):
    log.info("====== 开始执行两融账户实时监控 ======")
    
    # 1. 查询实时合约流水
    try:
        df_flow = get_margin_contractreal()
        if df_flow is not None and not df_flow.empty:
            # 过滤出今日发生的流水
            for index, row in df_flow.iterrows():
                compact_id = row['compact_id']
                # 如果是新产生的流水变动
                if compact_id not in g.last_processed_flow_ids:
                    compact_type_str = "融资" if row['compact_type'] == '0' else "融券" if row['compact_type'] == '1' else "其他负债"
                    log.info(f"【流水变动提醒】合约ID: {compact_id} | 类型: {compact_type_str} | "
                             f"发生金额: {row['occur_balance']} 元 | 发生数量: {row['occur_amount']} | "
                             f"产生利息: {row['occur_interest']} 元 | 备注: {row['remark']}")
                    g.last_processed_flow_ids.add(compact_id)
        else:
            log.info("当前暂无实时合约流水变动。")
    except Exception as e:
        log.error(f"查询实时合约流水失败: {e}")

    # 2. 查询当前合约的日间实时利息与负债
    try:
        df_contract = get_margin_contract()
        if df_contract is not None and not df_contract.empty:
            log.info("--- 当前未结清合约实时利息监控 ---")
            for index, row in df_contract.iterrows():
                # 仅监控开仓未归还(0)或部分归还(1)的活跃合约
                if row['compact_status'] in ['0', '1']:
                    log.info(f"合约ID: {row['compact_id']} | 证券代码: {row['stock_code']} | "
                             f"实时合约金额: {row['real_compact_balance']} 元 | "
                             f"日间实时利息: {row['real_compact_interest']} 元 | "
                             f"归还截止日: {row['ret_end_date']}")
        else:
            log.info("当前无活跃的两融持仓合约。")
    except Exception as e:
        log.error(f"查询合约明细失败: {e}")

def handle_data(context, data):
    pass

三、 注意事项

  1. 运行环境限制:上述两融专用函数(如 get_margin_contractrealget_margin_contract仅在实盘/仿真交易模块中可用,回测环境不支持此类实时流水接口。
  2. 头寸性质区分:如果您使用了专项头寸,在调用相关接口时,请注意柜台是否需要区分 cash_group(1为普通头寸,2为专项头寸)。
  3. 数据更新频率get_margin_contractreal 反映的是日间实时发生的流水,而利息 real_compact_interest 是由柜台根据日间持仓实时计提并动态更新的,非常适合用于日内风控和资金成本测算。