用深度學習幫你解析K線圖! - FinLab

文章推薦指數: 80 %
投票人數:10人

股票如何選擇?要怎麼學習量化投資?財報、技術指標如何看?FinLab利用股票分析、財經python教學,讓你在在茫茫股海中,找到專屬於自己的投資方法。

Skiptocontent Tags:CANDLESTICKS,DEEP-LEARNING,K棒,K線圖,LSTM,PYTHON,型態學,深度學習,程式交易 現今在股市裡有三大分析方法,即:技術面、基本面、籌碼面等,而各流派似乎也都有自己能自圓其說的選股策略。

這三種方法並無法直接說出孰好孰壞,分析方法的選擇跟操作者的心態、個性、紀律都有很大的關係。

而我個人覺得買股票除了要買得好(投報率高)以外,賣得快(IRR高)也是很重要的,畢竟投報率會因為時間的流逝而漸漸下降。

因為重視時間對股價影響的我,日K線裡藏有的奧妙便是我想一探究竟的。

K線型態學主要就是在探討每根K棒的開盤價、收盤價、最高價、最低價、以及成交量這五大要素所反映出多空雙方的心理交戰。

日本著名的投資大師本間宗久影響後人而產生一系列「酒田戰法」的相關書籍裡頭便對K線型態學有了不少篇幅的評析。

但人心是會變的,K線型態也是。

有沒有方法能幫助我們解讀每天數百張詭譎多變的K線圖呢? 內容目錄 隱藏 1 長短期記憶(LongShort-TermMemory,LSTM)神經網路 2 LSTM實作股價預測 3 LSTM預測股價結果 4 參考資料 5 附註:現在就開始AI選股,免費取得訓練資料 長短期記憶(LongShort-TermMemory,LSTM)神經網路 長短期記憶(LSTM)神經網路屬於循環神經網路(RNN)的一種,特別適合處理和預測與時間序列相關的重要事件。

以下面的句子做為一個上下文推測的例子: “我從小在法國長大,我會說一口流利的??” 由於同一句話裡前面提及到法國這個國家,且後面提到說這個動作。

因此,LSTM便能從法國以及說這兩個長短期的記憶中重要的訊號推測出可能性較大的法文這個結果。

K線圖也述說著類似的事情,股價是隨著時間的流動及重要訊號的出現而做出反應的: 在價穩量縮的盤整區間中突然出現一帶量突破的大紅K,表示股價可能要上漲了在跳空缺口後出現島狀反轉,表示股價可能要下跌了在連漲幾天的走勢突然出現帶有長上下影線的十字線,表示股價有反轉的可能LSTM要做的事情就是找出一段時間區間的K棒當中有沒有重要訊號(如帶量紅K)並學習之後股價的走勢。

LSTM實作股價預測 資料是以鴻海(2317)從2013年初到2017年底每天的開盤價、收盤價、最高價、最低價、以及成交量等數據,如果你對這筆資料有興趣請參考附註的方式索取。

首先將資料讀入並存至pandas的DataFrame,另外對可能有N/A的row進行剔除: 資料讀入 importpandasaspd foxconndf=pd.read_csv('./foxconn_2013-2017.csv',index_col=0) foxconndf.dropna(how='any',inplace=True) 為了避免原始數據太大或是太小沒有統一的範圍而導致LSTM在訓練時難以收斂,我們以一個最小最大零一正規化方法對數據做正規化: 資料正規化 fromsklearnimportpreprocessing defnormalize(df): newdf=df.copy() min_max_scaler=preprocessing.MinMaxScaler() newdf['open']=min_max_scaler.fit_transform(df.open.values.reshape(-1,1)) newdf['low']=min_max_scaler.fit_transform(df.low.values.reshape(-1,1)) newdf['high']=min_max_scaler.fit_transform(df.high.values.reshape(-1,1)) newdf['volume']=min_max_scaler.fit_transform(df.volume.values.reshape(-1,1)) newdf['close']=min_max_scaler.fit_transform(df.close.values.reshape(-1,1)) returnnewdf foxconndf_norm=normalize(foxconndf) 然後對資料進行訓練集與測試集的切割,另外也定義每一筆資料要有多長的時間框架: 資料編輯 importnumpyasnp defdata_helper(df,time_frame): #資料維度:開盤價、收盤價、最高價、最低價、成交量,5維 number_features=len(df.columns) #將dataframe轉成numpyarray datavalue=df.as_matrix() result=[] #若想要觀察的time_frame為20天,需要多加一天做為驗證答案 forindexinrange(len(datavalue)-(time_frame+1)):#從datavalue的第0個跑到倒數第time_frame+1個 result.append(datavalue[index:index+(time_frame+1)])#逐筆取出time_frame+1個K棒數值做為一筆instance result=np.array(result) number_train=round(0.9*result.shape[0])#取result的前90%instance做為訓練資料 x_train=result[:int(number_train),:-1]#訓練資料中,只取每一個time_frame中除了最後一筆的所有資料做為feature y_train=result[:int(number_train),-1][:,-1]#訓練資料中,取每一個time_frame中最後一筆資料的最後一個數值(收盤價)做為答案 #測試資料 x_test=result[int(number_train):,:-1] y_test=result[int(number_train):,-1][:,-1] #將資料組成變好看一點 x_train=np.reshape(x_train,(x_train.shape[0],x_train.shape[1],number_features)) x_test=np.reshape(x_test,(x_test.shape[0],x_test.shape[1],number_features)) return[x_train,y_train,x_test,y_test] #以20天為一區間進行股價預測 X_train,y_train,X_test,y_test=data_helper(foxconndf_norm,20) 我們以Keras框架做為LSTM的實作選擇,首先在面前加了兩層256個神經元的LSTMlayer,並都加上了Dropout層來防止資料過度擬合(overfitting)。

最後再加上兩層有不同數目神經元的全連結層來得到只有1維數值的輸出結果,也就是預測股價: Keras模型建立 fromkeras.modelsimportSequential fromkeras.layers.coreimportDense,Dropout,Activation fromkeras.layers.recurrentimportLSTM importkeras defbuild_model(input_length,input_dim): d=0.3 model=Sequential() model.add(LSTM(256,input_shape=(input_length,input_dim),return_sequences=True)) model.add(Dropout(d)) model.add(LSTM(256,input_shape=(input_length,input_dim),return_sequences=False)) model.add(Dropout(d)) model.add(Dense(16,kernel_initializer="uniform",activation='relu')) model.add(Dense(1,kernel_initializer="uniform",activation='linear')) model.compile(loss='mse',optimizer='adam',metrics=['accuracy']) returnmodel #20天、5維 model=build_model(20,5) 建立好LSTM模型後,我們就用前面編輯好的訓練資料集開始進行模型的訓練:LSTM模型訓練 #一個batch有128個instance,總共跑50個迭代 model.fit(X_train,y_train,batch_size=128,epochs=50,validation_split=0.1,verbose=1) 在經過一段時間的訓練過程後,我們便能得到LSTM模型(model)。

接著再用這個模型對測試資料進行預測,以及將預測出來的數值(pred)與正確答案(y_test)還原回原始股價的大小區間: LSTM模型預測股價及還原數值 defdenormalize(df,norm_value): original_value=df['close'].values.reshape(-1,1) norm_value=norm_value.reshape(-1,1) min_max_scaler=preprocessing.MinMaxScaler() min_max_scaler.fit_transform(original_value) denorm_value=min_max_scaler.inverse_transform(norm_value) returndenorm_value #用訓練好的LSTM模型對測試資料集進行預測 pred=model.predict(X_test) #將預測值與正確答案還原回原來的區間值 denorm_pred=denormalize(foxconndf,pred) denorm_ytest=denormalize(foxconndf,y_test) LSTM預測股價結果 讓我們把還原後的數值與答案畫出來,看看效果如何: LSTM預測股價結果 importmatplotlib.pyplotasplt %matplotlibinline plt.plot(denorm_pred,color='red',label='Prediction') plt.plot(denorm_ytest,color='blue',label='Answer') plt.legend(loc='best') plt.show() 如下圖,藍線是正確答案、紅線是預測股價。

雖然整體看起來預測股價與正確答案有類似的走勢,但仔細一看預測股價都比正確答案落後了幾天。

如果真的將這個模型應用在買賣策略上我們應該很快就畢業了。

所以我們試著來調整一些設定: 時間框架長度的調整Keras模型裡全連結層的activation與optimizaer的調整Keras模型用不同的神經網路(種類、順序、數量)來組合batch_size的調整、epochs的調整…經過我們對上述的幾個參數稍微調整過後,我們就得到一個更貼近正確答案的預測結果囉。

如果你發現哪些設置能得到更好的結果歡迎你在下面留言跟大家分享。

參考資料 詳細的python教學:利用Machine-Learning-選股新手教學Keras說明文件:KerasDocumentation另一種RNN:GRU,GatedRecurrentUnitKaggle相關競賽:NewYorkStockExchange附註:現在就開始AI選股,免費取得訓練資料 取得訓練資料的方法很簡單,幫冷清的寒舍小小宣傳一下: 按右下角分享這篇文章到你的FB將分享截圖傳到 [email protected]一兩天內即可獲得原始資料喔!熟悉Python與Machinelearning,對量化交易有興趣,想挑戰用Machinelearning找出股價漲跌的節奏。

Jeffrey AI科學家 覺得我們的文章有幫助到您,就把它分享給身邊的人吧! Sharethiscontent Opensinanewwindow Opensinanewwindow Opensinanewwindow Opensinanewwindow FinLab-韓承佑 嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會學術顧問、台北商業大學創新育成中心創業技術顧問與上市科技公司量化交易顧問。

當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。

我們成立FinLab量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。

希望可以在量化投資的路上,當大家的「武器製造商」! YouMightAlsoLike 用Python投資加密貨幣:三年20倍的策略參數最佳化(Part7) 2020-07-20 用Python超簡單自動下單 2020-07-22 Python股票5分鐘超簡單選股與回測–讓你投資股票少繳學費! 2020-07-22 機器學習真的無法預測股價嗎? 2020-07-21 Pandas魔法筆記(1)-常用招式總覽 2020-08-21 三大法人爬蟲:Python實作教學 2020-07-22 用數學計算日馳何時崩盤! 2020-07-22 外資大賣,反而要買!? 2020-07-22 每週收到新知識 只要有新文章,立刻用Email通知你 加入 Emailisrequired Emailisnotvalid Thanksforyoursubscription. Failedtosubscribe,pleasecontactadmin. 關於網站 FinLab財經實驗室 股票如何選擇?要怎麼學習量化投資?財報、技術指標如何看?FinLab利用股票分析、財經python教學,讓你在在茫茫股海中,找到專屬於自己的投資方法。

Facebook粉絲專頁 FinLabYouTube頻道 Opensinanewtab 近期文章 融資融券主力板塊|Treemap延伸應用|DashBoard製作教學(4) 2022-05-22/ 0Comments Plotly-多重圖組|融資維持率|DashBoard製作教學(3) 2022-05-18/ 0Comments 機器學習Python做比特幣交易,如何找到好的特徵?增進模型的有效工具 2022-05-11/ 0Comments 文章分類 AI看股票(17) FinLabYouTube(4) Python新手教學(20) PYTHON財經(13) Uncategorized(3) 加密貨幣(18) 基本面分析(20) 大盤漲跌(10) 實價登入(3) 技術面(16) 投資新手(5) 生產力(11) 籌碼面(7) 股票策略(22) 財報狗分析(5) 財經PYTHON教學(46) 選股策略(27) 量子電腦(1) Python理財入門課程Python理財進階課程Python加密貨幣實戰課程



請為這篇文章評分?