3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在融资融券(两融)交易中,合约一般有最长持仓期限(通常为6个月)。如果合约临近到期未及时归还,可能引发柜台强制平仓风险。此外,实时监控未还利息与负债金额也是精细化资金管理的重要一环。
PTrade 提供了 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 | 已还利息 |
通过在 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
get_margin_contract() 仅在两融实盘/模拟盘交易环境中可用,研究和普通股票回测环境调用会返回 None。compact_interest(合约固定计算利息)与 real_compact_interest(日间动态实时利息)。margincash_direct_refund(value) 进行直接还款,或使用 margincash_close 卖券还款。