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

PTrade 两融风控实战:使用 get_margin_contract 监控合约到期与负债

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

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: PTrade 两融风控实战:使用 get_margin_contract 监控合约到期与负债

Question: 如何利用 PTrade 的 get_margin_contract 接口查询融资融券合约到期日和未还利息?

解决方案

PTrade 两融风控实战:使用 get_margin_contract 监控合约到期与负债

在融资融券(两融)交易中,合约一般有最长持仓期限(通常为6个月)。如果合约临近到期未及时归还,可能引发柜台强制平仓风险。此外,实时监控未还利息与负债金额也是精细化资金管理的重要一环。

PTrade 提供了 get_margin_contract() 接口,专门用于获取当前信用账户下的所有融资融券合约明细。


一、get_margin_contract 接口说明

get_margin_contract() 仅在 PTrade 客户端的两融交易模块可用,调用后返回一个 pandas.DataFrame 对象,每一行代表一笔合约。

核心返回字段

字段名 类型 说明
compact_id str 合约编号
stock_code str 证券代码
compact_type str 合约类别('0'-融资,'1'-融券,'2'-其他负债)
compact_status str 合约状态('0'-开仓未归还,'1'-部分归还,'2'-已过期等)
ret_end_date int 归还截止日(格式:YYYYMMDD)
total_debit float 负债总额
compact_interest float 合约利息金额
real_compact_interest float 日间实时利息金额
repaid_interest float 已还利息

二、核心实现逻辑与Python代码示例

通过在 before_trading_start 或定时任务中调用 get_margin_contract(),筛选状态为未完结(compact_status 为 '0' 或 '1')的合约,并计算距离到期日(ret_end_date)的天数。

import pandas as pd
from datetime import datetime

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)
    # 每天盘前运行风控检查
    run_daily(context, check_margin_risk, time='09:15')

def check_margin_risk(context):
    # 获取所有两融合约
    df_contracts = get_margin_contract()
    
    if df_contracts is None or df_contracts.empty:
        log.info("当前无两融合约信息")
        return
    
    # 过滤出未归还或部分归还的合约 ('0': 开仓未归还, '1': 部分归还)
    active_contracts = df_contracts[df_contracts['compact_status'].isin(['0', '1'])]
    
    if active_contracts.empty:
        log.info("当前无未结清的两融合约")
        return
    
    current_date_int = int(context.blotter.current_dt.strftime('%Y%m%d'))
    current_dt = datetime.strptime(str(current_date_int), '%Y%m%d')
    
    for idx, row in active_contracts.iterrows():Sub_code = row['stock_code']
        compact_id = row['compact_id']
        compact_type = '融资' if row['compact_type'] == '0' else ('融券' if row['compact_type'] == '1' else '其他')
        ret_end_date = row['ret_end_date']
        
        # 计算到期剩余天数
        end_dt = datetime.strptime(str(ret_end_date), '%Y%m%d')
        days_left = (end_dt - current_dt).days
        
        # 累计未还利息 = 合约利息 + 实时利息
        unpaid_interest = row.get('compact_interest', 0.0) + row.get('real_compact_interest', 0.0)
        total_debit = row.get('total_debit', 0.0)
        
        log.info(f"合约[{compact_id}] 标的:{Sub_code} 类型:{compact_type} | 负债总额:{total_debit:.2f} | 未还利息:{unpaid_interest:.2f} | 归还截止日:{ret_end_date} (剩余 {days_left} 天)")
        
        # 风控预警:若合约将在 15 天内到期,触发日志提醒
        if days_left <= 15:
            log.warning(f"【两融预警】合约[{compact_id}] 标的:{Sub_code} 即将在 {days_left} 天后到期,请及时还款/还券!")

def handle_data(context, data):
    pass

三、注意事项

  1. 实盘环境限制get_margin_contract() 仅在两融实盘/模拟盘交易环境中可用,研究和普通股票回测环境调用会返回 None
  2. 利息计算:未还利息建议综合考量 compact_interest(合约固定计算利息)与 real_compact_interest(日间动态实时利息)。
  3. 自动化还款结合:监控到即将到期的融资合约后,可结合 margincash_direct_refund(value) 进行直接还款,或使用 margincash_close 卖券还款。