基於Markov區制轉換模型的股票波動分析

01引言


時間序列建模廣泛用於序列相關的數據,例如對股票收益率數據進行建模和預測,分析下一季度的業務績效,天氣預報,信號處理等。時間序列建模的最簡單方法是線性自迴歸模型,其中自迴歸模型指定輸出變量線性地取決於其自身的先前值和隨機項,即假定時間序列的均值和方差在所考慮的整個時間段內保持不變,但現實數據往往很難滿足這樣的條件。由於某些結構上的變化,時間序列的波動性從一個時期到下一個時期可能發生劇烈變化。例如,在政策或宏觀經濟衝擊後,股票價格可以從趨勢急劇改變為波動。區制轉換模型(Regime shift models,簡稱RSM)通過將時間序列分為不同的“狀態”,來解決基本時間序列建模中的不足,這些模型在時間序列文獻中也被廣泛稱為狀態空間模型。本文簡單介紹區制轉移模型的基本原理,以及基於Python使用RSM模型對股票價格進行建模分析。關於時間序列建模分析可參考公眾號系列推文:

【Python量化基礎】時間序列的自相關性與平穩性

【手把手教你】使用Python玩轉金融時間序列模型

Python玩轉金融時間序列之ARCH與GARCH模型


02RSM模型概述



金融市場的行為可以突然發生改變,如2015年A股市場的劇烈波動。也就是說,我們能觀察到的股票的均值、方差和相關性均可能會發生突然變化,這些變化可能由宏觀經濟、政策或法規的根本變化引起的。意識到這一點對於時間序列建模具有極其重要的意義,因為我們可以根據市場的狀態調整進行交易風格切換和工具選擇(擇時)。通過在特定的狀態下(牛市、熊市、震盪)構建不同的投資組合來獲取超額收益。同樣,止損設置和技術指標的選擇可能因大盤環境所處的狀態不同而存在差異。

區制轉移模型也稱為狀態空間模型或動態線性模型,其基本思路是,時間序列存在於兩個或多個狀態,每個狀態都有自己的概率分佈,並且一個狀態到另一個狀態的轉換由另一個過程或變量控制。區制轉移模型有三種類型:閾值模型(Threshold models)、預測模型(Predictive models)和馬爾科夫轉換自迴歸模型(Markov switching autoregressive models)。

閾值模型觀察到的變量超過閾值會觸發狀態轉換。例如,價格跌破200天移動均線將觸發“看跌狀態”或下降趨勢。預測模型,可以使用機器學習算法之類的預測方法,將GDP,失業,長期趨勢,債券收益率,貿易平衡等宏觀經濟變量作為輸入,並預測下一時期的風險。當模型預測高風險數字時,市場處於高風險狀態。當模型預測低風險數字時,市場處於趨勢狀態。馬爾科夫轉換自迴歸模型(MSAM),假定狀態為“隱藏狀態”,並假定潛在狀態的的轉換遵循同質一階馬爾可夫鏈,而下一個狀態的概率僅取決於當前狀態。可以通過最大似然法來估計從一個狀態到下一個狀態的轉移概率,通過使似然函數最大化來估計參數值。


03MSAM建模分析實例


下面基於Python使用馬爾科夫轉換自迴歸模型(MSAM)嘗試對上證綜指的周收益率時間序列進行建模分析。statsmodels包基本上涵蓋了所有常見的統計和計量分析函數,其中時間序列tsa模塊中的MarkovRegression函數可以用於估計SMAM模型。


<code>

import

 pandas 

as

 pd

import

 statsmodels.api 

as

 sm

import

 matplotlib.pyplot 

as

 plt %matplotlib inline

from

 pylab 

import

 mpl mpl.rcParams[

'font.sans-serif'

]=[

'SimHei'

] mpl.rcParams[

'axes.unicode_minus'

]=

False

/<code>
<code> 

import

 tushare 

as

 ts df=ts.get_k_data(

'sh'

,start=

'2000-01-01'

,end=

'2020-06-16'

) df.index=pd.to_datetime(df.date) df.head() /<code>


基於Markov區制轉換模型的股票波動分析

由於價格數據一般是非平穩的,而收益率數據是平穩的,因此下面是對收益率而不是價格數據進行建模。此外,日收益率包含的噪聲較大,將其轉換為周收益率在進行建模。


<code> 
df_ret=df.close.resample(

'W'

).last().pct_change().dropna() df_ret.plot(title=

'上證綜指周收益率'

,figsize=(15,4)) plt.show() /<code>


基於Markov區制轉換模型的股票波動分析


<code> 
 

from

 arch.unitroot 

import

 ADF ADF(df_ret) /<code>

Augmented Dickey-Fuller ResultsTest Statistic-4.780P-value0.000Lags20

Trend: Constant
Critical Values: -3.44 (1%), -2.86 (5%), -2.57 (10%)
Null Hypothesis: The process contains a unit root.
Alternative Hypothesis: The process is weakly stationary.


ADFuller檢驗p值接近於0,可見收益率序列是平穩的。


從上述周收益率數據的時間序列圖可以看出,其波動存在一定的集聚性,2007-2008和2015-2016兩個時期的波動性特別大,其他時間相對較小。下面基於MSAM模型,假設上證綜指的波動率有三種狀態:低波動、中波動和高波動(k_regimes=3),並且沒有均值效應(trend='nc')。switching_variance默認是False,即時間序列的波動性(標準差)保持不變,這裡考慮存在三種狀態,因此設置為True。


<code>#模型擬合

mod

 = sm.tsa.MarkovRegression(df_ret.dropna(), k_regimes=

3

, trend=

'nc'

, switching_variance=True) res = 

mod

.fit() res.summary() /<code>
基於Markov區制轉換模型的股票波動分析

基於Markov區制轉換模型的股票波動分析

基於Markov區制轉換模型的股票波動分析


下面對上證綜指波動性狀態的平滑概率進行可視化。

<code>fig, axes = plt.subplots(

3

, figsize=(

12

,

8

)) ax = axes[

0

] ax.plot(res.smoothed_marginal_probabilities[

0

]) ax.

set

(title=

'上證綜指低波動平滑概率圖'

) ax = axes[

1

] ax.plot(res.smoothed_marginal_probabilities[

1

]) ax.

set

(title=

'上證綜指中波動平滑概率圖'

) ax = axes[

2

] ax.plot(res.smoothed_marginal_probabilities[

2

]) ax.

set

(title=

'上證綜指高波動平滑概率圖'

) fig.tight_layout() /<code>


基於Markov區制轉換模型的股票波動分析


從平滑概率圖上可以看出,上證綜指在2007-2019、2015-2016的波動性最高,其餘期間是小幅波動,這兩個期間的高波動性對應了股指的大牛市(大熊市),注意暴漲過後往往是暴跌。


為了分析更多的指數或個股,下面將上述分析過程使用函數表示:

<code>def plot_rsm(code,title,

start

=

'2010-01-01'

,

end

=

'2020-06-17'

):     df=ts.get_k_data(code,

start

=

start

,

end

=

end

)     df.index=pd.to_datetime(df.date)     df_ret=df.close.resample(

'w'

).last().pct_change().dropna()          

mod

 = sm.tsa.MarkovRegression(df_ret.dropna(), k_regimes=

3

, trend=

'nc'

, switching_variance=

True

)     res = mod.fit()     fig, axes = plt.subplots(

3

, figsize=(

12

,

8

))     ax = axes[

0

]     ax.plot(res.smoothed_marginal_probabilities[

0

])     ax.set(title=title+

'低波動平滑概率圖'

)     ax = axes[

1

]     ax.plot(res.smoothed_marginal_probabilities[

1

])     ax.set(title=title+

'中波動平滑概率圖'

)     ax = axes[

2

]     ax.plot(res.smoothed_marginal_probabilities[

2

])     ax.set(title=title+

'高波動平滑概率圖'

)     fig.tight_layout() /<code>


先來看看創業板的情況。創業板的高波動期間相對較多,除了2015那波大牛市(及接下來的暴跌),2019年一季度和2020年的一季度波動性也較大,實際上2020年一季度創業板屢次次新股。

plot_rsm('cyb','創業板')


基於Markov區制轉換模型的股票波動分析


個股的波動性往往會比指數更有集聚性,省廣集團對應的高波動性期間較大,其中2020年3月以來出現了連續波動峰值,近期有所下降。該股憑藉今日頭條、大數據中心、RCS富媒體等熱點概念,被資金持續炒作。

<code>

plot_rsm

(

'002400'

,

'省廣集團'

) /<code>
基於Markov區制轉換模型的股票波動分析


04結語


本文只是簡單介紹了使用Python基於馬爾科夫區制轉換模型對指數(股票)進行時間序列建模,感興趣的讀者可以進一步利用模型對樣本數據進行訓練,然後做預測,構建基於波動性的交易策略。任何模型都有其侷限性,區制轉換模型也不例外,不同數據期間的樣本訓練得到的參數可能存在較大差異,但關於狀態轉換(牛市、熊市、震盪市)的分析思路和框架是考察股票市場規律的一個較好視角,尤其是A股,能長期持有的個股鳳毛麟角,選擇在高(中)波動性期間再介入可提高資金的使用效率。


參考資料:

statsmodels官方文檔和安裝包原生代碼

https://www.statsmodels.org/stable/index.html


關於Python金融量化


專注於分享Python在金融量化領域的應用。加入知識星球,可以免費獲取量化投資視頻資料、量化金融相關PDF資料、公眾號文章Python完整源碼、量化投資前沿分析框架,與博主直接交流、結識圈內朋友等。

基於Markov區制轉換模型的股票波動分析


分享到:


相關文章: