跑步進場
最近股市大漲,不少人忙著跑步進場。作為保守型“投資者”,主投指數基金:滬深300。在這波行情 中,短短2個月,也有13%的賬面收益。雖然知道指數類適合長期持有,但也好奇,這個點是否是高位了。為了解決這個疑慮。我們今天用演算法模型套一套,看能否發現些什麼。
時序預測的價值
時序問題的預測在生活中很常見。例如:遊戲線上人數預測、消費情況預測、 O2O 的到店人數預測、交通流量預測,這些場景的精確預測,為資源的調配起到了重大的參考作用。從個體角度來說,得到的服務和體驗也大大提升。
為此,Facebook 開源了一套工具 Prophet,專門用於時間學列預測。在這裡,我們將用它,來一探股市究竟。
時序預測的原理
對於時間序列問題,常用的手法是時間序列的分解:這裡有些類似於傅立葉變換的意味。將一個函式分解為多個規律函式的和積。時間序列的常見組成成分包括:季節項、趨勢項以及噪聲。在 Prophet 中,結合實際情況,他們又加入了節假日專案。之前在一次 kaggle 的比賽中,我們也發現節假日的資料波動,其實是類似於週末效應的。即:節假日的前後資料,類似於週六的前後資料。對資料進行修正後,評價指標會好很多。
廢話不多說,我們們開幹。
Prophet in 滬深300
工具包安裝
pip install fbprophet
資料準備與清洗
import pandas as pd
import numpy as np
from fbprophet import Prophet
複製程式碼
資料準備
- 資料來源為網易財經,滬深三百指數。
data = pd.read_csv('../data/000300.csv',encoding='GB2312')
data.head()
複製程式碼
資料清洗
- 選取需要的資料,並對資料做 log / box-cox 變換,使資料更符合線性、正態分佈,減少方差差異。經濟系統和生態系統類似,都存在指數級增長現象,也存在飽和現象。我們這裡採用 log 變換。
df = data[[u'日期',u'收盤價']]
df.columns = ['ds','y']
df['y'] = df['y'].apply(lambda x: np.log(int(x)))
複製程式碼
模型擬合與預測
簡單定義,然後擬合。
m = Prophet()
m.fit(df)
複製程式碼
預測未來一年的行情
future = m.make_future_dataframe(periods=365)
forecast = m.predict(future)
複製程式碼
詳細看最後15天的資料
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(15)
future_predict['yhat'] = future_predict['yhat'].apply(lambda x:np.exp(x))
future_predict['yhat_lower'] = future_predict['yhat_lower'].apply(lambda x:np.exp(x))
future_predict['yhat_upper'] = future_predict['yhat_upper'].apply(lambda x:np.exp(x))
複製程式碼
yhat 預測比較保守,20200307 相較於目前20190308 的大盤漲了100個點。預期最大收益:(6536-3658)/3658≈ 78%,預期最大虧損:(2158-3658)/3658≈-41%
模型看到了什麼
Prophet 有個功能是成分拆分,我們們來看看國內股市的趨勢以及季節性因素是什麼。
fig1 = m.plot(forecast)
複製程式碼
模型擬合情況
趨勢項
總結
模型資料表明,滬深股市短期看可能有波動,長期看上揚可能性更大。短期對於我們這種投資方式的參考意義不大,長期來看,穩中向好,我也將持續滬深300。當然,話說回來,投資有風險,決策需謹慎。不要只看狼吃肉,不見狼捱打。去年最差的時候,本人累計虧損15%...
另外再強調一下,模型並非萬能。這裡使用的資訊單一,但真實世界,可是有多種資訊共同作用於市場。模型也還未經過充分調參,沒有劃分資料做驗證,實際使用價值有限。
對此,你怎麼看?請在留言區寫下你的看法。