日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【笔记】HMM在股票指数中的简单应用

發布時間:2025/4/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【笔记】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 # 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在股票指数中的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。