深度學習量化交易實踐---7.1.時序訊號特點

最老程式設計師閆濤發表於2018-11-22

時序訊號
我們以上證綜指收盤指數為例,其就是一個典型的時序訊號。上證綜指檔案中,每天作為一行,表示該日的指數資訊,各列資訊如下所示:
Indexcd:指數程式碼,000001表示上證綜合指數;
trddt:交易日期,格式為yyyy-MM-dd;
daywk:星期日期,0星期日,1星期一,…,6星期六
opnindex:開盤指數
hiindex:最高價
loindex:最低價
clsindex:收盤價
retindex:指數收益率
下面的程式可以讀入上證綜指2014年至2015年資料,並繪製收盤價資料曲線:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

index = pd.read_table('TRD_Index.txt', sep='\t', index_col='Trddt')
sh_index = index[index.Indexcd==1]
print(sh_index.head(n=50))

cls_index = sh_index.Clsindex
cls_index.index = pd.to_datetime(cls_index.index)
plt.plot(cls_index)
plt.show()

其會列印如下內容:
在這裡插入圖片描述
我們繪製收盤價曲線如下所示:
在這裡插入圖片描述

自相關性
自協方差
我們假設有一個隨機變數X,在第一次觀察時在時點tt時的值為Xt(1)X^{(1)}_{t},連續觀察多次,可以得到如下序列:
X1(1),X2(1),...,Xkl(1),...,Xk(1),...,XT1(1)X1(2),X2(2),...,Xkl(2),...,Xk(2),...,XT2(2)......................................................X1(N),X2(N),...,Xkl(N),...,Xk(N),...,XTN(N) X^{(1)}_1,X^{(1)}_2,...,X^{(1)}_{k-l},...,X^{(1)}_{k},...,X^{(1)}_{T_1} \\ X^{(2)}_1,X^{(2)}_2,...,X^{(2)}_{k-l},...,X^{(2)}_{k},...,X^{(2)}_{T_2} \\ ...................................................... \\ X^{(N)}_1,X^{(N)}_2,...,X^{(N)}_{k-l},...,X^{(N)}_{k},...,X^{(N)}_{T_N}
對於時點kk的值為XkX_k,通過多次觀察,可以求出其均值為μk\mu_k
有了這些之後,我們就可以定義ll階自協方差(Autocovariance):
γl=E[(Xkμk)(Xklμkl)]=Cov(Xk,Xkl) \gamma_l=\mathbb{E}[(X_k-\mu_k)(X_{k-l}-\mu_{k-l})]=Cov(X_k, X_{k-l})
l=0l=0時,自協方差就褪變為方差:
γ0=E[(Xkμk)2] \gamma_0=\mathbb{E}[(X_k-\mu_k)^2]
自相關係數
上一節介紹的自協方差,但是隨機變數X取值大的話,自協方差的值就會非常大。我們需要一個與數量無關的量,來描述時序訊號的自相關性,這就是我們要介紹的自相關係數:
ρl=Cov(Xk,Xkl)Var(Xk)=γlγ0 \rho_l=\frac{Cov(X_k, X_{k-l})}{Var(X_k)}=\frac{\gamma_l}{\gamma_0}
表示時序訊號過去的值對現在狀態的影響。
偏自相關係數
假設隨機變數X的時間序列為:X1,X2,...,Xt1,Xt,...X_1, X_2, ..., X_{t-1}, X_{t}, ...,如果ρ1>0\rho_1 >0,則表明t1t-1時刻Xt1X_{t-1}的值會對tt時刻XtX_{t}會有影響,同時在t1t-1時刻的值也會對時刻tt產生影響。如果想衡量過去單期對當前時刻tt影響,不考慮其他時刻的影響,我們可以用偏自相關係數(Partial Autocorrelation Coefficient):
ρll=Corr(Xk,Xk1Xk1,Xk2,...,Xkl+1) \rho_{ll}=Corr(X_k, X_{k-1} \vert X_{k-1}, X_{k-2}, ..., X_{k-l+1})
通常我們用自相關係數和偏自相關係數常用來刻畫時間序列相關性的高低,若相關係數比較大,說明我們所研究的物件過去、現在和將來的關聯性比較強,我們就可以通過研究這個訊號的過去和現在,比較精確地預測這個訊號將來的情況,那麼我們就可以選擇合適的策略來實現我們的盈利目的了。
我們可以使用如下函式自相關係數和偏自相關係數:

acf(x, unbiased=False, nlags=40, qstat=False, fft=False, alpha=None) # 自相關係數
pacf(x, nlags=40, method='ywunbiased', alpha=None) # 偏自相關係數

還以上證綜指為例,我們來看一下自相關係數和偏自相關係數,如下所示:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa import stattools
from statsmodels.graphics.tsaplots import plot_acf
import statsmodels.api as sm

index = pd.read_table('TRD_Index.txt', sep='\t', index_col='Trddt')
sh_index = index[index.Indexcd==1]

sh_retindex = sh_index.Retindex
# 自偏差
acfs = stattools.acf(sh_retindex)
print('acfs={0}!'.format(acfs))
pacfs = stattools.pacf(sh_retindex)
print('pacfs={0}!'.format(pacfs))


fig = plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(sh_retindex,lags=30,ax=ax1)
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(sh_retindex,lags=30,ax=ax2)
plt.show()

其數值為:
在這裡插入圖片描述
其自相關係數和偏自相關係數圖形如下所示:
在這裡插入圖片描述
如上圖所示,橫軸是代表時間點,縱軸是自相關係數和偏自相關係數的數值,藍色區域為置信區間,當時間點上向上的直線超過藍色區域時,代表其與當前時刻相關性比較強,可以通過前4個時刻點的值來預測當前值。例如上圖中,在4時間點時超過了藍色置信區間,所以我們可以通過前4個時刻的值來預測當前值。
對於時序訊號而言,平穩性是非常重要的一個指標。平穩性是指我們可以通過過去預測未來的準確性,如果我們要準確預測,就要求時序訊號具有較好的平穩性。
強平穩性的定義:
FX(xt1,xt2,...,xtn)=FX(xt1+τ,xt2+τ,...,xtn+τ) F_X(x_{t_1}, x_{t_2}, ..., x_{t_n})=F_X(x_{t_1+\tau}, x_{t{2}+\tau}, ..., x_{t{n}+\tau})
這表明其具有數學上週期函式的特點。
弱平穩性的定義:

  1. 任取tTt \in T,有Et=μ\mathbb{E_t}=\mu,即時間序列的均值為常數;
  2. 任取tTt \in T,有E(Xt2)<\mathbb{E}(X^2_t)<\infty,即存在二階矩;
  3. 對任意整數hh,任意階數ll,有γl(t)=γl(t+h)\gamma_l(t)=\gamma_l(t+h)
    單位根驗證
    通過觀察時序訊號的自相關性係數和偏自相關係數圖,得出的結論往往具有較大的主觀性,結論會因人而異。為有使得出的結論更客觀,我們需要引入單位根驗證。
    假設我們要研究的非平穩訊號如下所示:
    xt=xt1+ϵtx0=0,ϵtN(0,σϵ2) x_t=x_{t-1}+\epsilon_t \qquad x_0=0,\epsilon_t \sim \mathcal{N}(0, \sigma^2_{\epsilon})
    序列如下所示:
    x0=0x1=x0+ϵx2=x1+ϵ=x0+2ϵx3=x2+ϵ=x0+3ϵE(xt)=E(x0+tϵtt)=E(tϵtt)=E(ϵt)=0Var(xt)=E[(xtE(xt))2]=t2σϵ2 x_0 = 0 \\ x_1 = x_0+\epsilon \\ x_2=x_1+\epsilon=x_0+2\epsilon \\ x_3=x_2+\epsilon=x_0+3\epsilon \\ \mathbb{E}(x_t)=\mathbb{E}\bigg(\frac{x_0 + t\epsilon_t}{t} \bigg)=\mathbb{E} \bigg( \frac{t\epsilon_t}{t} \bigg)=\mathbb{E}(\epsilon_t)=0 \\ Var(x_t)=\mathbb{E}\bigg[ (x_t-\mathbb{E}(x_t))^2 \bigg]=t^2 \cdot \sigma^2_{\epsilon}
    但是如果我們對這個訊號做一階差分:
    Δxt=xtxt1E(Δxt)=0Var(Δxt)=σϵ2 \Delta x_t=x_t-x_{t-1} \\ \mathbb{E}(\Delta x_t)=0 \\ Var(\Delta x_t)=\sigma^2_{\epsilon}
    顯然,經過1階差分之後,訊號就變為穩定訊號了。

相關文章