日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

 老三的休閑書屋 2020-12-11

01 引言

關(guān)于金融時(shí)間序列分析,公眾號(hào)已經(jīng)發(fā)布了系列推文,其中《【手把手教你】時(shí)間序列之日期處理》展示了如何使用Python處理時(shí)間序列日期轉(zhuǎn)換和統(tǒng)計(jì)分析;《【Python量化基礎(chǔ)】時(shí)間序列的自相關(guān)性與平穩(wěn)性》介紹了自相關(guān)性、偏自相關(guān)性、白噪聲和平穩(wěn)性等基礎(chǔ)概念和檢驗(yàn)過程;《【手把手教你】使用Python玩轉(zhuǎn)金融時(shí)間序列模型》分享了使用Python構(gòu)建AR、MA、ARMA和ARIMA等經(jīng)典時(shí)間序列模型?!禤ython玩轉(zhuǎn)金融時(shí)間序列之ARCH與GARCH模型》著重介紹了ARCH和GARCH模型的基本原理和分析實(shí)例。本文在此基礎(chǔ)上,對金融資產(chǎn)收益率進(jìn)行全方位的可視化分析,為大家更好的理解平穩(wěn)性概念,揭示為何資產(chǎn)收益率不滿足平穩(wěn)性條件,以及為何機(jī)器學(xué)習(xí)或深度學(xué)習(xí)在金融資產(chǎn)(如股票)上的預(yù)測往往效果不佳提供一個(gè)分析視角。

02 數(shù)據(jù)獲取

使用tushare獲取股票指數(shù)收盤價(jià)數(shù)據(jù),計(jì)算日對數(shù)收益率。

#先引入后面可能用到的包(package)import pandas as pd  import numpy as npimport matplotlib.pyplot as pltimport seaborn as sns  sns.set()  %matplotlib inline   #正常顯示畫圖時(shí)出現(xiàn)的中文和負(fù)號(hào)from pylab import mplmpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False
import tushare as tsdef get_price(code,start,end):    df=ts.get_k_data(code,start,end)    df.index=pd.to_datetime(df.date)    return df.closecodes=['sh','sz','cyb','zxb','hs300']names=['上證綜指','深證綜指','創(chuàng)業(yè)板指','中小板指','滬深300']end_day = pd.to_datetime('2020-10-30')start_day = end_day - 10 * 252 * pd.tseries.offsets.BDay()start=start_day.strftime('%Y-%m-%d')end=end_day.strftime('%Y-%m-%d')#指數(shù)收盤價(jià)數(shù)據(jù)df = pd.DataFrame({name:get_price(code, start, end) for name,code in zip(names,codes)})
(df/df.iloc[0]-1).plot(figsize=(12,7))plt.title('指數(shù)累計(jì)收益率\n2011-2020',size=15)plt.show()
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

計(jì)算股票指數(shù)的日對數(shù)收益率。實(shí)際上在經(jīng)濟(jì)金融上,采用對數(shù)收益率已經(jīng)是約定俗成了,當(dāng)然這樣處理主要是基于對數(shù)處理的統(tǒng)計(jì)特性比較適合建模,如為了使數(shù)據(jù)更加平滑,克服數(shù)據(jù)本身的異方差等。

rs=(np.log(df/df.shift(1))).dropna()rs.plot(figsize=(12,5))plt.title('指數(shù)日對數(shù)收益率',size=15)plt.show()
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

03 收益率平穩(wěn)性可視化分析

所謂的時(shí)間序列平穩(wěn)性,簡單的理解是,序列的均值和方差不應(yīng)該隨著時(shí)間的推移而改變。時(shí)間序列中收益之間的協(xié)方差也不應(yīng)是時(shí)間的函數(shù)。

下面將演示和分析在預(yù)測時(shí)間序列時(shí)當(dāng)數(shù)據(jù)不滿足模型假設(shè)條件的挑戰(zhàn)。在開始之前,我們要知道,證券收益率序列往往不滿足平穩(wěn)性的要求。

import scipy.stats as statsdef add_mean_std_text(x, **kwargs):    mean, std = x.mean(), x.std()    mean_tx = f'均值: {mean:.4%}\n標(biāo)準(zhǔn)差: {std:.4%}'    txkw = dict(size=14, fontweight='demi', color='red', rotation=0)    ymin, ymax = plt.gca().get_ylim()    plt.text(mean+0.025, 0.8*ymax, mean_tx, **txkw)    returndef plot_dist(rs, ex):    plt.rcParams['font.size'] = 14    g = (rs         .pipe(sns.FacetGrid, height=5,aspect=1.5)         .map(sns.distplot, ex, kde=False, fit=stats.norm,              fit_kws={ 'lw':2.5, 'color':'red','label':'正態(tài)分布'})         .map(sns.distplot, ex, kde=False, fit=stats.laplace,              fit_kws={'linestyle':'--','color':'blue', 'lw':2.5, 'label':'拉普拉斯分布'})         .map(sns.distplot, ex, kde=False, fit=stats.johnsonsu,              fit_kws={'linestyle':'-','color':'green','lw':2.5, 'label':'約翰遜分布'})         .map(add_mean_std_text, ex))    g.add_legend()    sns.despine(offset=1)    plt.title(f'{ex}收益率',size=15)    return
plot_dist(rs, '上證綜指')
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

從上圖我們可以看出正態(tài)分布對數(shù)據(jù)集的擬合程度是很差,而拉普拉斯分布和約翰遜分布在擬合收益率方面相對較好。統(tǒng)計(jì)分布圖表明,在樣本時(shí)間段內(nèi),股票指數(shù)收益率不是正態(tài)分布。

下面進(jìn)一步用分位數(shù)圖來比較參數(shù)的分位數(shù)分布,考察與正態(tài)分布的偏離情況。

plt.rcParams['figure.figsize'] = 10,7def quantile_plot(x, **kwargs):    res = stats.probplot(x, fit=True, plot=plt)    _slope, _int, _r = res[-1]    ax = plt.gca()    ax.get_lines()[0].set_marker('s')    ax.get_lines()[0].set_markerfacecolor('r')    ax.get_lines()[0].set_markersize(13.0)    ax.get_children()[-2].set_fontsize(22.)    txkw = dict(size=14, fontweight='demi', color='r')    r2_tx = 'r^2 = {:.2%}\nslope = {:.4f}'.format(_r, _slope)    ymin, ymax = ax.get_ylim()    xmin, xmax = ax.get_xlim()    ax.text(0.5*xmax, .8*ymin, r2_tx, **txkw)    return 
quantile_plot(rs['上證綜指'])
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

分位數(shù)圖清晰地顯示出,上證綜指收益率表現(xiàn)出“肥尾”的現(xiàn)象(概率分布圖也可以看出是“尖峰后尾”)。這意味著,極端回報(bào)(無論是正回報(bào)還是負(fù)回報(bào))出現(xiàn)的頻率,遠(yuǎn)遠(yuǎn)高于正態(tài)分布預(yù)測的頻率。

但是,我們還沒有真正進(jìn)入討論時(shí)間序列平穩(wěn)性的問題。

檢驗(yàn)收益率是否平穩(wěn)的一種方法是考察每年收益率的均值和標(biāo)準(zhǔn)差的變動(dòng)情況。如果這兩個(gè)變量不是時(shí)間的函數(shù),那么它們每年的均值應(yīng)該是非常相似的。

def plot_facet_hist(rs, ex):    plt.rcParams['font.size'] = 12    df = rs.assign(year=lambda df: df.index.year)    g = (sns.FacetGrid(df, col='year',col_wrap=2, height=4, aspect=1.2)         .map(sns.distplot, ex, kde=False, fit=stats.norm,              fit_kws={ 'lw':2.5,'color':'red', 'label':'正態(tài)分布'})         .map(sns.distplot, ex, kde=False, fit=stats.laplace,              fit_kws={'linestyle':'--','color':'blue', 'lw':2.5, 'label':'拉普拉斯分布'})         .map(sns.distplot, ex, kde=False, fit=stats.johnsonsu,              fit_kws={'linestyle':'-', 'color':'green','lw':2.5, 'label':'約翰遜分布'})         .map(add_mean_std_text, ex))    g.add_legend()    g.fig.subplots_adjust(hspace=.20)    sns.despine(offset=1)    return
plot_facet_hist(rs, '上證綜指')
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?
(rs.groupby(rs.index.year)['上證綜指'] .agg(['mean', 'std']) .plot(marker='o', subplots=True))plt.show()
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

顯然,直方圖中擬合的正態(tài)密度圖在每一年中差異很大,某些年份近似服從正態(tài)分布,而某些年份表現(xiàn)出較強(qiáng)的“尖峰后尾”。這是否意味著我們之前關(guān)于收益率不是正態(tài)分布的結(jié)論只是一個(gè)時(shí)間尺度的問題?下面通過分位數(shù)圖進(jìn)一步考察這個(gè)問題。

def plot_facet_qq(rs, ex):    df = rs.assign(year=lambda df: df.index.year)    g = (df         .pipe(sns.FacetGrid, col='year',col_wrap=2,               height=7,aspect=1.3)         .map(quantile_plot, ex)         .fig.subplots_adjust(hspace=0.2))    sns.despine(offset=1, trim=True)    return
plot_facet_qq(rs, '上證綜指')
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

歷年的收益率QQ圖也顯示出,在某些年份收益率分布近似滿足正態(tài)分布;而在其他年份,則不滿足正態(tài)分布。所以可以認(rèn)為,通過視覺觀察,收益率序列的均值和方差是時(shí)間的函數(shù),即收益率序列的均值和方差會(huì)隨著時(shí)間的變動(dòng)而變化。

模擬正態(tài)分布樣本和累積分布。

norm = stats.normRANDOM_STATE=888def generate_norm_rvs(ser, N=None):    if not N: N = ser.shape[0]    return norm.rvs(ser.mean(), ser.std(), size=N, random_state=RANDOM_STATE)def generate_norm_pdf(ser, N=None):    if not N: N = ser.shape[0]    _min, _max = ser.min(), ser.max()    x = np.linspace(_min, _max, N)    y = norm.pdf(x, ser.mean(), ser.std())    return x, ydef generate_norm_cdf(ser, N=None):    if not N: N = ser.shape[0]    _min, _max = ser.min(), ser.max()    x = np.linspace(_min, _max, N)    y = norm.cdf(x, ser.mean(), ser.std())    return x, y

最后,基于Kolmogorov-Smirnov對收益率分布進(jìn)行統(tǒng)計(jì)檢驗(yàn)。

使用收益率的累積分布(CDF),并使用kolmogorov-smirnov的二樣本檢驗(yàn)(scipy.stats.kstest)與擬合CDF或經(jīng)驗(yàn)CDF進(jìn)行比較。該檢驗(yàn)可以驗(yàn)證兩個(gè)樣本的CDF是否來自相同的分布,例如正態(tài)分布。kstest輸出ks統(tǒng)計(jì)量和一個(gè)p值。p值小于0.05意味著我們可以拒絕兩個(gè)系列來自同一分布的原假設(shè)。p值越小,我們就越確信它們來自不同的分布。

首先,我們將分析整個(gè)收益率序列,然后比較各個(gè)年份的檢驗(yàn)結(jié)果。

def plot_cdf(ser, **kwds):       g = sns.kdeplot(ser, cumulative=True, lw=3, color='blue')    x, y = generate_norm_cdf(ser) # 生成正態(tài)分布CDF    g.plot(x, y, color='red', lw=3, label='fitted normal CDF')    ks, p = stats.kstest(ser, 'norm', args=(ser.mean(), ser.std()))    xmin,xmax=plt.gca().get_xlim()    ymin,ymax=plt.gca().get_ylim()    txkw = dict(size=14, fontweight='demi', color='red', rotation=0)    tx_N = ser.shape[0]    tx_args = (ks, p, tx_N, ser.shape[0])    tx = 'ks 2 sample test\nks: {:.4f}, p: {:.4f}\nrvs sample N: {:.0f}\nreturn sample N: {:.0f}'.format(*tx_args)    plt.text(xmax*0.2, 0.2*ymax, tx, **txkw)        sns.despine(offset=1)    (plt.legend(frameon=True, prop={'weight':'demi', 'size':12})     .get_frame())    return  
plot_cdf(rs['上證綜指'])  
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?
def plot_facet_cdf(rs, ex, **kwds):    df=rs.assign(year=lambda df:df.index.year)    g = (df         .pipe(sns.FacetGrid,                col='year',               col_wrap=2,               height=5,               aspect=1.3)         .map(plot_cdf, ex, **kwds))    g.add_legend()    g.fig.subplots_adjust(hspace=.20)    sns.despine(offset=1)    return
plot_facet_cdf(rs, '上證綜指')
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

總體收益率的自相關(guān)系數(shù)和偏相關(guān)系數(shù)圖

關(guān)于時(shí)間序列的自\偏相關(guān)系數(shù)圖代碼可參見《【Python量化基礎(chǔ)】時(shí)間序列的自相關(guān)性與平穩(wěn)性》。

資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

歷年日收益率的自相關(guān)系數(shù)和偏相關(guān)系數(shù)圖

資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

上述圖形清晰表明,上證綜指收益率在均值和方差上是非平穩(wěn)的,并且顯示了變量自相關(guān)的時(shí)間段。此外,我們看到上證綜指收益率的總體分布非正態(tài)分布,但在各種不同的時(shí)間期間,如每年,有一段時(shí)期是近似正態(tài)分布的。那么,當(dāng)我們試圖使用過去的收益率近似于正態(tài)分布的統(tǒng)計(jì)指標(biāo)(均值、方差)來預(yù)測未來的收益分布時(shí),會(huì)出現(xiàn)什么問題呢?

為了探究這個(gè)問題,下面使用機(jī)器學(xué)習(xí)包sklearn的 TimeSeriesSplit方法考察樣本的分布情況,該方法提供了交叉驗(yàn)證的前向walf-forward形式,使用先前的數(shù)據(jù)點(diǎn)來序列地預(yù)測下一個(gè)周期,從而保留了與時(shí)間相關(guān)的信息。

from sklearn.model_selection import TimeSeriesSplitxx = rs['上證綜指'].copy() _base = 252 # 1年測試樣本_max_train_sizes = [_base*1, _base*2, _base*3, _base*5] _n_split=5 gs = gridspec.GridSpec(_n_split, len(_max_train_sizes), wspace=0.0)fig = plt.figure(figsize=(20,25))rows = []for j, max_size in enumerate(_max_train_sizes):    tscv = TimeSeriesSplit(n_splits=_n_split, max_train_size=max_size)    for i, (train, test) in enumerate(tscv.split(xx)):        tmp_train = xx.iloc[train]         tmp_test = xx.iloc[test]         min_train_dt, max_train_dt = tmp_train.index.min(), tmp_train.index.max()        min_test_dt, max_test_dt = tmp_test.index.min(), tmp_test.index.max()        ks, p = stats.ks_2samp(tmp_train, tmp_test) # 獲得ks檢驗(yàn)統(tǒng)計(jì)指標(biāo)        df_row = (max_size, ks, p,                  min_train_dt.date(), max_train_dt.date(),                  min_test_dt.date(), max_test_dt.date())        rows.append(df_row)         tmp_ax = plt.subplot(gs[i, j])         if i in [0,1,2,3,4] and j != 0: tmp_ax.set_yticks([])        sns.kdeplot(tmp_train, cumulative=True, lw=3, color='blue', ax=tmp_ax, label='train')        sns.kdeplot(tmp_test, cumulative=True, lw=3, color='red', ax=tmp_ax, label='test')        plt.title('max train size: {}, ks: {:.4f}, p: {:.4f}\ntrain dates: {}_{}\ntest dates: {}_{}'                  .format(max_size, ks, p,                          min_train_dt.date(), max_train_dt.date(),                          min_test_dt.date(), max_test_dt.date()),                   fontsize=11.)        plt.subplots_adjust(top=1.03)         plt.tight_layout()
資產(chǎn)收益率的非平穩(wěn)性——為何機(jī)器學(xué)習(xí)預(yù)測效果不佳?

從圖中不難看出,在不同的回溯期間,訓(xùn)練樣本和測試樣本CDF的變化程度,包括它們準(zhǔn)確同步的時(shí)間。為了量化我們的觀察結(jié)果,可以創(chuàng)建一個(gè)dataframe,其中包含ks測試的輸出以及回溯期和數(shù)據(jù)拆分(即訓(xùn)練集和測試集)的信息。

# create data table with ks test results and tss informationcols = ['max_size', 'ks', 'p', 'min_train_dt', 'max_train_dt', 'min_test_dt', 'max_test_dt']tss_ks_df = pd.DataFrame(rows, columns=cols)obj_cols = tss_ks_df.select_dtypes(include=['object']).columns接下來,可以檢查在0.05和0.01的置信水平下,拒絕alpha值的原假設(shè)中訓(xùn)練/測試對中所占的百分比。
get_pct_reject = lambda df, col, alpha: df.query(f'{col} < {alpha}').shape[0] / df.shape[0]a1 = 0.05a2 = 0.01get_pct_reject(tss_ks_df, 'p', a1), get_pct_reject(tss_ks_df, 'p', a2) 
(0.5, 0.4)

結(jié)果似乎不太理想,50%的訓(xùn)練/測試對拒絕原假設(shè)(原假設(shè)是訓(xùn)練和測試數(shù)據(jù)來自相同的分布)。這表明,如果我們用訓(xùn)練數(shù)據(jù)的均值/方差參數(shù)來預(yù)測測試數(shù)據(jù)的收益率分布,那么在很多時(shí)候都會(huì)出錯(cuò)。這從另一個(gè)角度表明,數(shù)學(xué)建模(如機(jī)器學(xué)習(xí)或深度學(xué)習(xí))在預(yù)測金融資產(chǎn)收益率上往往效果不佳。

04 結(jié)語

對金融時(shí)間序列進(jìn)行預(yù)測是量化建模分析的重要組成部分,不少量化交易策略正是基于歷史數(shù)據(jù)的預(yù)測而構(gòu)建的。本文以指數(shù)收益率為例(上證綜指),基于圖形觀察的視角,展示了收益率的統(tǒng)計(jì)特征和“尖峰厚尾”現(xiàn)象,揭示出其不滿足通常條件下的平穩(wěn)性假設(shè)條件,同時(shí)利用機(jī)器學(xué)習(xí)的方法,考察數(shù)學(xué)建模對收益率進(jìn)行預(yù)測可能面臨的問題——訓(xùn)練集和測試集來自不同的分布。本文也從側(cè)面反映了盲目照搬照套數(shù)學(xué)模型(含機(jī)器學(xué)習(xí)和深度學(xué)習(xí))進(jìn)行時(shí)間序列預(yù)測可能效果不佳。

參考資料:

Mixture Model Trading (Part 1 - Motivation)

http://www./blog/mixture-model-trading-part-1/1/16/2018

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多