历史文档

【历史文档】策略示例-期权回测

由small_q创建,最终由small_q 被浏览 450 用户

更新

本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明

新版量化开发IDE(AIStudio):

https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW

新版模版策略:

https://bigquant.com/wiki/doc/demos-ecdRvuM1TU

新版数据平台:

https://bigquant.com/data/home

https://bigquant.com/wiki/doc/dai-PLSbc1SbZX

新版表达式算子:

https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS

新版因子平台:

https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5

\

导语

期权作为一种非线性的金融衍生产品,在风险管理、投资组合构建方面有着重要作用,善用期权可以带来更好的风险收益情况。BigQuant平台上提供期权策略回测功能,本篇会通过两个常见的期权交易策略对此功能进行介绍。目前只支持金融期权的回测研究,未来会支持商品期权,期权回测功能我们也会逐步升级完善。

关于期权交易策略

相比于股票和期货,期权是一种更为复杂也更为灵活的投资工具。利用传统的投资工具,投资者只能通过判断市场的涨跌获取收益,而利用期权,无论是趋势市还是震荡市,投资者都有相应的策略来捕获盈利并控制风险。

我国A股市场可以交易的期权合约只有50ETF期权合约,所以我们可以通过组合股票指数和期权来构建期权交易策略。以看涨期权为例,常用的期权交易策略有:

  • 卖出备兑看涨期权:即持有标的物(股票指数)的同时卖出看涨期权
  • 卖出裸看涨期权:即没有标的持仓,直接卖空看涨期权
  • 看涨期权价差:在买入一个看涨期权的同时卖出另一个看涨期权,两个期权标的相同
  • 牛市跨期价差:卖出近期的看涨期权和买入较远期的看涨期权,但标的股票价格会比这些看涨期权的行权价低一定的幅度
  • 蝶式价差:同时买入1手行权价最低的和最高的看涨期权,卖出2手中间行权价的看涨期权

后文将利用BigQuant平台复现“卖出备兑看涨期权”和“蝶式价差”策略。

如何进行期权策略回测

设置策略基本参数 => 根据策略逻辑编写回测主体函数 => 启动回测

下面将按照以上步骤的顺序,介绍期权回测中涉及的基本设置、函数和功能性api:

基本参数

  • 回测起始时间
# 回测起始时间
start_date = '2019-06-27'
# 回测结束时间
end_date = '2019-07-03'
  • 策略参考标准
# 策略比较参考标准,以沪深300为例
benchmark = '000300.SHA'
  • 交易标的:50ETF期权合约
instruments = ['510050.HOF'] #tareget product
  • 起始资金
capital_base = 1000000

回测主体

回测主体包含初始化、盘前设置、盘中处理三个函数,需要用到几个设置。

  • 设置手续费:
set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=3)) 
  • 设置合约单位 :
sid.set_multiplier(1.0)  # 设置合约单位为一手
  • 设置期权方向:
  • 看涨:用1表示,或者直接用OptionType.CALL表示,一般和数据api配合使用
  • 看跌:用0表示,或者直接用OptionType.PUT表示,一般和数据api配合使用
from zipline.finance.constants import OptionType
sid1 = context.lookup_option_asset('510050.HOF', '201908', 2.70, OptionType.CALL, 0)
  • 转化为symbol对象:
# 标的物转换成symbol对象
context.symbol('510050.HOF')
# 期权合约转换成symbol对象
context.future_symbol('1001889.SHAO')
  • 获取期权合约:
context.lookup_option_asset(underlying, month_time, strike_price, option_type, adjust_flag)
  • underlying,标的物,str
  • month_time,期权到期月份,str,格式为‘yyyymm’
  • strike_price,执行价,float
  • option_type,期权方向,float,1表示看涨,0表示看跌
  • adjust_flag=0,是否复权,1表示复权,0表示不复权
  1. 获取合约执行价格:
context.get_option_strike_prices(underlying, month_time)
  • underlying,标的物,str
  • month_time,期权到期月份,str,格式为‘yyyymm’

一般来讲,在初始化函数中设置交易手续费(只在第一个交易日运行),在盘前设置函数中获取日期等信息(每日运行),在盘中处理函数中实现策略逻辑(每日运行),进行买卖操作。一个示例代码如下:

[details="示例代码"]
# 初始化函数:初始化虚拟账户状态,只在第一个交易日运行
def initialize(context):
    print("initialize")
    context.set_commission(futures_commission=PerContract(cost={'IF':(0.0023, 0.0015, 0.0023)}))
    context.index = 0

# 盘前设置函数:每日运行,得到交易日期
def before_trading_start(context, data):
    print("before_trading_start:", data.current_dt)
    pass

# 盘中处理函数:每日运行,进行交易
def handle_data(context, data):
    context.index += 1
    if context.index == 1:
        sid1=context.symbol('510050.HOF')
 
        context.order(sid1,1000)
        sid2 = context.lookup_option_asset('510050.HOF', '201908',3.0, OptionType.CALL, 0)
        sid2.set_multiplier(1.0)
        context.order(sid2, -10)
    [/details]

启动回测

M.trade.v4(start_date, end_date, handle_data,instruments, options_data, history_ds,bench_mark_ds, prepare, initialize=,before_trading_start, volume_limit,order_price_field_buy,order_price_field_sell,capital_base, benchmark,auto_cancel_non_tradable_orders, data_frequency,price_type, plot_charts,backtest_only, options,amount_integer, m_meta_kwargs)

期权交易策略样例

牛市跨期价差

策略逻辑是卖出近期的看涨期权和买入较远期的看涨期权,但标的股票价格会比这些看涨期权的行权价低一定的幅度。

蝶式价差

策略逻辑是买入1手行权价最低的看涨期权,卖出2手中间行权价的看涨期权,买入1手行权价最高的看涨期权,进行套利。

\

标签

期权风险管理投资组合
评论
  • 该策略运行报错。
  • 启动回测 那段代码有好多变量都没定义
{link}