ファイナンス機械学習:標本の重み付け 時間減衰
市場は適応系であり、時間が経過するにつれ、古い事例は新しいものと比べて関連性を失っていく。よって、標本のウエイトを新しい観測地が入ってくるに従い、減衰させるのが望ましい。
前節で導いた標本のウェイトにかける、時間減衰ファクター$${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()
![](https://assets.st-note.com/img/1699477340751-5V1ANdClKb.png?width=1200)
線形減衰を指数減衰にした場合のコードは以下の通り。
減衰速度の$${\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()
![](https://assets.st-note.com/img/1699485901112-dZmS7o2nJB.png?width=1200)
この記事が気に入ったらサポートをしてみませんか?