シストレにおけるポジション調整の数式表現について〜調整のアクティブ度合いによる式の変化〜


こんにちは.スナフキンです.実験室なうです.今晩書いて投稿します.(たぶん)

2018/12/14(金)書きました.少し本業が忙しく,遅くなりました.

ポジションを作るときの考え方

まず,ある方向のポジションを作るとき,以下のような方法がある.

  1. 1回の注文でポジションを作る.
  2. 複数回の注文でポジションを作る.枚数は全ての注文で同じ.
  3. 複数の注文でポジションを作る.枚数は注文ごとに異なる.

シストレでこれを実現するにあたって,1は非常に簡単で,ショートポジションを持っている状態,ノーポジ状態,ロングポジションを持っている状態をそれぞれ-1,0,1などと表現して管理すれば良い.2に関しても,現在持っているポジションが想定している最大ポジションより小さいかどうかを判定して,小さければ注文を出すという仕組みでよい.今回は,特に3の複数の注文で注文を作り,しかも注文ごとに枚数が異なる場合について考えたい.

さて,注文によって枚数を変える場合,
a. 保有ポジションサイズにによって注文ごとの枚数を決める.
b. なんらかの投資指標の値に従って注文ごとの枚数を決める.

という主に2通りの方法が考えられる.
もちろん,これらは同時に並立することもありえ,例えばナンピンマーチンゲールは両方の複合と考える.というのも,ナンピンマーチンでは平均取得単価と現在価格の差を投資指標とし,さらに保有ポジションサイズによって次のオーダーの大きさが変わるためである.

具体的な数式での表現

まず,aの保有ポジションによって注文ごとの枚数を決める場合について考えてみよう.

基本的に,在庫リスク(ポジションを持っている状態で価格が逆方向に動くリスク)を減らしたい場合にはナンピンマーチンとは逆で,自分のポジションサイズが大きくなるほどに同方向の注文サイズを小さくし,逆方向の注文サイズを大きくすることになる.これを数式で表現する際には,以下の条件を満たすような関数を作ろうと考える.(今回は簡単のため,買いポジションについてのみ考える.)
現在持っているポジションをp, 想定している最大保有ポジションをm,1注文あたりのロットをlとして,

  • \(p \le 0\)のとき,lが最大.
  • \(m > p >0 \)のとき, pが増加するにつれてlが減少する.
  • \(m \le p\)のとき,l = 0

例えば,次のような形の関数を想定している.

$$
\begin{eqnarray}
l=\left\{ \begin{array}{ll}
maxLot & (p < 0)\\
maxLot(1-p/m)&(0 \le p < m)\\
0&(m \le p)\\
\end{array} \right.
\end{eqnarray}
$$

ただし,maxLotは,1注文あたりの最大ロットを表す.この式に従うとロットはポジションに対して線形に調整される.

↑1注文の最大ロット0.1で,最大ポジションが1の場合.ポジションが大きくなるにつれてロットを小さくすることにより,在庫リスクを軽減できる.以下の例は全て,1注文の最大ロット0.1,最大ポジション1

マーケットメイク戦略の論文などでは,在庫リスクに対して罰則項を設けるように書かれていることがあるが,その実装の1つとして上のような式が使える.
なお,

$$
\begin{eqnarray}
l=\left\{ \begin{array}{ll}
maxLot & (p < 0)\\
maxLot(1-p^n/m)&(0 \le p < m)\\
0&(m \le p)\\
\end{array} \right.
\end{eqnarray}
$$

とすることにより,ロット調整の度合いを変化させることができ,n = 1なら線形.n>1ならロットをポジションの増加に対してより急激に調整し,n<1なら緩やかに調整する.参考までにグラフを下記に示す.

ここまで,分かりやすいように多項式を使って表現したが,個人的には$tanh$を使う方が好みで,以下のような表現もできる.

$$l = maxLot[tanh\{\alpha (p-m)/m\}]$$
ただし,\(\alpha\) は定数.

これに従ってロットを調整する場合,ロットと保有ポジションの関係は以下のグラフのようになる.\(\alpha\) を大きくするほど,ロット調整をポジションが大きくなるまでやらなくなる.ちなみにtanh(x)は以下のような形の関数で,機械学習でよく使われるらしい.

↑tanhを使ってロット調整を行う場合.

なお,上記のtanhでロット調整する場合のグラフを見ると,逆ポジションを持っているときにロットが最大化するようになっている.これは定性的に言うと,例えばショートポジションを持っているときにロングのシグナル(あるいはショートを持っているのは危険であるというようなシグナル)が出た場合にはロットを大きくしてショートポジションを機動的に決済するということになる.

さて,ここまでポジションによってロットを可変にする試みについて説明したが,bの投資指標の値によってロットを可変にする場合も似たような考え方ができる.ここで,以下のような投資指標があると仮定する.

  • 投資指標iは-1<i<1の範囲の実数.
  • 投資指標iが1に近いほど,今後価格が上がる確率が高く,-1に近いほど価格が下がる確率が高い.

このとき,投資家は投資指標の値が大きいほどロングポジションを大きく持ちたいと考え,投資指標の値が小さいほどショートポジションを大きく持ちたいと考えるはずだが,これは例えば以下のような式で実現できる.

$$l = tanh(\alpha i)$$

tanhの特徴として,中心の変曲点近傍で傾きが急で,入力される変数の値が大きくなるほど傾きが緩やかになるというものがあるが,これは個人的な感覚としては色々な投資指標と相性がいい気がしている.というのは,僕がこれまでに使ってきた投資指標の範囲で言うと,基本的にその絶対値が非常に大きな外れ値はリターンと必ずしも結びつかず,上の例で言うと投資指標が最大値1のときと0.5のときで期待値が2倍違うようなことはあまりないためである.もちろん,サンプル数がそれほど多いわけではないので,これはあくまで個人的感想だが...

終わりに

最後にことわっておくと,上記のポジション調整式を使ってポジションを調整すると,保有ポジションが想定している最大ロットを超える可能性がある.なぜなら,上記の式には(保有ポジション + 注文ロット) が最大ロットを超えないという制約を入れていないからだ.(ただし,大幅に超えることはない.)実際僕のbotに関していうと,保有ポジションが最大想定ロットを多少超えることは多々あるし,わざわざ対策するのも面倒なので特に気にしていない.僕自身,ロットやポジション管理についてはまだまだ研究の余地がかなりあると思っていて,この話題についてシストレ界隈の皆様と知見を共有したい思いもあり,今回はこのような記事を書いた.(意訳:「シストレ全然わからない.教えてください.」ちなみにjupyter notebookをほぼそのまま貼り付けたので,変なところがあるかもしれません...)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする