ファイナンス機械学習:標本の重み付け 時間減衰

市場は適応系であり、時間が経過するにつれ、古い事例は新しいものと比べて関連性を失っていく。よって、標本のウエイトを新しい観測地が入ってくるに従い、減衰させるのが望ましい。
 前節で導いた標本のウェイトにかける、時間減衰ファクター$${d[x],d[x]>0 \forall x \in[0,\sum^{I}_{i=1}\bar{u}_i]}$$を求める。
 当然ながら、最新のサンプルのウェイトへの時間係数ファクターは1である。
 最も古いサンプルのファクターを設定するユーザー定義係数$${c\in[-1,1]}$$を用い、線形に減衰するファクターを設定する。
 $${0\le c \le 1}$$の時は、$${d[1]=c}$$で単純線形減衰である。
 $${-1\le c <0}$$の時は、$${d[-c\sum^{I}_{i=1}\bar{u_i}]=0}$$とし、
区間$${[-c\sum^{I}_{i=1}\bar{u_i},\sum^{I}_{i=1}\bar{u_i}]}$$では線形減衰、$${-c\sum^{I}_{i=1}\bar{u_i}}$$以下の区間ではファクターは0でサンプルは考慮外となる。
 この実装はスニペット4.11で行われている。

def getTimeDecay(tW,clfLastW=1.):
    
    clfW = tW.sort_index().cumsum()
    if clfLastW >= 0:
        slope = (1.0 - clfLastW) / clfW.iloc[-1]
    else:
        slope = 1. / ((clfLastW + 1) * clfW.iloc[-1])
    const = 1.0 - slope * clfW.iloc[-1]
    clfW = const + slope * clfW
    clfW[clfW < 0] = 0
    return clfW

ユーザー指定パラメータのcを変えて時間減衰ファクターを計算し、グラフ化したのが下の図である。

cValue=[1,0.75,0.5,-0.5,-0.75,-1.]

fig = plt.figure(figsize=(14, 8))

for c in [-1.,-0.75,-.5,0,.5,.75,1.]:
    td=getTimeDecay(avgUniq,c)
    plt.plot(td,ls='-', label=f'c={str(c)}')
    
plt.xlabel('Days/Time')
plt.ylabel('Time Dcay Factors')
plt.title('Linear Time Dcay Factos')
plt.legend()
plt.show()
線形時間減衰ファクター

 線形減衰を指数減衰にした場合のコードは以下の通り。
 減衰速度の$${\alpha,\alpha>0}$$はユーザ指定である。

def getTimeDecayEXP(tW,alpha=0.001):
     
    clfW = tW.sort_index().cumsum()
    beta=-alpha*clfW.iloc[-1]
    clfW=np.exp(alpha*clfW + beta)
    
    return clfW

$${\alpha}$$を変えて、ファクターをグラフ化する。

alpha=[0.0,0.0001,0.001,0.01,0.1,1.0]

fig = plt.figure(figsize=(14, 8))

for a in alpha:
    td=getTimeDecayEXP(avgUniq,a)
    plt.plot(td,ls='-', label=f'alpha={str(a)}')
    
plt.xlabel('Days/Time')
plt.ylabel('Time Dcay Factors')
plt.title('Time Dcay Factos with EXP=0.75')
plt.legend()
plt.show()
指数減衰時間ファクター

この記事が気に入ったらサポートをしてみませんか?