期权价值观1.2 不要预测 (附SVM机器学习代码)

论坛 期权论坛 期权     
IQT期权实验室   2019-6-12 11:51   1891   2
一、为什么预测走势是不可能的
1、长期精准预测的前提是强人工智能实现和无限制的海量数据接入,因此在现有的科技水平下是绝对不可能实现的。
2、短期特定时间段里找规律,如果存在的话,可以暂时给人提供额外的收益机会,但它提供的也仅仅是可能性
3、在维度有限,且大量数据中(例如二级市场数据,价格,成交量等等),机器的找规律能力远强于人(速度,客观性,误差性)

用SVM模型通过几组简易的技术指标获得的夏普比率






因此,显而易见,既然机器都找不到“圣杯”,“瞳术大师”们,更加别想找到了

二、正确的交易理念
(一)关注点
1、隐含与历史波动率
波动率分为历史波动率和隐含波动率两种
1)历史波动率
历史波动率描述了股票或指数在特定时期内的价格变动情况。
期权就像保险一样,就像保险公司需要查看索赔历史记录和一般事故统计数据一样,历史波动率是我们用来计算盈亏概率的重要依据。

2)隐含波动率
隐含波动率是根据期权需求计算的,而不是根据过去发生的一系列数字计算的,因此,我们应该将隐含波动率视为期权的价格。

隐含波动率可以用来评估期权是变贵了还是更加便宜了
如果隐含波动率与历史波动率相同,则市场对期权的定价与历史价格变动相同;
如果隐含波动率低于历史波动率,则市场预计该标的价格不久会非常稳定,期权价格更加便宜;如果隐含波动率高于历史波动率,则市场预计该标的价格不久会更加动荡,期权更加昂贵。

对市场预期的不同所导致的合约供求关系变化是导致隐含波动率变动的根本原因,因此,隐含波动率也可被视为期权交易的恐惧指标


2、标的资产的变化
当市场价格出现大幅波动时,期权价格会上涨。但是市场不会永远处于恐慌模式,价格最终将趋于稳定。当市场处于相对平静或状态时,那么会有更多的期权卖家,而买家会相对较少(因为买保险的用处不如之前那么大了),从而期权价格会下降。通常,股票期权价格随着股票价格的下降而增加(此时期权的保险作用体现在,保护股票资产的疯狂下跌)。相反,商品期权价格随着商品价格的上涨而趋于增加(此时期权的保险作用体现在,防止原材料价格疯狂上涨)。

3、希腊字母
1)对仓位做微调和平衡,保证始终处于Delta Neutral
2)微调的另一个注意点是,保证我们的整体持仓的Vega在一个相对合理范围内,即Theta/Vega比

4、移仓
我们可以移仓至同一月份离平价更远的位置,并增加我们的头寸规模,也可以移仓至后一个月份,但不提高我们的头寸规模,或者将两者结合。

(二)交易纪律
1、果断执行
如果触发了你之前设置的调仓条件,请立刻执行,不要延缓。或者视而不见,这样的做法只会增加损失得不偿失。

2、客观接受亏损,不要抱有侥幸
当头寸开始亏损时,不要期望事情会好转。没有人能准确预测未来,从博弈的角度看,如果市场是可预测的,那么我们谁也无法从中获利。期权交易是概率游戏,我们只有不断剔除低概率盈利高概率亏损的仓位(接受有限的损失),把资金解放出来,放在高概率盈利低概率亏损的新仓位上,才能使我们长期保持稳定盈利。

3、仓位管理
留足40%-50%的资金以应对极端情况下所需要进行的调整(例如:跳空现象)

4、调仓的目的是为了减少风险
不要对可能的损失感到焦虑,从而建立更加激进的仓位,这样只会让你陷入比现在更糟糕的境地。



文章涉及的SVM的Python代码
  1. from sklearn import mixture as mix
  2. from sklearn.preprocessing import StandardScaler
  3. from sklearn.svm import SVC
  4. import numpy as np
  5. import pandas as pd
  6. from pandas_datareader import data as web
  7. import matplotlib.pyplot as plt
  8. #导入数据
  9. df = web.get_data_yahoo('510050.ss', start='2005-01-01', end='2019-06-11')
  10. df = df[['Open', 'High', 'Low', 'Close']]

  11. n = 11 #回顾
  12. t = 0.8 #用于训练数据的百分比,这里我们选择用80%的数据来训练
  13. split = int(t * len(df))#对数据按照上面比例切割
  14. df['high'] = df['High'].shift(1) #
  15. df['low'] = df['Low'].shift(1) #
  16. df['close'] = df['Close'].shift(1) #
  17. df['HL Range'] = df['high']-df['low']# High Low Range
  18. df['20MA-50MA'] = df['close'].shift(1).rolling(window=20).mean()-df['close'].shift(1).rolling(window=50).mean() #20MA-50MA
  19. df['50MA-200MA'] = df['close'].shift(1).rolling(window=50).mean()-df['close'].shift(1).rolling(window=200).mean() #50MA-200MA
  20. df['SMA'] = df['close'].rolling(window=n).mean()
  21. # # Corr
  22. df['Corr'] = df['SMA'].rolling(window=n).corr(df['close'])
  23. df['Corr'][df.Corr > 1] = 1
  24. df['Corr'][df.Corr < -1] = -1
  25. #结果以开盘计算,我们开盘价没有往前放一格,所以正好可以用来计算,再者我们的建仓策略也是开盘前先下单
  26. df['Return'] = np.log(df['Open'] / df['Open'].shift(1))

  27. df = df.dropna()#去掉NAN数据,数据处理的核心公式,这样我们可以把指标数据统一起来
  28. ss1 = StandardScaler()
  29. unsup = mix.GaussianMixture(n_components=4,covariance_type="spherical",n_init=100,random_state=42)
  30. df = df.drop(['High', 'Low', 'Close'], axis=1)
  31. unsup.fit(np.reshape(ss1.fit_transform(df[:split]), (-1, df.shape[1])))
  32. regime = unsup.predict(np.reshape(ss1.fit_transform(df[split:]),(-1, df.shape[1])))
  33. Regimes = pd.DataFrame(regime, columns=['Regime'], index=df[split:].index).join(df[split:], how='inner')\
  34.     .assign(MKT_Return_Cu=df[split:].Return.cumsum()).reset_index(drop=False).rename(columns={'index': 'Date'})


  35. ss2 = StandardScaler()
  36. columns = Regimes.columns.drop(['Regime', 'Date'])
  37. Regimes[columns] = ss2.fit_transform(Regimes[columns])
  38. #创建了一个信号列,它将作为预测值,该算法将训练特征集以预测该信号
  39. Regimes['Signal'] = 0
  40. Regimes.loc[Regimes['Return'] > 0, 'Signal'] = 1
  41. Regimes.loc[Regimes['Return'] < 0, 'Signal'] = -1
  42. Regimes['return'] = Regimes['Return'].shift(1)
  43. Regimes = Regimes.dropna()#去掉NAN数据
  44. #创建SVC模型
  45. cls = SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0,decision_function_shape=None, degree=3,
  46.           gamma='auto', kernel='rbf',max_iter=-1, probability=False, random_state=None, shrinking=True,
  47.           tol=0.001, verbose=False)

  48. #再次分成训练和测试数据。 使用这个新的数据组来训练SVM
  49. split2 = int(t* len(Regimes))
  50. X = Regimes.drop(['Signal', 'Return', 'MKT_Return_Cu', 'Date'], axis=1)
  51. y = Regimes['Signal']
  52. cls.fit(X[:split2], y[:split2])

  53. pdata = len(X) - split2#用于预测
  54. #将SVC的预测保存为Signal_PREV基于这些信号
  55. df['Signal_PREV'] = 0#创建一个Signal_PREV系列
  56. df.iloc[-pdata:, df.columns.get_loc('Signal_PREV')] = cls.predict(X[split2:])
  57. print(df['Signal_PREV'][-pdata:])#列出SVC的预测信号
  58. df['str_ret'] = df['Signal_PREV'] * df['Return'].shift(-1)#当天信号与第二天开盘回报相乘来计算策略的回报
  59. #计算累积SVM回报和累计市场回报
  60. df['SVM_return_Cu'] = 0
  61. df['MKT_Return_Cu'] = 0
  62. df.iloc[-pdata:, df.columns.get_loc('SVM_return_Cu')] = np.nancumsum(df['str_ret'][-pdata:])
  63. df.iloc[-pdata:, df.columns.get_loc('MKT_Return_Cu')] = np.nancumsum(df['Return'][-pdata:])
  64. Sharpe = (df['SVM_return_Cu'][-1] - df['MKT_Return_Cu'][-1])/np.nanstd(df['SVM_return_Cu'][-pdata:])
  65. #作图
  66. plt.figtext(0.12, 0.93, s='Sharpe ratio: %.2f' % Sharpe)#夏普比率
  67. plt.plot(df['SVM_return_Cu'][-pdata:], color='b', label='SVM Returns')#SVM策略回报率
  68. plt.plot(df['MKT_Return_Cu'][-pdata:], color='r', label='Market Returns')#市场回报率
  69. plt.legend(loc='best')
  70. plt.show()
复制代码

分享到 :
4 人收藏

2 个回复

倒序浏览
comlkx  5级知名 | 2019-6-12 14:28:38
代码终于可以运行了,谢谢大佬的分享
围猎人  4级常客  职业散户,开始做期权 | 2019-6-14 20:55:32
谢谢
高级模式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:95
帖子:14
精华:0
期权论坛
发布
内容

下载期权论坛手机APP