ファイナンス機械学習:ベットサイズの決定

メタラベルを適用し、SVCやRFなどの分類機を当てはめて得られる誤分類の確率からベットサイズを求めることができる。
 ラベル$${x}$$が発生する確率を$${p[x]}$$とする。$${x\in \{-1,1\}}$$の二値ラベルの場合、ベットサイズmは、標準Gauss分布の累積分布関数である$${Z[.]}$$を使い、
$${m=2Z[z]-1}$$
と与えられる。
ラベリングが$${x\in \{\dots,-1,0,1 \dots\}}$$の三つ以上の場合は、この$${x}$$がベットサイズを表していることになり、
$${m=x(2Z[z]-1)}$$で与えられる。
 確率からベットサイズを与えるコードはスニペット10.1で与えられている。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

from scipy.stats import norm

def getSignal(events, stepSize, prob, pred, numClasses: int, **kargs):
    if prob.shape[0] == 0: return pd.Series()
    signal0 = (prob - 1.0 / numClasses) / (prob * (1.0 - prob)) ** 0.5    # t-value
    signal0 = pred * (2 * norm.cdf(signal0) - 1)    # signal = side * size
    if 'side' in events:
        signal0 *= events.loc[signal0.index, 'side']    # meta-labeling
    df0 = signal0.to_frame('signal').join(events[['t1']], how='left')
    df0 = avgActiveSignals(df0)
    signal1 = discreteSignal(signal0=df0, stepSize=stepSize)
    return signal1

全てのベットの保有時間は、それが建った時点からあらかじめ決められているバリアのどれかに最初に到達するまでである。ある一時点で、アクティブである全てのベットについて、そのサイズを平均化する必要がある。平均化の実装はスニペット10.2で与えられる。

def avgActiveSignals(signals):
    
    tPnts = set(signals['t1'].dropna().values)
    tPnts = tPnts.union(signals.index.values)
    tPnts = sorted(list(tPnts));
    out = avgActiveSignals_(signals=signals, dates=tPnts)
    return out
def avgActiveSignals_(signals,dates):
    
    out = pd.Series(dtype='float64')
    for loc in dates:
        df0 = (signals.index.values <= loc) & ((loc < signals['t1']) | pd.isnull(signals['t1']))
        act = signals[df0].index
        if len(act) > 0:
            out[loc] = signals.loc[act, 'signal'].mean()
        else:
            out[loc] = 0    # no signals active at this time
    return out

さらに、微小なシグナルの変動から引き起こされる過剰トレードを防ぐために、ベットサイズを離散化させる。

def discreteSignal(signal0,stepSize):
    
    signal1 = (signal0 / stepSize).round() * stepSize    # discretize
    signal1[signal1 > 1] = 1    # cap
    signal1[signal1 < -1] = -1    # floor
    return signal1

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