问题描述
解决方案
在聚宽(JoinQuant)平台中,默认的账户类型是股票账户(stock)。若要进行期货交易,必须在 initialize 函数中显式地使用 set_subportfolios 函数将账户类型配置为期货账户(futures)。
以下是具体的代码实现及详细说明。
初始化期货账户代码示例
# -*- coding: utf-8 -*-
def initialize(context):
# 1. 设定初始资金
# 这里假设初始资金为 500,000 元
init_cash = 500000
# 2. 设置账户类型为期货
# type='futures' 同时支持商品期货和金融期货
# 如果不调用此函数,默认账户类型为 'stock',无法交易期货
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
# 3. 设置基准
# 期货策略通常不使用默认的沪深300作为基准,建议设置为相关的主力合约或指数
# 例如:螺纹钢主力合约
set_benchmark('RB9999.XSGE')
# 4. 开启动态复权模式(真实价格)
# 强烈建议开启,以确保回测价格与真实市场一致
set_option('use_real_price', True)
# 5. (可选) 设置期货保证金比例
# 如果不设置,系统会使用默认保证金比例(通常为交易所标准)
# 这里设置为 15%
set_option('futures_margin_rate', 0.15)
# 6. (可选) 设置手续费
# 设置期货交易手续费,例如万分之 0.23
set_order_cost(OrderCost(open_commission=0.000023,
close_commission=0.000023,
close_today_commission=0.0023,
min_commission=0), type='futures')
# 7. (可选) 设置滑点
# 期货通常使用跳数滑点,例如 1 跳
set_slippage(StepRelatedSlippage(1), type='futures')
# 打印日志确认初始化完成
log.info("期货账户初始化完成")
def handle_data(context, data):
# 策略逻辑写在这里
pass
关键函数说明
1. set_subportfolios
这是初始化期货账户的核心函数。
- 语法:
set_subportfolios([SubPortfolioConfig(cash, type)]) - 参数:
cash: 账户的初始资金。type: 账户类型。期货交易必须设置为'futures'。该类型包含了商品期货和股指期货。
- 注意: 如果不调用此函数,系统默认创建的是股票账户,此时调用
order等函数交易期货会报错。
2. set_benchmark
- 默认基准是沪深300(
000300.XSHG)。 - 对于期货策略,建议将其修改为对应的期货主力合约(如
RB9999.XSGE)或相关指数,以便更准确地计算 Alpha 和 Beta 等风险指标。
3. set_option('futures_margin_rate', value)
- 用于调整保证金比例。
value是一个浮点数,例如0.1代表 10%。- 也可以针对特定品种设置,例如
set_option('futures_margin_rate.RB', 0.1)。
Q&A
Q: 我可以同时交易股票和期货吗?
A: 可以。你需要配置多个子账户(SubPortfolio)。例如:
set_subportfolios([
SubPortfolioConfig(cash=500000, type='stock'), # 仓位索引 pindex=0
SubPortfolioConfig(cash=500000, type='futures') # 仓位索引 pindex=1
])
下单时需要指定 pindex 参数,例如 order('RB9999.XSGE', 1, pindex=1)。
Q: type='index_futures' 和 type='futures' 有什么区别?
A: 在旧版 API 中,index_futures 指金融期货。现在建议统一使用 type='futures',它涵盖了商品期货和金融期货(股指期货、国债期货)。
Q: 初始化后如何获取账户资金信息?
A: 可以通过 context.portfolio 获取。
context.portfolio.available_cash: 可用资金。context.portfolio.total_value: 总权益(包含持仓盈亏)。- 如果是多账户模式,需通过
context.subportfolios[i]获取对应子账户信息。