【历史文档】策略示例-期权回测
由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表示不复权
- 获取合约执行价格:
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手行权价最高的看涨期权,进行套利。
\