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

joinquant 平台如何初始化信用账户并执行融券卖出(marginsec_open)?(附 Python 源码)

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

问题描述

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

Title: joinquant 融券卖出实战:subportfolios 配置与 marginsec_open API 详解

Question: 如何在 joinquant 中初始化信用账户并进行融券卖出(marginsec_open)操作?

解决方案

joinquant 融券卖出实战:subportfolios 配置与 marginsec_open API 详解

在 JoinQuant(聚宽)平台进行融资融券交易时,默认的股票账户(type='stock')不支持信用交易。为了成功执行融券卖出(marginsec_open),必须先对策略的子账户(subportfolios)进行初始化设置,将其账户类型指定为信用账户(stock_margin)。


一、核心步骤与 API 详解

1. 初始化信用账户 (set_subportfolios)

必须在 initialize 函数中设置账户类型为 stock_margin,才可以调用融券相关 API:

set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='stock_margin')])

2. 设置融券费率与保证金比率(可选)

可以在 initialize 中对融券利率和融券保证金比率进行设定:

  • set_option('marginsec_interest_rate', 0.10):设置融券年化利率(默认 10%)。
  • set_option('marginsec_margin_rate', 1.0):设置融券保证金比率(默认 100%)。

3. 执行融券卖出 (marginsec_open)

调用 marginsec_open 函数进行融券卖出开仓:

marginsec_open(security, amount, style=None, pindex=0)
  • security:标的代码(例如 '000001.XSHE')。
  • amount:融券卖出的股数(必须为正整数)。
  • style:下单类型,如 MarketOrderStyle()(市价单)或 LimitOrderStyle(price)(限价单)。
  • pindex:子账户索引,默认为 0

4. 获取可融券标的列表 (get_marginsec_stocks)

在下单前,建议检查目标股票是否在交易所公布的可融券标的列表中:

marginsec_stocks = get_marginsec_stocks()
if security in marginsec_stocks:
    marginsec_open(security, 1000)

二、完整 Python 实战策略源码

以下是一个简单的融券卖出策略示例:在开盘时检查标的是否支持融券,若满足条件则执行融券卖出,并在后续买券还券(marginsec_close)。

# 导入聚宽函数库
import jqdata

def initialize(context):
    # 设定基准
    set_benchmark('000300.XSHG')
    # 开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    # 1. 初始化信用账户 (必须指定 type='stock_margin')
    init_cash = context.portfolio.starting_cash
    set_subportfolios([SubPortfolioConfig(cash=init_cash, type='stock_margin')])
    
    # 2. 设置融券参数
    set_option('marginsec_interest_rate', 0.10)  # 年化融券利率 10%
    set_option('marginsec_margin_rate', 1.0)     # 融券保证金比率 100%
    
    # 设定要操作的股票
    g.security = '000001.XSHE'
    
    # 每日定时运行
    run_daily(market_open, time='10:00')

def market_open(context):
    security = g.security
    
    # 检查是否在可融券列表中
    marginsec_stocks = get_marginsec_stocks()
    if security not in marginsec_stocks:
        log.info("标的 %s 当前不可融券" % security)
        return
    
    # 获取当前持仓
    subportfolio = context.subportfolios[0]
    short_position = subportfolio.short_positions.get(security, None)
    
    # 如果当前没有融券空单持仓,执行融券卖出 1000 股
    if short_position is None or short_position.total_amount == 0:
        order_result = marginsec_open(security, 1000)
        if order_result:
            log.info("成功下达融券卖出订单:%s, 数量: 1000" % security)
    else:
        # 如果已持有融券空单,平仓买券还券示例
        # marginsec_close(security, 1000)
        log.info("当前已持有标的 %s 融券空单 %d 股" % (security, short_position.total_amount))

三、常见问题与注意事项

  1. 报错 Exception: subportfolio type error
    • 原因:未正确初始化信用账户。默认账户类型为 'stock',无法进行融券操作。
    • 解决办法:确保在 initialize 中使用 SubPortfolioConfig(cash=..., type='stock_margin')
  2. 融券还券操作
    • 通过卖出股票获得的资金还款或平仓时,买券还券请使用 marginsec_close API;直接用已有持仓还券请使用 marginsec_direct_refund API。
  3. 数据延时与标的检查
    • get_marginsec_stocks() 依赖交易所前一交易日披露的数据,因此无法查到当前尚未完结交易日的即时变动。