3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 量化平台中,融资融券(两融)交易是实现做空机制和对冲风险的重要手段。本文将详细讲解如何使用 marginsec_open(融券卖出)与 marginsec_close(买券还券)API,并提供一套完整的 Python 策略源码。
在 PTrade 平台进行融券交易时,需要使用两融专用的交易接口:
marginsec_open(security, amount, limit_price=None)
security (str):股票代码,如 '600030.SS'。amount (int):交易数量(正整数)。limit_price (float, 可选):限价价格。若不传则默认取当前最新价委托。marginsec_close(security, amount, limit_price=None)
security (str):股票代码。amount (int):交易数量(正整数)。limit_price (float, 可选):限价价格。get_marginsec_stocks()
get_marginsec_open_amount(security, price=None)
get_marginsec_close_amount(security, price=None)
以下策略基于双均线死叉与金叉逻辑:当 5 日均线向下穿过 10 日均线时触发融券卖出;当 5 日均线向上穿过 10 日均线时触发买券还券。
# PTrade 融资融券实战策略:融券卖出与买券还券
def initialize(context):
# 设置目标做空标的
g.security = '600030.SS'
set_universe(g.security)
# 交易标识,防止同日重复下单
g.short_flag = False
g.cover_flag = False
def before_trading_start(context, data):
# 每日盘前重置交易标识
g.short_flag = False
g.cover_flag = False
# 校验标的是否属于融券标的
sec_stocks = get_marginsec_stocks()
if g.security in sec_stocks:
log.info(f"{g.security} 属于可融券标的")
else:
log.warning(f"{g.security} 当前不可融券,请注意风险")
def handle_data(context, data):
security = g.security
# 获取过去10个交易日的收盘价
df = get_history(10, '1d', 'close', security, fq=None, include=False)
if df is None or len(df) < 10:
return
# 计算 5 日与 10 日移动平均线
ma5 = round(df['close'][-5:].mean(), 3)
ma10 = round(df['close'][-10:].mean(), 3)
# 获取持仓信息
position = get_position(security)
short_amount = position.short_amount # 空头持仓量
# 逻辑 1:死叉(ma5 < ma10)且无空头持仓 -> 融券卖出(做空)
if ma5 < ma10 and short_amount == 0:
if not g.short_flag:
# 查询最大可融券卖出数量
open_info = get_marginsec_open_amount(security)
max_short_amount = open_info.get(security, 0) if open_info else 0
# 设定本次融券卖出数量(例如买入 1000 股或最大可用量)
target_amount = min(1000, max_short_amount)
if target_amount >= 100:
order_id = marginsec_open(security, target_amount)
log.info(f"触发死叉,融券卖出 {security},数量:{target_amount},订单ID:{order_id}")
g.short_flag = True
else:
log.warning(f"可融券数量不足({max_short_amount}),无法下单")
# 逻辑 2:金叉(ma5 > ma10)且存在空头持仓 -> 买券还券(平空)
elif ma5 > ma10 and short_amount > 0:
if not g.cover_flag:
# 查询最大可买券还券数量
close_info = get_marginsec_close_amount(security)
max_close_amount = close_info.get(security, 0) if close_info else 0
target_close = min(short_amount, max_close_amount)
if target_close > 0:
order_id = marginsec_close(security, target_close)
log.info(f"触发金叉,买券还券 {security},数量:{target_close},订单ID:{order_id}")
g.cover_flag = True
else:
log.warning(f"买券还券可用数量不足,当前空头持仓:{short_amount}")
marginsec_open、marginsec_close)仅在 PTrade 客户端的两融交易模块 中有效,普通股票账户或回测环境不支持该接口。get_marginsec_stocks() 和 get_marginsec_open_amount() 检查券商是否有对应券源及足够额度,避免因无券导致报单失败。