Stg_13_ShortdeepOTM
策略13文档
1. 策略逻辑介绍
当我们认为市场存在趋势的时候,我们只需要根据均线和市场最近的波动判断走势。如果产生了突破的机会,则我们的策略选择跟随动量short call/put。当在短期内看不到趋势或者趋势不明显的时候,我们选择short strangle来通过承担风险获得时间价值。
2.复权价格计算
对开盘当天之前的历史价格,需要根据日期读取一个权重文件,并用历史价格按照文件内的日期与权重相乘得到复权价格,下一部分的price_hist即使用复权后的价格
3. 信号参数
past_days:采用过去past_days天的日内价格的平均值作为历史价格price_hist原策略13是采用计算price_now的方式计算过去past_days个交易日的平均价格,且没有取对数日内对数均价指的是给定从trade_start_morning到trade_end_morning以及从trade_start_afternoon到trade_end_afternoon10s切片价格 ,则有平均价格price_histintra_obs:采用今天最后intra_obs个10s切片价格的平均作为今天的当天价格,不足intra_obs个时选择今天至少int(intra_obs*min_sample)个切片价格的平均作为今天的价格price_now。除当前切片外,之前的underlying价格均选择10s切片的underlying价格,当前切片则选择最新价格。当切片数量不满足要求时,price_now为空。hist_vol:采用昨天变量atm_vol的算术平均作为波动率原策略13没有这个变量,自然也不需要在计算ratio_now的时候使用这个变量ratio:计算ratio_now的值与ratio作比。当price_now为空时,ratio_now也为空。
4. 期权行权价及到期时间的选择
- 到期时间:选择当前剩余交易日天数大于
min_tenor天的到期时间中最短的那个期限。 - 行权价的选择:主要通过Delta值来完成。选定期限后,对于当前行情中的所有合约而言,当我们只需要开call/put时,选择Delta绝对值范围在
single_delta_low和single_delta_high之间且Delta绝对值最大的合约;当我们需要开strangle时,选择Delta范围在strangle_delta_low和strangle_delta_high之间的,且Delta之和的绝对值小于strangle_delta_bias的合约中delta之和的绝对值最小的合约对。当遇到两个要素完全一致的合约时,对于short方向来说,选择忽略掉ignore_vol后,bid价格最高的。
5. 开仓参数
原策略13有多个下单方向,目前这一策略仅有一个方向,即short
- 在下单前,首先计算准备下单合约的
ask_px1/bid_px1,当该比值小于max_ask_bid_ratio时,订单均直接打对手价成交。 trade_start_morning,trade_end_morning,trade_start_afternoon与trade_end_afternoon:上午和下午开始和结束交易的时间,一般避开开盘后和收盘前的一段时间。- 当策略当前没有持仓的时候,当
ratio_now大于ratio时,空开put,并标记当前状态为short_put;当ratio_now小于-ratio时,空开call,并标记当前状态为short_call;当ratio_now绝对值小于ratio时,空开strangle,标记当前状态为short_strangle;当ratio_now无法计算得出时,当前状态为空。 - 当策略已有持仓的情况下,比较目标状态与当前状态,如果状态不一致,则比较目标合约与当前合约的差别,并下单消除这一差别。
6. 平仓参数
- 当目前持仓是call/put的情况下,在目标状态与当前状态一致的情况下,当持仓合约的delta绝对值值不再介于
single_delta_low_exit和single_delta_high_exit之间时,比较目标合约与当前合约的差距,并下单消除这一差距。 - 当目前持仓是strangle的情况下,在目标状态与当前状态一致的情况下,当持仓的合约delta之和的绝对值大于
strangle_delta_max_bias时,比较目标合约与当前合约的差距,并下单消除这一差距。 - 当目前持仓tenor小于
min_tenor时,平掉当前仓位,并根据目标状态和合约下单。
7. 策略最大开仓手数计算
实盘交易中,已知合约的做空保证金和总可用资金total_capital,开盘前使用昨天14:57:00之前最后一个有效切片计算strangle组合所能开仓的最大手数并向下取整作为策略能开出的最大手数max_now备用,这一数值可以应用在所有开仓方向中。在盘中,max_now会随着strangle组合的变化实时更新,如果暂时没有strangle组合被选出,则选择目前最新的max_now。
8. strangle开平仓算法
若当前最佳档位的挂单手数小于ignore_vol的时候,直接按照下一档定义目标档位。
定义当前目标合约i目标档位上的挂单量为 ,吃单比例为double_max_fak_ratio,则一次下单量为
,当目标档位非最佳档位时,前述下单量公式还需加入最佳档位的挂单手数,下单价格则一直为目标档位价格。
选择执行算法10来完成下单。
9. single开平仓算法
若当前最佳档位的挂单手数小于ignore_vol的时候,直接按照下一档定义目标档位。
定义当前目标合约i目标档位上的挂单量为 ,吃单比例为single_max_fak_ratio,则一次下单量为
,当目标档位非最佳档位时,前述下单量公式还需加入最佳档位的挂单手数,下单价格则一直为目标档位价格。如果没有完全成交,则直接返回成交数量给策略。
当合约i全部收到交易所回执时定义算法状态为完成。
10. 策略调用执行算法逻辑
由于当前合约的delta计算和信号触发是由曲面变化和underlying变化驱动的,因此信号会在underlying行情推送后产生,从而产生调用执行算法的需求。具体而言,当每次执行算法收到完成回执后,根据最新的准备开平仓的合约订单簿来决定开平仓手数(因为期权的推送频率大约是0.5s一笔,而underlying大约是3s一笔,而执行算法消耗时间往往低于0.5s)。当由underlying/surface价格变化带来的信号触发后,第一次下单时记录对手第二档行情价格,记为cost。在收到第一次执行算法回执后,继续下单之前,当且仅当下单价格不差于cost时继续下单(买卖比较方向相反)。如果价格差于cost,则等待下一次信号, 下一次信号更新后,用第二档行情价格更新cost,重复以上过程。如果在调用执行期间状态发生变化,则参考状态转换算法。当组合数量达到max_now时自动停止,因而在确定开平仓手数之前,需要将挂单手数,与策略需求的最大挂单手数取最小值。如果超过pending_seconds秒状态没用变化且仍未完成max_now的数量,则不再调用执行算法。
11.状态转换算法
当信号出现后,给定策略当前等待平掉的(包括正在平仓而没有完成的和当前持有的)组合为 手A,需要开仓的组合为 手B(实际上由于行情变化和流动性, 并不保证同 相等)。 当组合A与B之间存在方向和代码相同的合约时,应当首先平掉 手A,其次开 手组合A与B之间不同的合约。 当组合A与B之间不存在代码和方向相同的合约时,需要根据组合性质选择上面的开平仓算法,首先平掉组合A,而后根据当前最新的信号选择开仓合约和方向。 当算法在执行过程中出现目标状态从A到B再到A的时候,如果这个时候还没完成A的平仓,且A尚未满足平仓条件,则按照当前的max_now继续开原来的A组合 ,而不管最新给出的状态A目标组合 。如果A完成平仓了,则进入正常的状态转换逻辑。
12. 逻辑示意图
交易服务器信号收集
| 信号 | 信号变量名称 |
|---|---|
| 策略名称 | Strategy |
| 策略参数组 | ParameterGroup |
| 目标状态 | target_state |
| 当前状态 | current_state |
| 当前价格 | price_now |
| 当前动量 | ratio_now |
| 持仓delta | delta |
| 最大开仓 | max_now |
| 目标put | target_put |
| 目标call | target_call |
| 当前put | current_put |
| 当前call | current_call |