1. 程式人生 > >【筆記】HMM在股票指數中的簡單應用

【筆記】HMM在股票指數中的簡單應用

簡述

過程

隱藏馬爾可夫(HMM)過程本質上,根據顯式的資料,反推隱藏的狀態。 類似於從輸出鏈反推匯出狀態鏈。而每個狀態,都有對應的輸出可能。 這裡假設所有的特徵向量都服從高斯分佈。(這個假設是自然的。中心極限定理,大數定理了解一下~)

關於實現這份程式碼中,遇到了很多坑。

程式碼

  • 環境:Python 3.6 + Windows10
  • 呼叫的所有庫都需要pip install
  • 所呼叫的資料包檔名為 1.csv。下載方式為上面連結中的最後一個的,第二種下載方式
from hmmlearn import hmm
import numpy as np
from matplotlib import pyplot as
plt import pandas as pd n = 6 # 6個隱藏狀態 data = pd.read_csv('1.csv', index_col=0) volume = data['volume'] close = data['close'] logDel = np.log(np.array(data['high'])) - np.log(np.array(data['low'])) logRet_1 = np.array(np.diff(np.log(close))) logRet_5 = np.log(np.array(close[5:])) - np.log(np.array(close
[:-5])) logVol_5 = np.log(np.array(volume[5:])) - np.log(np.array(volume[:-5])) # 保持所有的資料長度相同 logDel = logDel[5:] logRet_1 = logRet_1[4:] close = close[5:] Date = pd.to_datetime(data.index[5:]) A = np.column_stack([logDel, logRet_5, logVol_5]) model = hmm.GaussianHMM(n_components=n, covariance_type="full"
, n_iter=2000).fit(A) hidden_states = model.predict(A) plt.figure(figsize=(25, 18)) for i in range(n): pos = (hidden_states == i) plt.plot_date(Date[pos], close[pos], 'o', label='hidden state %d' % i, lw=2) plt.legend() plt.show() res = pd.DataFrame({'Date': Date, 'logReg_1': logRet_1, 'state': hidden_states}).set_index('Date') series = res.logReg_1 templist = [] plt.figure(figsize=(25, 18)) for i in range(n): pos = (hidden_states == i) pos = np.append(1, pos[:-1]) res['state_ret%d' % i] = series.multiply(pos) data_i = np.exp(res['state_ret%d' % i].cumsum()) templist.append(data_i[-1]) plt.plot_date(Date, data_i, '-', label='hidden state %d' % i) plt.legend() plt.show() templist = np.array(templist).argsort() long = (hidden_states == templist[-1]) + (hidden_states == templist[-2]) # 買入 short = (hidden_states == templist[0]) + (hidden_states == templist[1]) # 賣出 long = np.append(0, long[:-1]) short = np.append(0, short[:-1]) plt.figure(figsize=(25, 18)) res['ret'] = series.multiply(long) - series.multiply(short) plt.plot_date(Date, np.exp(res['ret'].cumsum()), 'r-') plt.show()

資料圖

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

實用性分析

  • 由於採用多因子最後整合的出來的效果,所以,對於交易的時候乘上的那個數值可能是大於1的數(這方面的考量上,這裡最多是2,最小是0)
  • 對於每個因子,以及後期的交易上,都是採用每日收盤價的收益率(即今天的收盤價減去昨天的收盤價)求和之後,再e^x函式外包一下。這裡,我不是很確定跟採用複利的情況下的區別。不過兩者的增幅上都是同一量級的。
  • 最後算整個的情況的時候,是先將整個模型分為買入和賣出兩個部分分別計算之後,再做收益率的求和變化。但實際交易過程中肯定是不可能這麼簡單的分的。
  • 還有,這裡假設了估計是想要錢就來錢的模型。比如說,這裡有可能出現,需要做買入某個指數,和賣出某個指數的操作,當然,做期貨交易的時候,都是需要提交一定的佣金的。這裡沒有考慮這個問題。

不過雖然有很多的瑕疵(和現實的差距過於大),但是作為學習的demo,還是非常好的。

感謝那位師兄分享,和原作大神的分享。