问题描述
解决方案
在聚宽(JoinQuant)平台上实现融资买入(融资融券)策略,与普通股票买卖的主要区别在于账户类型的初始化以及下单函数的选择。
以下是实现融资买入策略的核心步骤和完整代码示例。
核心步骤说明
- 初始化账户类型:在
initialize函数中,必须使用set_subportfolios将账户类型设置为'stock_margin'(信用账户)。默认情况下是普通账户,无法进行融资融券操作。 - 检查融资标的:使用
get_margincash_stocks()获取当前市场上可融资买入的股票列表,确保操作的标的在列表中。 - 融资买入下单:使用
margincash_open(security, amount)函数进行融资买入。 - 卖券还款:使用
margincash_close(security, amount)卖出股票并偿还融资负债。
策略代码示例
这是一个简单的策略示例:每天检查指定股票是否为融资标的,如果是且没有持仓,则融资买入;如果有持仓,则卖券还款(仅作演示流程)。
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
"""
初始化函数
"""
# 1. 设定基准
set_benchmark('000300.XSHG')
# 2. 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 3. 【关键步骤】设置账户类型为融资融券账户
# type='stock_margin' 表示这是一个信用账户,可以进行融资融券
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='stock_margin')])
# 设定要操作的股票,例如:平安银行
g.security = '000001.XSHE'
# 每天开盘时运行
run_daily(market_open, time='09:30')
def market_open(context):
"""
每日交易逻辑
"""
security = g.security
# 4. 获取当前市场上所有可融资的标的列表
# 注意:该列表随日期变化,必须动态获取
margin_cash_stocks = get_margincash_stocks()
# 检查标的是否可融资
if security not in margin_cash_stocks:
log.warn("股票 %s 当前不可融资买入,跳过交易" % security)
return
# 获取当前该股票的持仓信息
position = context.portfolio.positions[security]
# --- 交易逻辑演示 ---
# 如果当前没有持仓,尝试融资买入
if position.total_amount == 0:
log.info("账户无持仓,准备融资买入: %s" % security)
# 5. 【融资买入】下单函数:margincash_open
# 参数:标的代码,数量(股)
# 注意:这里下单 1000 股,实际会消耗保证金并产生融资负债
order = margincash_open(security, 1000)
if order:
log.info("融资买入下单成功,成交价:%.2f" % order.price)
else:
log.info("融资买入下单失败(可能是资金不足或停牌)")
# 如果有可卖持仓,尝试卖券还款(这里仅演示API用法,实际策略需结合止盈止损逻辑)
elif position.closeable_amount > 0:
log.info("账户有持仓,准备卖券还款: %s" % security)
# 6. 【卖券还款】下单函数:margincash_close
# 卖出股票获得的资金会自动优先偿还融资负债
margincash_close(security, position.closeable_amount)
关键 API 详解
-
set_subportfolios:- 必须在
initialize中调用。 type='stock_margin'是启用融资融券功能的开关。如果不设置,调用margincash_open会报错。
- 必须在
-
get_margincash_stocks():- 返回一个列表,包含当前交易日所有允许融资买入的股票代码。
- 交易所会定期调整该列表,因此建议在下单前进行校验。
-
margincash_open(security, amount):- 融资买入。
amount: 买入的股数。- 该操作会增加账户的
total_assets(总资产)和total_liability(总负债),同时扣除available_margin(可用保证金)。
-
margincash_close(security, amount):- 卖券还款。
- 卖出股票,所得资金优先偿还该股票对应的融资负债。
风险提示
- 利息:融资融券会产生利息,聚宽回测中默认融资年化利率为 8%(可通过
set_option('margincash_interest_rate', 0.08)修改)。 - 保证金:系统会自动计算维持担保比例,如果担保比例过低可能会触发强平(虽然回测中通常只在资金不足时限制开仓,但实盘需严格注意)。