量化投資學習筆記12——時間序列分析實操

還是宅在家裏,繼續學習。
用真實的股票數據來實踐一下剛學的時間序列分析的內容吧。分析一下我定投的兩支股票:300etf(510300),納指etf(513100)。
首先用tushare下載股價數據,時間範圍從其創立到2020年1月31日。然後將數據處理後存入csv文件,再把下載數據的代碼註釋掉,以後直接從文件讀取數據就行了。詳細代碼見我的github項目頁面,就不列出來了。

接着把數據可視化

用重採樣的方法來畫月線

重採樣 畫月線

fig = plt.figure()
df_300["close"].resample("M").mean().plot(legend = True)
plt.savefig("300ETF_month.png")

接下來進行一些統計分析
每天的漲跌幅
用"df_300.close.div(df_300.close.shift(1))"就可以生成明天的漲跌幅比例,再畫出來。

計算收益率,用df_300["returns"] = df_300.close.pct_change().mul(100)

計算相繼列的絕對差值
df_300.close.diff()

下面比較兩個etf,先直接畫。

由於股價不一樣,時間起點也不一樣,不方便比較。將兩個股價正態化,從同一時間起點比較。
df_300_cut = df_300.close["2013-05-31":]
norm_300 = df_300_cut.div(df_300_cut.iloc[0]).mul(100)
norm_nas = df_nas.close.div(df_nas.close.iloc[0]).mul(100)

可見兩個股市還是蠻不一樣的,美股買入持有就行了,A股就不行,坐過山車。
下面來畫窗口函數,有兩種,一種是rolling窗口函數,其切片大小是固定的,也就是我們常用的均線。
rolling_300 = df_300.close.rolling("90D").mean()
畫出來看看

還有一種是expanding窗口函數,指把之前的所有數據都計算進來,是累積值。
expanding_300 = df_300.close.expanding().mean()

貌似可以用來當做歷史大底,尤其是A股。
來看序列的自相關性和部分自相關性,用statsmodels.graphics.tsaplots裏的plot_acf函數和plot_pacf函數。
plot_acf(df_300["close"], lags = 25, title = "300ETF")
plot_pacf(df_300["close"], lags = 25, title = "300pETF")

對於自相關性,所有點都位於置信區間外,有統計學意義。

對於部分自相關性,只有小部分時點位於置信區間以外。
數據趨勢的分解,我的理解就是將數據序列分解爲週期性的部分和非週期的部分,用
decomposed_300 = sm.tsa.seasonal_decompose(df_300["close"], freq = 360)

從兩圖中可以看出,剔除了週期性因素,A股有明顯的波動性,而美股則是一直向上的趨勢。
看序列是否爲隨機行走序列,用單位根檢驗的方法。具體爲statsmodels.tsa.stattools裏的adfuller函數。
adf_300 = adfuller(df_300["close"])
print("300etf的單位根檢驗p值=%lf" % adf_300[1])
輸出結果爲
300etf的單位根檢驗p值=0.288299
NASetf的單位根檢驗p值=0.997857
二者結果均大於0.05,差異無統計學意義,兩個序列均爲隨機行走序列。
再看看穩定性,就是畫圖啦,另外還畫了序列的一階差分。

以上就是時間序列的統計描述部分,接下來就用各種模型對數據進行預測啦。
先用AR模型,具體解釋見上一篇博文吧。
from statsmodels.tsa.arima_model import ARMA
df300_model = ARMA(df_300["close"].diff().iloc[1:].values, order = (1, 0))
df300_res = df300_model.fit()
fig = plt.figure()
fig = df300_res.plot_predict(start = 1000, end = 1100)
fig.savefig("arma_300.png")

模型預測能力很弱。
ARMA模型
df300_ma = ARMA(df_300["close"].diff().iloc[1:].values, order = (0, 1))
就是order那裏是(0, 1),其它跟前面一樣。

ARMA模型
df300_arma = ARMA(df_300["close"].diff().iloc[1:].values, order = (3, 3))

好一點,但是也沒好多少。
ARIMA模型
from statsmodels.tsa.arima_model import ARIMA
df300_arima = ARIMA(df_300["close"].diff().iloc[1:].values, order = (2, 1, 0))

預測結果好了很多,只是有延遲。
VAR模型,要用兩個序列。

train_sample = pd.concat([norm_300.diff().iloc[1:], norm_nas.diff().iloc[1:]], axis = 1)
model = sm.tsa.VARMAX(train_sample, order = (2, 1), trend = "c")
result = model.fit(maxiter = 1000, disp = True)
print(result.summary())
fig = result.plot_diagnostics()
fig.savefig("var_dio.png")
pre_res = result.predict(start = 1000, end = 1100)
fig = plt.figure()
plt.plot(pre_res)
fig.savefig("var_pre.png")

SARIMA模型
train_sample = df_300["close"].diff().iloc[1:].values
model = sm.tsa.SARIMAX(train_sample, order = (4, 0, 4), trend = "c")
result = model.fit(maxiter = 1000, disp = True)
print(result.summary())
fig = plt.figure()
plt.plot(train_sample[1:600], color = "red")
plt.plot(result.predict(start = 0, end = 600), color = "blue")
fig.savefig("SARIMA.png")

未觀察成分模型
model = sm.tsa.UnobservedComponents(train_sample, "local level")
result = model.fit(maxiter = 1000, disp = True)
print(result.summary())
fig = plt.figure()
plt.plot(train_sample[1:600], color = "red")
plt.plot(result.predict(start = 0, end = 600), color = "blue")
fig.savefig("unobserve.png")
最後一個模型:動態因子模型
train_sample = pd.concat([norm_300.diff().iloc[1:], norm_nas.diff().iloc[1:]], axis = 1)
model = sm.tsa.DynamicFactor(train_sample, k_factors = 1, factor_order = 2)
result = model.fit(maxiter = 1000, disp = True)
print(result.summary())
predicted_result = result.predict(start = 0, end = 1000)
fig = plt.figure()
plt.plot(train_sample[:500], color = "red")
plt.plot(predicted_result[:500], color = "blue")
fig.savefig("dfmodel.png")

貌似這些模型對預測股市效果都一般。再看看其它方法吧。

我發文章的四個地方,歡迎大家在朋友圈等地方分享,歡迎點“在看”。
我的個人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的博客園博客地址: https://www.cnblogs.com/zwdnet/
我的微信個人訂閱號:趙瑜敏的口腔醫學學習園地

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章