前4篇文章分別記錄了利用深度學習挖短線股的資料預處理、模型訓練、結果預測及策略回測程序,本文記錄根據篩選短線股票的程序,
選股流程
1.股票資料下載更新
例如現在是2020年11月23日19:00,我們想找到按深度學習策略,明天應該買什么股票,那么首先將股票日線資料更新至2020年11月23日,日線資料下載可參考筆記(39),
2.股票擴展資料計算
計算股票的擴展指標,參考筆記(41)第2部分內容,
這里可以做進一步優化,如果每天都進行擴展資料計算,實際只需要對更新的當日資料進行計算,而無需對歷史資料進行重新計算,這樣可以大幅減少計算時間,
對比第1步資料下載更新,如果每天都進行更新下載,則實際每天只需下載當日K線資料,所需時間也會相應減少,
3.預測資料處理
完成擴展指標計算后,需要將近10日的指標都合并到當天資料上(參考筆記(41)),將資料轉為輸入特征,
# 準備特征資料
# 洗掉無效資料列,保留特征資料
df.drop(columns=['date', 'buy'], inplace=True)
# 取后FEATURE_N行資料
df = df.iloc[-FEATURE_N:]
# 生成用于預測的特征
arr = df.values.reshape(1, -1)
# 將資料匯入輸入字典
input_dict = {}
for i in range(arr.shape[1]):
input_dict[i] = arr[0][i]
input_dict = {name: tf.convert_to_tensor([value]) for name, value in input_dict.items()}
4.加載模型進行預測
加載筆記(42)訓練得到的模型,對上一步的輸入做預測,
# 加載模型
loaded_model = keras.models.load_model('./model/{}'.format(stk_code))
# 進行預測
predictions = loaded_model.predict(input_dict)
5.正則化選股
參考筆記(44)中使用的正則化,讀取筆記(43)所得到的預測資料,對當前預測結果進行正則化,排序選出預測數值最大的股票,即為優選股票,
# 正則化
# 讀入批量預測值
df = pd.read_csv('./baostock/predict_results/{}res.csv'.format(stk_code))
res_list = df['predict_result'].tolist()
# 添加當日預測結果
res_list.append(predictions[0][0])
# 正則化當日預測結果
delta = max(res_list) - min(res_list)
result_dict[stk_code] = (predictions[0][0] - min(res_list)) / delta
print(sorted(result_dict.items(), key=lambda x: x[1], reverse=True))
輸出結果
程式會不斷輸出類似這樣的結果:
[('sh.600104', 1.0), ('sh.600114', 1.0), ('sh.600168', 1.0), ('sh.600219', 1.0), ('sh.600257', 1.0), ('sh.600507', 1.0), ('sh.600570', 1.0), ('sh.600589', 1.0), ('sh.600616', 1.0),...
即,按正則化預測值從大到小的順序輸出股票代碼及其預測值,但是速度是超級慢,24小時只處理了1000多只股票,
分析思考
- 利用深度學習去挖個股的路線已經走通,但是效果和效率上都有待提升,
- 輸入特征方面,目前僅使用了幾個簡單維度的指標作為特征,可以通過計算其他指標來增加收入特征,也可以通過分析剔除作用較小的特征,
- 網路模型方面,目前使用的神經網路層數較少,節點數固定,可通過增加網路層數、調整節點樹木進一步調優,
- 樣本處理方面,短期暴漲顯然是小概率事件,也就導致我們訓練時,暴漲的樣本數量較少,所以我們的問題成為一個不平衡分類問題,這就是雖然在訓練中看到準確率高達近90%,但是回測結果依然有限的原因,需要對此類問題進行針對性處理,
- 模型的訓練及預測時間過長,缺乏實用性,除了升級硬體、改進代碼外,可以考慮選擇部分股票作為選股范圍,
選股代碼:
import tensorflow as tf
import numpy as np
import pandas as pd
import os
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras import backend
# 使用前FEATURE_N的K線資料作為輸入特征
FEATURE_N = 10
# 存盤預測結果字典
result_dict = {}
# 存盤參與深度學習策略的股票
stk_code_file = './stk_data/dp_stock_list.csv'
# 讀取股票串列
stk_list = pd.read_csv(stk_code_file)['code'].tolist()
# 對每只股票分別進行預測,計算歸一化后的預測值
for stk_code in stk_list:
print('processing {}...'.format(stk_code))
# 讀取擴展指標
df = pd.read_csv('./baostock/data_ext/{}.csv'.format(stk_code))
# 沒有足夠的特征資料就跳過
if df.shape[0] < FEATURE_N:
continue
# 準備特征資料
# 洗掉無效資料列,保留特征資料
df.drop(columns=['date', 'buy'], inplace=True)
# 取后FEATURE_N行資料
df = df.iloc[-FEATURE_N:]
# 生成用于預測的特征
arr = df.values.reshape(1, -1)
# 預測
# 將資料匯入輸入字典
input_dict = {}
for i in range(arr.shape[1]):
input_dict[i] = arr[0][i]
input_dict = {name: tf.convert_to_tensor([value]) for name, value in input_dict.items()}
# 加載模型
loaded_model = keras.models.load_model('./model/{}'.format(stk_code))
# 進行預測
predictions = loaded_model.predict(input_dict)
# 正則化
# 讀入批量預測值
df = pd.read_csv('./baostock/predict_results/{}res.csv'.format(stk_code))
res_list = df['predict_result'].tolist()
# 添加當日預測結果
res_list.append(predictions[0][0])
# 正則化當日預測結果
delta = max(res_list) - min(res_list)
result_dict[stk_code] = (predictions[0][0] - min(res_list)) / delta
print(sorted(result_dict.items(), key=lambda x: x[1], reverse=True))
# 清理記憶體
backend.clear_session()
print(sorted(result_dict.items(), key=lambda x: x[1], reverse=True))
歡迎大家關注、點贊、轉發、留言,感謝支持!
為了便于相互交流學習,已建微信群,感興趣的讀者請加微信,
近期新建QQ群:676186743,方便資料共享,定期發布學習任務,歡迎加入!


轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/227861.html
標籤:區塊鏈
上一篇:哪個平臺玩位元幣合約最好?
下一篇:go基礎之map-寫在前面(一)
