ファイナンス機械学習:特徴量サンプリング
前述の様々なバーをとる方式によって、金融データを連続で均一な構造データとなるが、これをそのまま機械学習アルゴリズムに入力するのは避けるべきである。
なぜなら、機械学習アルゴリズムのいくつかは、大きなサンプルでは機能しないし、適切なサンプルのみを抽出して学習させた方が精度が上がるからである。
より正確な予測を可能にするために役立つ特徴量を選び出す必要がある。
イベントベース・サンプリング・CUSUMフィルタ
CUSUMフィルタは、測定した値の平均値の目標値からの乖離を検出する。
局所定常過程から生じる独立同分布の観測値$${\{y_i\},i=1,\dots T}$$を考える。
この累積値を、
$${S_t=max\{0,S_{t-1}+ y_t - E_{t-1}[y_t]\}}$$、
$${S_0=0}$$
と定義し、フィルタサイズの$${h}$$に対し、
$${S_t \ge h}$$となった最初の時点$${t}$$で何らかの動作を行うとする。
$${y_t \le E_{t-1}[y_t]-S_{t-1}}$$では、$${S_t}$$は常にゼロで、上方乖離を識別するように設定されている。
これを、下落方向を含むように拡張することもでき、上下方向に対称なCUSUMフィルタは以下のように導入される。
$${S_t^{+}=max\{0,S_{t-1}^++ y_t - E_{t-1}[y_t]\}}$$、$${S_0^+=0}$$
$${S_t^{-}=min\{0,S_{t-1}^-+ y_t - E_{t-1}[y_t]\}}$$、$${S_0^-=0}$$
$${S_t=max\{S^+_t, -S^-_t\}}$$
スニペット2.4では、$${E_{t-1}[y_t]=y_{t-1}}$$とした対称CUSUMフィルタの実装をを示し、$${S_t\ge h}$$でサンプリングし、$${S_t}$$をリセットしている。
def getTEvents(gRaw, h) :
tEvents, sPos, sNeg = [], 0, 0
diff = gRaw.diff()
print(diff)
for i in diff.index[1:]:
sPos, sNeg = max(0, sPos + diff.loc[i]), min(0, sNeg + diff.loc[i])
if sNeg < -h:
sNeg = 0
tEvents.append(i)
elif sPos > h:
sPos = 0
tEvents.append(i)
return pd.DatetimeIndex(tEvents)
$${S_t}$$は価格である必要はなく、エントロピーや市場マイクロストラクチャの測定など、特徴量のいずれでも取れる。
このイベントドリブンバーのサブセットから、機械学習アルゴリズムに、イベントの発生が実用的で必要な情報を構成しているかを判断させれば良いであろう。