问题描述
解决方案
在 JoinQuant(聚宽)平台进行融券卖出(开空单),主要使用 marginsec_open 函数。
但在调用该函数之前,必须确保策略账户已初始化为融资融券账户(stock_margin),否则无法执行信用交易。
以下是详细的步骤和代码示例:
核心步骤
- 初始化账户类型:在
initialize函数中,使用set_subportfolios将账户类型设置为'stock_margin'。 - 检查标的:建议先检查该股票是否在融券标的列表内(
get_marginsec_stocks)。 - 下单:调用
marginsec_open(security, amount)进行融券卖出。
API 函数说明
marginsec_open(security, amount, style=None, pindex=0)- 功能:融券卖出(开空)。
- security:标的代码(如
'000001.XSHE')。 - amount:卖出数量(股数),必须为正整数。
- style:下单类型(市价单/限价单),默认为市价单。
完整策略代码示例
以下代码展示了如何配置账户并在开盘时对平安银行进行融券卖出操作:
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
# 1. 设定基准
set_benchmark('000300.XSHG')
# 2. 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 3. 【关键步骤】设置账户类型为融资融券账户 ('stock_margin')
# 如果不设置,默认为普通股票账户('stock'),无法调用 marginsec_open
init_cash = context.portfolio.starting_cash
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='stock_margin')])
# 设定要操作的股票
g.security = '000001.XSHE'
# 每天开盘时运行
run_daily(market_open, time='09:30')
def market_open(context):
security = g.security
# 4. 获取当前可融券的标的列表
margin_sec_stocks = get_marginsec_stocks()
# 检查标的是否在可融券列表中
if security in margin_sec_stocks:
# 获取该标的当前的融券卖出量(空头持仓)
# 注意:融资融券账户中,short_positions 存储融券卖出的仓位
short_position = context.portfolio.short_positions[security].total_amount
# 如果当前没有空头持仓,则进行融券卖出
if short_position == 0:
log.info("标的 %s 在可融券列表中,准备融券卖出" % security)
# 【核心API】融券卖出 1000 股
# 注意:amount 为正数
order_res = marginsec_open(security, 1000)
if order_res:
log.info("融券卖出成功,成交均价: %s" % order_res.price)
else:
log.info("融券卖出失败")
else:
log.info("已有空头持仓,不再开仓")
# 如果需要平仓(买券还券),使用 marginsec_close
# marginsec_close(security, 1000)
else:
log.info("标的 %s 当前不可融券" % security)
注意事项
- 账户类型:必须在
initialize中显式设置type='stock_margin',否则调用marginsec_open会报错或无效。 - 平仓操作:融券卖出后,若要平仓(买入股票归还券商),请使用
marginsec_close(security, amount)函数,或者使用marginsec_direct_refund(security, amount)进行直接还券(前提是账户里已经持有现券)。 - 回测与实盘区别:回测环境中,融券标的列表基于历史数据;模拟交易或实盘中,数据基于交易所最新披露。
- 费率设置:可以通过
set_option('marginsec_interest_rate', value)设置融券利率,默认通常为年化 8% 或 10%(具体视平台默认配置而定)。
Q&A
Q: 调用 marginsec_open 时报错 "Account type not supported" 是什么原因?
A: 这是因为没有在 initialize 中初始化融资融券账户。必须使用 set_subportfolios([SubPortfolioConfig(..., type='stock_margin')]) 将账户类型设为 stock_margin。
Q: 融券卖出后如何查询持仓?
A: 融券卖出属于空头仓位,可以通过 context.portfolio.short_positions 字典查询。例如 context.portfolio.short_positions['000001.XSHE'].total_amount。
Q: 融券卖出可以使用限价单吗?
A: 可以。marginsec_open 的第三个参数 style 可以接受 LimitOrderStyle。例如:marginsec_open('000001.XSHE', 1000, style=LimitOrderStyle(10.5)) 表示以 10.5 元的价格限价融券卖出。