フィルタ取引戦略

前回はバーについての説明をした。戦略に応じてバーを使い分ける必要がある。

本書ではPCAウェイトについて紹介しているが、それはどの銘柄をどれくらい取引するかを検討する方法(アロケーション)で、主にローリスクハイリターンな銘柄を探し、そこを重点的に取引する必要がある。問題点は、ここで分析に必要な変数が期待収益率なので、それの見積もりを間違えると不要なリスクを負ってしまう点である。また、先物と原資産等極端に相関性が高いペアが候補に入っているとこれも偏るので、その整理も必要である。以上から、ここではPCAウェイトについての説明は省略する。

特徴量サンプリング

では、フィルタ取引戦略について話したいと思う。例えば、あるイベントが起きた時に株価が5%上がる確率と5%下がる確率を見積もりたいとする。これが分かれば期待収益率は簡単に見積もることが出来る。これの予測精度を上げるために特徴量サンプリングを紹介したいと思う。

CUSUMフィルタ

ここで紹介する方法は、サンプリングした後の株価の列があって、その株価が期待値とどれくらい乖離したかを見る統計量である。株価が移動平均線に対して乖離することを見るテクニカル指標の例ではボリンジャーバンド等が挙げられるが、テクニカル分析をしているトレーダーは普段ボリンジャーバンドの上のバンドがどれくらい乖離したら(例えば上に+2σ)で逆張りをしたりする。それは、価格だけ見ても下がるか分からないから、そういった指標を見て売り買いを判断していると言える。実際に下がるかどうかは誰にも分からないが、統計的に下がるかどうかは過去のデータから分析することが出来る。よって、ここで紹介するCUSUMフィルタもその一例として考えていただきたい。

観測値を{y_t} (t=1,2,...,T)と置く。これらはすべて同じ分布に属しているが、互いに独立である(IID)。累積値をS_t = max{0,S_{t-1}+y_t-E_{t-1}[y_t]}と置く。これは要するにS_t = Σ(y_k-E)+である。観測値が期待値より低ければ0(つまり何もしない)で、観測値が期待値より高ければその値を足していくというものである。なので、期待値をずっと上回っている株価があれば、何かしらイベントが起きているということなので、売買シグナルを観測出来る可能性がある。ここで例えば期待値をずっと上回っている銘柄があれば、逆張りをするのは非常に危険である。何故ならば、統計的には期待値に対してずっと上がっているので、逆張りより順張りの方が期待収益率が高くなるからである。以下のコードは確認程度である。

#対照CUSUMフィルタ
#y_tの期待値(E_{t-1}[y_t]=y_{t-1})としている。つまり、一つ前の価格差を見ている。
def getTEvents(gRaw, h):
    tEvents, sPos, sNeg = [], 0, 0
    diff = gRaw.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)
        if sPos > h:
            sPos = 0; tEvents.append(i)
    return pd.DatetimeIndex(tEvents)

以上の取引戦略をフィルタ取引戦略と呼ぶ。

では、次回また会いましょう。

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