Ku-Chartの簡単な計算方法 (2017/07/31)

USDを含む5通貨モデルの計算式

例としてAUD、EUR、GBP、JPY、USDの5通貨モデルの計算式を以下に示す。

a = (log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)) / 5
Ku-AUD = log(AUDUSD) - a
Ku-EUR = log(EURUSD) - a
Ku-GBP = log(GBPUSD) - a
Ku-JPY = -log(USDJPY) - a
Ku-USD = -a

計算式の解説

なぜ、このような式になるのかを説明しておく。興味のない人は読み飛ばしていただいて構わない。

ドルストレートの通貨ペアのみを材料として使い、以下のように変形する。

AUDUSD = AUD / USD
EURUSD = EUR / USD
GBPUSD = AUD / USD
USDJPY = USD / JPY

AUD / USD = AUDUSD
EUR / USD = EURUSD
GBP / USD = GBPUSD
JPY / USD = 1 / USDJPY
USD / USD = 1

Ku-Chartは対数を使っているので、これを対数に変換し、以下のように変形する。

log(AUD/USD) = log(AUDUSD)
log(EUR/USD) = log(EURUSD)
log(GBP/USD) = log(GBPUSD)
log(JPY/USD) = log(1/USDJPY)
log(USD/USD) = log(1)

log(AUD) - log(USD) = log(AUDUSD)
log(EUR) - log(USD) = log(EURUSD)
log(GBP) - log(USD) = log(GBPUSD)
log(JPY) - log(USD) = log(1) - log(USDJPY)
log(USD) - log(USD) = log(1)

log(AUD) - log(USD) = log(AUDUSD)
log(EUR) - log(USD) = log(EURUSD)
log(GBP) - log(USD) = log(GBPUSD)
log(JPY) - log(USD) = 0 - log(USDJPY)
log(USD) - log(USD) = 0

log(AUD) - log(USD) = log(AUDUSD)
log(EUR) - log(USD) = log(EURUSD)
log(GBP) - log(USD) = log(GBPUSD)
log(JPY) - log(USD) = -log(USDJPY)
log(USD) - log(USD) = 0

log(AUD) = log(AUDUSD) + log(USD)
log(EUR) = log(EURUSD) + log(USD)
log(GBP) = log(GBPUSD) + log(USD)
log(JPY) = -log(USDJPY) + log(USD)
log(USD) = log(USD)

Ku-Chartは平均を減じて全体の合計が0になるようにしている。そこで先ず平均を求め、以下のように変形する。

mean = (log(AUD)+log(EUR)+log(GBP)+log(JPY)+log(USD)) / 5

mean = (log(AUDUSD)+log(USD)+log(EURUSD)+log(USD)+log(GBPUSD)+log(USD)-log(USDJPY)+log(USD)+log(USD)) / 5

mean = (log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)+5*log(USD)) / 5

mean = (log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)) / 5 + (5*log(USD)) / 5

mean = (log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)) / 5 + log(USD)

ここで「(log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)) / 5」を「a」としておくと以下のようになる。

mean = a + log(usd)

最後に平均を減じたものをKu-Powerとして、以下のように変形する。

Ku-AUD = log(AUD) - mean
Ku-EUR = log(EUR) - mean
Ku-GBP = log(GBP) - mean
Ku-JPY = log(JPY) - mean
Ku-USD = log(USD) - mean

Ku-AUD = log(AUD) - (a+log(USD))
Ku-EUR = log(EUR) - (a+log(USD))
Ku-GBP = log(GBP) - (a+log(USD))
Ku-JPY = log(JPY) - (a+log(USD))
Ku-USD = log(USD) - (a+log(USD))

Ku-AUD = log(AUD) - a - log(USD)
Ku-EUR = log(EUR) - a - log(USD)
Ku-GBP = log(GBP) - a - log(USD)
Ku-JPY = log(JPY) - a - log(USD)
Ku-USD = log(USD) - a - log(USD)

Ku-AUD = log(AUD) - log(USD) - a
Ku-EUR = log(EUR) - log(USD) - a
Ku-GBP = log(GBP) - log(USD) - a
Ku-JPY = log(JPY) - log(USD) - a
Ku-USD = log(USD) - log(USD) - a

Ku-AUD = log(AUD/USD) - a
Ku-EUR = log(EUR/USD) - a
Ku-GBP = log(GBP/USD) - a
Ku-JPY = log(JPY/USD) - a
Ku-USD = log(USD/USD) - a

Ku-AUD = log(AUD/USD) - a
Ku-EUR = log(EUR/USD) - a
Ku-GBP = log(GBP/USD) - a
Ku-JPY = -log(USD/JPY) - a
Ku-USD = log(1) - a

Ku-AUD = log(AUD/USD) - a
Ku-EUR = log(EUR/USD) - a
Ku-GBP = log(GBP/USD) - a
Ku-JPY = -log(USD/JPY) - a
Ku-USD = 0 - a

Ku-AUD = log(AUDUSD) - a
Ku-EUR = log(EURUSD) - a
Ku-GBP = log(GBPUSD) - a
Ku-JPY = -log(USDJPY) - a
Ku-USD = -a

これで計算式が求められた。

USDを含まない4通貨モデルの計算式

ドルストレートを材料にする場合でもUSDを除くことはできる。

例としてAUD、EUR、GBP、JPYの4通貨モデルの計算式を以下に示す。

a = (log(AUDUSD) + log(EURUSD) + log(GBPUSD) - log(USDJPY)) / 4
Ku-AUD = log(AUDUSD) - a
Ku-EUR = log(EURUSD) - a
Ku-GBP = log(GBPUSD) - a
Ku-JPY = -log(USDJPY) - a

再び計算式の解説

やはり興味のない人は読み飛ばしていただいて構わない。

ドルストレートの通貨ペアのみを材料として使い、以下のように変形する。

AUDUSD = AUD / USD
EURUSD = EUR / USD
GBPUSD = AUD / USD
USDJPY = USD / JPY

AUD / USD = AUDUSD
EUR / USD = EURUSD
GBP / USD = GBPUSD
JPY / USD = 1 / USDJPY

対数に変換し、以下のように変形する。

log(AUD/USD) = log(AUDUSD)
log(EUR/USD) = log(EURUSD)
log(GBP/USD) = log(GBPUSD)
log(JPY/USD) = log(1/USDJPY)

log(AUD) - log(USD) = log(AUDUSD)
log(EUR) - log(USD) = log(EURUSD)
log(GBP) - log(USD) = log(GBPUSD)
log(JPY) - log(USD) = log(1) - log(USDJPY)
log(USD) - log(USD) = log(1)

log(AUD) - log(USD) = log(AUDUSD)
log(EUR) - log(USD) = log(EURUSD)
log(GBP) - log(USD) = log(GBPUSD)
log(JPY) - log(USD) = 0 - log(USDJPY)

log(AUD) - log(USD) = log(AUDUSD)
log(EUR) - log(USD) = log(EURUSD)
log(GBP) - log(USD) = log(GBPUSD)
log(JPY) - log(USD) = -log(USDJPY)

log(AUD) = log(AUDUSD) + log(USD)
log(EUR) = log(EURUSD) + log(USD)
log(GBP) = log(GBPUSD) + log(USD)
log(JPY) = -log(USDJPY) + log(USD)

平均を求め、以下のように変形する。

mean = (log(AUD)+log(EUR)+log(GBP)+log(JPY)) / 4

mean = (log(AUDUSD)+log(USD)+log(EURUSD)+log(USD)+log(GBPUSD)+log(USD)-log(USDJPY)+log(USD)) / 4

mean = (log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)+4*log(USD)) / 4

mean = (log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)) / 4 + (4*log(USD)) / 4

mean = (log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)) / 4 + log(USD)

ここで「(log(AUDUSD)+log(EURUSD)+log(GBPUSD)-log(USDJPY)) / 4」を「a」としておくと以下のようになる。

mean = a + log(usd)

平均を減じたものをKu-Powerとして、以下のように変形する。

Ku-AUD = log(AUD) - mean
Ku-EUR = log(EUR) - mean
Ku-GBP = log(GBP) - mean
Ku-JPY = log(JPY) - mean

Ku-AUD = log(AUD) - (a+log(USD))
Ku-EUR = log(EUR) - (a+log(USD))
Ku-GBP = log(GBP) - (a+log(USD))
Ku-JPY = log(JPY) - (a+log(USD))

Ku-AUD = log(AUD) - a - log(USD)
Ku-EUR = log(EUR) - a - log(USD)
Ku-GBP = log(GBP) - a - log(USD)
Ku-JPY = log(JPY) - a - log(USD)

Ku-AUD = log(AUD) - log(USD) - a
Ku-EUR = log(EUR) - log(USD) - a
Ku-GBP = log(GBP) - log(USD) - a
Ku-JPY = log(JPY) - log(USD) - a

Ku-AUD = log(AUD/USD) - a
Ku-EUR = log(EUR/USD) - a
Ku-GBP = log(GBP/USD) - a
Ku-JPY = log(JPY/USD) - a

Ku-AUD = log(AUD/USD) - a
Ku-EUR = log(EUR/USD) - a
Ku-GBP = log(GBP/USD) - a
Ku-JPY = -log(USD/JPY) - a

Ku-AUD = log(AUD/USD) - a
Ku-EUR = log(EUR/USD) - a
Ku-GBP = log(GBP/USD) - a
Ku-JPY = -log(USD/JPY) - a

Ku-AUD = log(AUDUSD) - a
Ku-EUR = log(EURUSD) - a
Ku-GBP = log(GBPUSD) - a
Ku-JPY = -log(USDJPY) - a

これで計算式が求められた。

要するに、USDを含めた5通貨モデルでは5で除していたところを4で除するように変更するだけである。

まとめ

上記の計算式を用いれば、ドルストレートを材料にして任意の組み合わせのKu-Chartを作成できる。もちろん、他のドルストレートを追加して5より大きいモデルを作成することもできる。

また、同様のやり方でクロス円、ユーロクロスなどを使ってKu-Chartを計算することもできる。ただし、「EURUSD」と「EURJPY / USDJPY」が必ずしも一致しないように非常にわずかな誤差はありうる。

ハイブリッドトレードの試み (2017/07/29)

ハイブリッドトレードとは

ここではハイブリッドトレードを裁量トレードとシステムトレードを組み合わせたものとしておく。もう少し具体的には、システムによるシグナルをトレーダーが裁量で取捨選択するようなトレードである。

ハイブリッドトレードの基本原則

私が考えるハイブリッドトレードには以下の4つの基本原則がある。

  1. システムがエントリーのシグナルを点灯させてもエントリーしなくていい。
  2. システムがエントリーのシグナルを点灯させていなければエントリーしてはならない。
  3. システムがエグジットのシグナルを点灯させていなくてもエグジットしていい。
  4. システムがエグジットのシグナルを点灯させたら必ずエグジットする。

これをまとめると、システムが持つポジションを持つことは許されるが、システムが持たないポジションを持つことは許されない、ということである。

エントリー選択の原則

  1. 経済指標発表の1時間半前から30分後まではエントリーしない。
  2. 要人発言予定の1時間半前から3時間後まではエントリーしない。
  3. 経済指標、または要人発言によって相場が大きく動いたとき、動いた方向にはエントリーしない。
  4. サポート手前では買わず、レジスタンス手前では売らない。ブレイクしてからエントリーする。
  5. 日足始値より上では買わず、下では売らない。
  6. 月曜日は金曜日終値より上では買わず、下では売らない。

私は経済指標発表、要人発言を「DailyFX」というスマートフォンアプリで確認している。通貨ペアと直接関係のないイベントは基本的に考慮しない。例えば、ドル円なら米国と日本のイベントのみ注意する。

以上は私の試行錯誤によるものであって、今後も変わりうる。

エグジット選択の原則

  1. エグジットのシグナルが来たら、ポジションの損益の大小に関わらず、即座にエグジットする。
  2. 経済指標発表、要人発言予定が近づいてもエグジットのシグナルがない場合、ポジションの損益の大小に関わらず、5分前までにはエグジットする。
  3. ポジションの損益がプラスでエグジットに近づいてから相場が反転して利益が縮小した場合、マイナスになる直前にエグジットする。
  4. ポジションの損益がプラスのとき、チャートを見てエグジットの条件を満たしていると分った場合、エグジットのシグナルを待たずにポジションの半分、または全部をエグジットしてもいい。

これも私の試行錯誤によるものであって、今後も変わりうる。

技巧をUbuntuにインストール (2017/09/01)

第27回世界コンピュータ将棋選手権で3位に入賞した将棋ソフトの技巧をUbuntuにインストールする。

技巧のダウンロード

技巧を「ダウンロード」フォルダーにダウンロードする。

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ wget -P ~/ダウンロード https://github.com/gikou-official/Gikou/releases/download/v2.0.2/gikou2_win.zip; \
wget -P ~/ダウンロード https://github.com/gikou-official/Gikou/archive/v2.0.2.zip

v2.0.2が現時点(2017年7月21日)での最新版である。

Windows版とソースコードの両方をダウンロードする。

Windows版の実行ファイルはUbuntuでは使えないのでソースコードからコンパイルする必要がある。定跡などはWindows版のものをそのまま使う。

ダウンロードファイルの解凍

Windows版はデスクトップに、ソースコードは「ダウンロード」フォルダーに解凍する。

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ unzip -d ~/デスクトップ/Gikou-2.0.2 ~/ダウンロード/gikou2_win.zip; \
unzip -d ~/ダウンロード ~/ダウンロード/v2.0.2.zip

技巧のコンパイル

技巧をコンパイルし、Windows版にコピーする。

①以下のコマンドを端末に入力して「Enter」キーを押す。

$ cd ~/ダウンロード/Gikou-2.0.2;make release

「release」ファイルが実行ファイルとなる。

②以下のコマンドを端末に入力して「Enter」キーを押す。

cp ~/ダウンロード/Gikou-2.0.2/bin/release ~/デスクトップ/Gikou-2.0.2

技巧をShogiGUIに登録

技巧をShogiGUIに登録する。

ShogiGUIについては「ShogiGUIをUbuntuにインストール」を参照。

①以下のコマンドを端末に入力して「Enter」キーを押す。

$ mono ~/デスクトップ/ShogiGUIv0.0.6.11/ShogiGUI.exe

②ShogiGUIのメニューバーで「ツール」をクリックする。

③「エンジン設定」をクリックする。

④「エンジン一覧」で「追加」ボタンをクリックする。

⑤「Open」で「~/デスクトップ/Gikou-2.0.2」フォルダーに移動する。

⑥「Files of type:」で「すべてのファイル」を選択する。

⑦「release」ファイルをクリックする。

⑧「Open」ボタンをクリックする。

⑨「エンジン設定」で「エンジン」を「gikou」に変更する。

⑩「BookFile」で「...」ボタンをクリックする。

⑪「Open」で「戦型別定跡ファイル/00_全戦型.bin」を選択する。

このようにすると技巧は全戦型を使う。もちろん、特定の戦型を選択しても構わない。

⑫「Open」ボタンをクリックする。

⑬「OK」ボタンをクリックする。

⑭「エンジン一覧」に戻って「OK」ボタンをクリックする。

なお、「エンジン設定」の「DepthLimit」で強さを調整できる。「1」が最弱で、「100」が最強である。

参考リンク

将棋ソフト「技巧」

elmoをUbuntuにインストール (2017/09/01)

第27回世界コンピュータ将棋選手権で優勝した将棋ソフトelmoをUbuntuにインストールする。

elmoは評価関数と定跡だけなので、思考エンジンを設置する必要がある。思考エンジンにはやねうら王を使うこととする。

elmoのダウンロード

elmoを「ダウンロード」フォルダーにダウンロードする。

①以下のアドレスをクリックする。

https://drive.google.com/file/d/0B0XpI3oPiCmFalVGclpIZjBmdGs

②「elmo.shogi.zip」で「ダウンロード」ボタンをクリックする。

③「このファイルをダウンロードしてもよろしいですか?」で「ダウンロード」ボタンをクリックする。

④「elmo.shogi.zip を開く」で「ファイルを保存する」を選択する。

⑤「OK」ボタンをクリックする。

ダウンロードファイルの解凍

ダウンロードファイルをデスクトップに解凍する。

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ unzip -d ~/デスクトップ ~/ダウンロード/elmo.shogi.zip

elmoにやねうら王を設置

elmoにやねうら王を設置する。

やねうら王については「やねうら王をUbuntuにインストール」を参照。

○以下のコマンドを端末に入力して「Enter」キーを押す。

$ cp ~/ダウンロード/YaneuraOu-4.76_engine2017/source/YaneuraOu-by-gcc ~/デスクトップ/elmo.shogi

elmoをShogiGUIに登録

elmoをShogiGUIに登録する。

ShogiGUIについては「ShogiGUIをUbuntuにインストール」を参照。

①以下のコマンドを端末に入力して「Enter」キーを押す。

$ mono ~/デスクトップ/ShogiGUIv0.0.6.11/ShogiGUI.exe

②ShogiGUIのメニューバーで「ツール」をクリックする。

③「エンジン設定」をクリックする。

④「エンジン一覧」で「追加」ボタンをクリックする。

⑤「Open」で「~/デスクトップ/elmo.shogi」フォルダーに移動する。

⑥「Files of type:」で「すべてのファイル」を選択する。

⑦「YaneuraOu-by-gcc」ファイルをクリックする。

⑧「Open」ボタンをクリックする。

⑨「エンジン設定」で「エンジン」を「elmo」に変更する。

⑩「BookDepthLimit」を「0」に設定する。

⑪「BookMoves」を「200」に設定する。

⑫「Hash」を「16」に設定する。

⑬「MinimumThinkingTime」を「1000」に設定する。

⑭「NetworkDelay」を「0」に設定する。

⑮「NetworkDelay2」を「0」に設定する。

⑯「Threads」を「8」に設定する。

推奨の設定ではCPUコア数の2倍とあり、私のPCは8コアなので、「16」に設定すると、対局開始時に「初期化エラー」と表示されて動かなくなることがある。そこでコア数と同じ「8」に設定した。

⑰「OK」ボタンをクリックする。

⑱「エンジン一覧」に戻って「OK」ボタンをクリックする。

参考リンク

コンピュータ将棋ソフト「elmo」導入方法

勝率とペイオフレシオ (2017/07/08)

勝率とペイオフレシオの関係がどのようであるかを調べてみる。

勝率の高い戦略が優れているとは限らない。ペイオフレシオが低ければ勝率が高くても負ける戦略となる場合がある。

逆に、ペイオフレシオの高い戦略が優れているとは限らない。勝率が低ければペイオフレシオが高くても負ける戦略となる場合がある。

要するにバランスが重要だ。それを考慮せずに「損小利大」はよいとか、「損大利小」はだめとか言っても無意味である。

さて、私は勝率が高ければペイオフレシオは低く、勝率が低ければペイオフレシオは高い、つまり、トレードオフの関係にあると考えている。勝率もペイオフレシオも高いというのが理想ではある。だが、そう簡単に実現できることではない。

もし、勝率とペイオフレシオがトレードオフの関係にあるとすれば、

平均利益 / 平均損失 = 負け数 / 勝ち数

という関係を想定することができるだろう。これを整理すると、

ペイオフレシオ = 負け数 / 勝ち数
ペイオフレシオ = (負け数 / (勝ち数+負け数)) / (勝ち数 / (勝ち数+負け数))
ペイオフレシオ = (1 - 勝率) / 勝率
ペイオフレシオ * 勝率 = 1 - 勝率
ペイオフレシオ * 勝率 + 勝率 = 1
(ペイオフレシオ + 1) * 勝率 = 1
勝率 = 1 / (ペイオフレシオ + 1)

となる。

すると、

勝率 = 傾き * (1 / (ペイオフレシオ + 1)) + 切片

というモデルを想定することができる。特に理由がなければ、傾きは1、切片は0になると考えられる。

では上のモデルをランダムウォークのデータを使って検証してみる。

①この記事で使うライブラリをインポートする。

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

②ペイオフレシオごとの勝率を求める。

n = 1000
max_iter = 10000
wp_long = np.empty(9)
wp_short = np.empty(9)
payoff_ratio_long = np.empty(9)
payoff_ratio_short = np.empty(9)

for i in range(9):
    profit = i + 1
    loss = 9 - i
    win_long = 0
    lose_long = 0
    win_short = 0
    lose_short = 0
    for j in range(max_iter):
        rnd = np.random.randn(n) * 0.01
        close = np.cumsum(rnd) + np.log(100)
        close = np.exp(close)
        count = 0
        for k in range(n):
            if count < k:
                count = k
            if close[k] >= 100 + profit:
                win_long += 1
                lose_short += 1
                break
            if close[k] <= 100 - loss:
                lose_long += 1
                win_short += 1
                break
    wp_long[i] = win_long / (win_long + lose_long)
    wp_short[i] = win_short / (win_short + lose_short)
    payoff_ratio_long[i] = profit / loss
    payoff_ratio_short[i] = loss / profit

先ず、ペイオフレシオを1:9、2:8、3:7、4:6、5:5、6:4、7:3、8:2、9:1で場合分けする。次にランダムウォークのデータを作り、それぞれのペイオフレシオでの勝敗をカウントするシミュレーションを1万回行って勝率を求める。

検証は買いの場合と売りの場合の2つのパターンで行った。同じ値幅での上昇確率は下落確率よりわずかに高く、買いが売りよりわずかに有利だと考えられるからである。これについては以下を参照。

https://storage.googleapis.com/imoz-jp/slides/160321_trading.pdf(p19-22)

③グラフを表示する。

plt.plot(payoff_ratio_long, wp_long, label='wp_long')
plt.plot(payoff_ratio_short, wp_short, label='wp_short')
plt.xlabel('Payoff Ratio')
plt.ylabel('Winning Percentage')
plt.xlim(0, 9)
plt.ylim(0, 1)
plt.legend(loc="upper right")
plt.savefig('wp_por.png', format='png', dpi=150)
plt.show()

わずかに買いの勝率が売りの勝率より高いことが分かる。

④モデルを作成する。

def model(payoff_ratio, a, b):
    return a * (1 / (1 + payoff_ratio)) + b

⑤モデルの傾きと切片を求める。

popt, pcov = curve_fit(model, payoff_ratio_long, wp_long)
slope_long = popt[0]
intercept_long = popt[1]
popt, pcov = curve_fit(model, payoff_ratio_short, wp_short)
slope_short = popt[0]
intercept_short = popt[1]

⑥モデルを表示する。

print('Long:')
print(
      '\t Winning Percentage = ', slope_long, ' * (1 / (Payoff Ratio + 1)) + ',
      intercept_long)
print('Short:')
print(
      '\t Winning Percentage = ', slope_short,
      ' * (1 / (Payoff Ratio + 1)) + ', intercept_short)

Long:
         Winning Percentage =  0.887583333429  * (1 / (Payoff Ratio + 1)) +  0.0613638886528
Short:
         Winning Percentage =  0.887583333879  * (1 / (Payoff Ratio + 1)) +  0.0510527775029

当初、期待していた「傾きが1、切片が0」となる結果とは少し違う。誤差とするにはやや大きすぎるように思う。だが、なぜこうなるかは分からない。

とりあえず目安としては買いと売りを分けずに

勝率 = 0.9 * (1 / (ペイオフレシオ + 1)) + 0.05

くらいに考えておけばいいだろうか。

これはランダムウォークで予測される勝率である。したがって、これより大きな勝率でなければランダムウォークに勝っていないことになる。