生活随笔
收集整理的這篇文章主要介紹了
【笔记】HMM在股票指数中的简单应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
簡述
這里要感謝一位研究生師兄分享了我這篇文章
https://www.ricequant.com/community/topic/788/
本文,是對上面文章的梳理,并做出了在本地條件下使用的代碼
過程
隱藏馬爾可夫(HMM)過程本質上,根據顯式的數據,反推隱藏的狀態。
類似于從輸出鏈反推導出狀態鏈。而每個狀態,都有對應的輸出可能。
這里假設所有的特征向量都服從高斯分布。(這個假設是自然的。中心極限定理,大數定理了解一下~)
關于實現這份代碼中,遇到了很多坑。
- pandas.Series.multiply()含義解釋
- pandas.DataFrame.multiply()含義解釋
- 【解決辦法】read_csv()第一列作為index
- DeprecationWarning: Function log_multivariate_normal_density is deprecated; The function log_multiva
- 如何下載滬深300歷史數據
- 考慮到jupyter上的連續性操作,和普通的Python腳本之間的不同,所以,我們需要調用np.argsort()來得到最優的幾個判斷因子。
代碼
- 環境: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 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_1templist = []
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,還是非常好的。
感謝那位師兄分享,和原作大神的分享。
總結
以上是生活随笔為你收集整理的【笔记】HMM在股票指数中的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。