【筆記】HMM在股票指數中的簡單應用
阿新 • • 發佈:2018-12-10
簡述
過程
隱藏馬爾可夫(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,還是非常好的。
感謝那位師兄分享,和原作大神的分享。