问题描述
解决方案
在聚宽(JoinQuant)策略中,下达融资买入(向券商借钱买入股票)指令,主要使用 margincash_open 函数。
关键注意事项:
默认情况下,聚宽策略的账户类型是普通股票账户(stock)。要进行融资融券操作,必须在 initialize 函数中通过 set_subportfolios 将账户类型设置为融资融券账户(stock_margin)。
以下是具体的步骤和代码示例:
核心步骤
- 初始化账户:在
initialize中设置type='stock_margin'。 - 检查标的:建议使用
get_margincash_stocks()检查标的是否属于可融资标的。 - 下达指令:调用
margincash_open(security, amount)进行融资买入。
策略代码示例
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
# 1. 设定账户为融资融券账户 (必须步骤)
# 如果不设置,默认为普通账户,无法调用融资接口
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='stock_margin')])
# 设定沪深300作为基准
set_benchmark('000300.XSHG')
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 设定融资利率 (可选,默认8%)
set_option('margincash_interest_rate', 0.08)
# 设定融资保证金比率 (可选,默认100%)
set_option('margincash_margin_rate', 1.0)
# 每天开盘时运行
run_daily(market_open, time='09:30')
def market_open(context):
security = '000001.XSHE' # 平安银行
# 2. 获取当前市场上所有可融资的标的列表
margin_stocks = get_margincash_stocks()
# 检查标的是否可融资
if security in margin_stocks:
# 3. 下达融资买入指令
# 参数:标的代码,数量(股)
# 这里的 1000 表示融资买入 1000 股
order = margincash_open(security, 1000)
if order:
log.info(f"融资买入成功: {security}, 数量: 1000")
else:
log.info(f"融资买入失败: {security}")
else:
log.info(f"{security} 不是融资标的,无法进行融资买入")
# 打印当前账户的融资负债
# cash_liability 代表融资负债金额
log.info(f"当前融资负债: {context.portfolio.cash_liability}")
API 函数说明
margincash_open
用于融资买入标的。
- 函数原型:
margincash_open(security, amount, style=None, pindex=0) - 参数:
security: 标的代码(如 '000001.XSHE')。amount: 交易数量(股数),必须为正数。style: 下单类型,默认为None(市价单),也可以传入LimitOrderStyle(限价单)。pindex: 仓位索引,默认为 0。
- 返回值:
Order对象或者None(如果创建委托失败)。
相关操作补充
融资买入后,通常涉及偿还负债,主要有两种方式:
-
卖券还款 (
margincash_close):
卖出持有的股票,资金自动用于归还融资负债。# 卖出 1000 股平安银行用于还款 margincash_close('000001.XSHE', 1000) -
直接还款 (
margincash_direct_refund):
使用账户内的可用现金直接归还融资负债。# 直接还款 10000 元 margincash_direct_refund(10000)
Q&A
Q: 为什么调用 margincash_open 报错提示没有权限或函数不存在?
A: 最常见的原因是没有在 initialize 函数中初始化融资融券账户。请确保添加了代码:set_subportfolios([SubPortfolioConfig(cash=..., type='stock_margin')])。默认的 type='stock' 不支持融资融券。
Q: 如何查询一只股票是否可以融资买入?
A: 使用 get_margincash_stocks() 函数可以获取当前交易日所有可融资标的的列表。建议在下单前判断目标股票是否在该列表中。
Q: 融资买入的利息和保证金比例是多少?
A: 默认融资利率为年化 8%,默认保证金比例为 100%。您可以通过 set_option('margincash_interest_rate', value) 和 set_option('margincash_margin_rate', value) 在 initialize 中进行修改以匹配您的需求。
Q: 融资买入后,持仓成本 (avg_cost) 如何计算?
A: 融资买入会增加持仓数量,其成本计算逻辑与普通买入一致,即 (原持仓价值 + 新买入价值 + 手续费) / 总数量。但请注意,融资会产生负债 (cash_liability) 和利息 (interest),这些会在账户总资产中体现。