期货与两融函数
A 股只能做多,想做空或加杠杆就得用期货或融资融券。聚宽为这两类市场提供了专用 API,本章分别讲解。
一、期货:先开通期货账户
聚宽默认的子账户是股票类型(type='stock'),不能直接交易期货。买卖期货必须在 initialize 中把子账户设为期货类型:
def initialize(context):
init_cash = context.portfolio.starting_cash
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='futures')])
run_daily(market_open, time='every_bar', reference_security='RB9999.XSGE')
期货有夜盘,
reference_security要改成对应品种的主力合约,否则时间对不上。
二、期货合约与主力
聚宽用三种代码表示期货:
| 类型 | 代码格式 | 示例 | 能否下单 |
|---|---|---|---|
| 具体合约 | 品种+月份+.交易所 | RB1909.XSGE | 可以 |
| 主力连续 | 品种+9999 | RB9999.XSGE | 不可下单 |
| 品种指数 | 品种+8888 | RB8888.XSGE | 不可下单 |
下单前必须先拿到主力对应的具体合约:
# 获取当前主力合约代码
dominant = get_dominant_future('IF') # 返回如 'IF1608.CCFX'
# 获取某品种所有可交易合约
contracts = get_future_contracts('IF') # 返回列表
三、期货下单
期货下单函数和股票一样(order / order_target / order_value / order_target_value),区别在于多了 side 和 close_today:
# 开 1 手沪深 300 股指期货空单
order('IF1608.CCFX', 1, side='short')
# 开 5 手多单
order('IF1608.CCFX', 5, side='long')
# 平 1 手多单(负数 + 同方向)
order('IF1608.CCFX', -1, side='long')
用
order_target开平时,直接对目标方向操作:order_target(code, 5, side='short')把空头调到 5 手。
四、期货保证金
通过 set_option 设置保证金比例:
set_option('futures_margin_rate', 0.10) # 全局 10%
set_option('futures_margin_rate.AU', 0.09) # 黄金 9%
set_option('futures_margin_rate.IF', 0.15) # 股指 15%
保证金不足会被强平,可用 is_dangerous 预警:
if context.subportfolios[0].is_dangerous(0.2):
log.warn('保证金低于 20%,有强平风险')
五、融资融券:开通两融账户
同样要在 initialize 中把子账户类型设为 stock_margin:
def initialize(context):
init_cash = context.portfolio.starting_cash
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='stock_margin')])
# 融资利率、保证金比率等
set_option('margincash_interest_rate', 0.08) # 融资年化 8%
set_option('marginsec_interest_rate', 0.10) # 融券年化 10%
set_option('marginsec_margin_rate', 1.5) # 融券保证金比率 150%
六、融资操作
| 函数 | 含义 |
|---|---|
margincash_open(security, amount) | 融资买入 |
margincash_close(security, amount) | 卖券还款 |
margincash_direct_refund(value) | 直接还款(现金还负债) |
margincash_open('000001.XSHE', 1000) # 融资买入 1000 股
margincash_direct_refund(100000) # 直接还款 10 万
七、融券操作
| 函数 | 含义 |
|---|---|
marginsec_open(security, amount) | 融券卖出(做空) |
marginsec_close(security, amount) | 买券还券 |
marginsec_direct_refund(security, amount) | 直接还券(用已有持仓还) |
marginsec_open('000001.XSHE', 1000) # 融券卖出 1000 股
marginsec_close('000001.XSHE', 1000) # 买回 1000 股还券
八、两融数据查询
| 函数 | 含义 |
|---|---|
get_margincash_stocks() | 当前可融资标的列表 |
get_marginsec_stocks() | 当前可融券标的列表 |
get_mtss(security_list, start_date, end_date) | 融资融券余额/买入额等历史数据 |
if '000001.XSHE' in get_margincash_stocks():
margincash_open('000001.XSHE', 1000)
九、多账户组合
可以把资金分到不同类型的子账户,实现跨市场组合:
cash = context.portfolio.starting_cash / 2
set_subportfolios([
SubPortfolioConfig(cash=cash, type='stock'), # 股票
SubPortfolioConfig(cash=cash, type='stock_margin'), # 融资融券
])
# 下单时用 pindex 指定子账户
order('000001.XSHE', 100, pindex=0)
小结
期货需设 type='futures' 子账户,先取主力具体合约再下单,用 side 区分多空;两融需设 type='stock_margin',融资用 margincash_open、融券用 marginsec_open。下一步学回测配置与风险指标:策略回测。