こんな「シストレ」は嫌だ

架空の「シストレ」

ちょっとふざけたタイトルにしてみたが、内容もちょっとふざげている。この記事では「シストレ」を「業者が提供するストラテジーを選択し、自動で売買させること」という意味で使うことにする。

ここに5000のストラテジーを持つ架空のシストレ業者があるとしよう。ストラテジーには0から4999までのナンバーが付いている。そして、各ストラテジーを収益率でランキング付けたところ、ある年の上位10位のパフォーマンスは以下のようであった。

     Rank  Profit(%)
821     1     287.63
1641    2     266.44
44      3     254.50
412     4     254.12
4838    5     240.87
39      6     239.94
4353    7     238.15
1010    8     234.44
3915    9     232.49
4991   10     228.95

収益率が100%であれば資金を倍にしたことになる。ランキング1位の収益率は287.63%であるから4倍近くにまで増やしたことになる。10位でも228.95%であるから3倍以上である。

さて、翌年の上位10位のパフォーマンスは以下のようであった。

     Rank  Profit(%)
4087    1     299.07
4272    2     279.69
2574    3     270.01
1       4     267.88
3086    5     265.18
4394    6     261.54
964     7     252.25
2713    8     249.55
304     9     249.28
3662   10     246.18

さらに翌々年の上位10位のパフォーマンスは以下のようであった。

     Rank  Profit(%)
1734    1     317.56
2894    2     277.21
3771    3     265.88
1104    4     255.95
3438    5     253.59
2925    6     250.31
2800    7     232.86
1377    8     231.03
3779    9     229.89
961    10     229.67

やはり1位なら4倍前後、10位でも3倍以上となっている。だがストラテジーのナンバーを見ると分かるように3年間を通して上位に入ったストラテジーはない。

実はすべて乱数

察しのいい人は気付いているだろうが、いや、すでに見出しでバレている。これは期待収益率が0%になるように乱数を発生させ、5000回シミュレーションを繰り返して、収益率の上位10位をピックアップしたものである。期待収益率が0%でも5000回のうちの上位10位となると200%を超えるのである。ちなみに各年の平均収益率はそれぞれ-1.61%、0.44%、-1.30%であった。

どこそこのシストレ業者もこれと同じ、などというつもりはない。だが乱数でもこれくらいのことはできると知っておけば、誇大広告に踊らされることもなくなるだろう。

サンプルプログラム

1年を260営業日、毎日1回トレードするという設定でシミュレーションした。1日のボラティリティを1%とし、レバレッジ5倍でトレードしている。

○以下のコマンドを「IPython console」にコピー&ペーストして「Enter」キーを2回押す。

import numpy as np
import pandas as pd

strategy = np.empty([5000, 2])
strategy = pd.DataFrame(strategy,
                        columns=['Rank', 'Profit(%)'])
n_strategies = 5000
n_trades = 260
n_year = 3
volatility = 0.01
leverage = 5
for i in range(n_year):
    for j in range(n_strategies):
        ret = np.random.randn(n_trades) * volatility * leverage
        ret = pd.Series(ret)
        cumret = ret.cumsum()
        strategy.iloc[j, 1] = cumret.iloc[n_trades-1] * 100
    strategy = np.round(strategy.sort_values(by='Profit(%)',
                                             ascending=False), 2)
    for j in range(n_strategies):
        strategy.iloc[j, 0] = str(int(j + 1))
    print(strategy.head(10))
    print('mean = ', np.round(strategy['Profit(%)'].mean(), 2))
    print('\n')
(2017/01/28更新)

ヒストリカルデータのダウンロード (2017/08/05)

ヒストリカルデータを保存するフォルダーの作成(初回のみ)

以下のコマンドを実行して「~/py」フォルダーに「historical_data」フォルダーを作成する。

$ mkdir ~/py/historical_data

これをヒストリカルデータを保存するフォルダーとする。

古いヒストリカルデータの削除

初めてヒストリカルデータをダウンロードする場合、この手順はいらない。すでにヒストリカルデータをダウンロードしていて、新しいデータをダウンロードする場合に実行する。

以下のコマンドを実行して「~/py/historical_data」フォルダー内のファイルを削除する。

import forex_system as fs
fs.empty_folder('historical_data')

ヒストリカルデータのダウンロード

①JForexのツールバーで「ツール」をクリックする。

②「ヒストリカルデータ取得」をクリックし、下の方に「ヒストリカルデータ取得」タブを表示する。

③「ヒストリカルデータ取得」タブの「Undock this tab」ボタンをクリックし、「ヒストリカルデータ取得」タブを別ウィンドウにして見やすい大きさにする。

④「ヒストリカルデータ取得」の「開始日時」で2007年1月1日を選択する(なぜか日付が1日前後して表示されることがあるが気にしない)。

⑤「終了日時」で2017年1月1日を選択する(やはり日付が1日前後して表示されることがあるが気にしない)。

⑥「形式」で「CSV」を選択する。

⑦「日付形式」で「YYYY.MM.DD HH:MM:SS」を選択する。

⑧「区切り」で「,」(カンマ)を選択する。

⑨「ビッド/アスク」で「Bid」を選択する。

⑩「データ種類」で「分」を選択する。

⑪「値」で「1分」を選択する。

⑫「フィルター」で「フラット期間を非表示」を選択する。

⑬「データ出力先」で「参照」ボタンをクリックする。

⑭「ディレクトリを選択」で「/home/****/py/historical_data」を選択する。

⑮「選択」ボタンをクリックする。

⑯「ヒストリカルデータ取得」に戻って「銘柄」でダウンロードしたい通貨ペアにチェックを入れる。

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

⑱「ヒストリカル・テスターに関する免責事項」で一番下までスクロールする。

⑲「次回から表示しない」にチェックを入れる。

⑳「同意する」ボタンをクリックし、ダウンロードが「100%」になるのを待つ。

㉑「ヒストリカルデータ取得」タブの「×」ボタンをクリックして閉じる。

ファイル名に日付が入っているが、なぜかダウンロードした日付と1日前後することがある。よく分からないが気にしない。

ファイル名の変更

ファイル名には日付などが入っているが邪魔なので通貨ペア名以外の部分は削除する。

import forex_system as fs
fs.rename_historical_data_filename()

JForexのインストール

ヒストリカルデータはデューカスコピー社のものを使う。そのためには先ずデューカスコピー社のデモ口座を解説し、JForexというツールをインストールする必要がある。以下にその手順などを説明する。なお、デモ口座は期限が1ヶ月だが、デューカスコピー社に連絡すれば無期限にしてもらうこともできる。

デモ口座の開設

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

https://www.dukascopy.jp/japan/japanese/home/

②「デモ口座開設」ボタンをクリックする。

③「デモ口座開設」の「デモ口座の申し込み」で必要事項にチェックを入れる、または入力する。

④「デモ口座を開設する」ボタンをクリックする。

⑤登録したメールアドレスに「デューカスコピー・ジャパン株式会社」からメールが来るので「ログイン」と「パスワード」を確認する。

JForexのダウンロード

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

https://www.dukascopy.jp/japan/japanese/home/

②「ログイン」をクリックする。

③「インストール版 JForex(推奨)」で「JForexをインストール」をクリックする(使用しているOSに合ったバージョンのファイルが自動的に選択される)。

④「JForex_unix_64_JRE_bundled.sh を開く」で「ファイルを保存する」を選択する。

⑤「OK」ボタンをクリックし、「JForex_unix_64_JRE_bundled.sh」ファイルを「~/ダウンロード」フォルダーに保存する。

JForexのインストール

①端末に以下のコマンドをコピー&ペーストして「Enter」キーを押す。

bash ~/ダウンロード/JForex_unix_64_JRE_bundled.sh

②「言語の選択」で「日本語」が選択されているのを確認する。

③「OK」をクリックする。

④「セットアップ - JForex Platform 1.3」の「ようこそ JForex Platform セットアッププログラムへ。」で「次へ」をクリックする。

⑤「ユーザー設定」で「このユーザー(****)のみにインストールする」が選択されているのを確認する。

⑥「次へ」をクリックする。

⑦「インストール先の選択」の「インストール先のディレクトリ」で「/home/****/JForex」が選択されているのを確認する。

⑧「次へ」をクリックする。

⑨「シンボリックリンクのためのディレクトリを選択」で「シンボリックリンクの作成」にチェックが入っているのを確認する。

⑩「インストール先のディレクトリ」で「/home/****/bin」が選択されているのを確認する。

⑪「次へ」をクリックする。

⑫「ショートカット作成オプションの選択」で「デスクトップアイコンを作成する」にテェックが入っているのを確認する。

⑬「次へ」をクリックする。

⑭「JForex Platformのセットアップ完了」で「JForex Platform を実行する」にチェックが入っているのを確認する。

⑮「終了」をクリックする。

JForexの起動

○デスクトップの「JForex Platform」をダブルクリックする。

JForexへのログイン

①JForexのログイン画面で「ログイン」にデューカスコピー社から送られた「ログイン」を入力する。

②「パスワード」に同じくデューカスコピー社から送られた「パスワード」を入力する。

③「環境」で「DEMO」を選択する。

④「言語」で「日本語」が選択されているのを確認する。

⑤「ログイン」ボタンをクリックする。

JForexからのログアウト

①JForexのメニューバーの「ファイル」をクリックする。

②「ログアウト」をクリックする。

(2017/01/26更新)

許容損失は資金の何%に抑えるべきか

ネットでは2%が多数派のようだが…

許容損失は資金の何%に抑えるべきかという議論がある。FXサイトなどを見ると、どうやら2%とするのが通説のようである。ところが、2%とする根拠は何かというと、ちゃんとした説明は私の知る限り、見当たらない。どうも有名なトレード本に2%がいいと書いてあるから、ということらしい。

私はいつも思うのだが、有名な本に書かれているから、有名な人が言ったから、という理由で無批判に受け入れてしまうというのはいかがなものだろうか。しかも、そういう意見がコピペを繰り返して、いつの間にかに通説になっていくように思われる。この議論に限ったことではないが、他人の言葉などどうでもよく、自分で検証してみるということが大事だと思う。

2%ではすぐに資金を溶かしてしまうことも

というわけで、簡単な検証をしてみた。

単純化するためにペイオフレシオ = 1.0、つまり平均利益=平均損失と仮定し、勝率がそれぞれ30%、40%、50%、60%、70%であるトレーダーが260回トレードしたとする。1年を260営業日とし、毎営業日1回トレードするとすれば、1年後にどうなったかということを見るわけである。そして、更に許容損失を1%、2%、3%で場合分けした。

このようなシミュレーションを1万回行い、その平均を取った。その結果が以下のグラフである。

乱数を使っているので、必ずしも同じ結果にはならないが、大体このようである。グラフによると、許容損失を2%とした場合、勝率30%のトレーダーはほとんどの資金を、勝率40%のトレーダーでも大半の資金をたったの1年で失っている。

そして許容損失が1%であれば損失が減り、3%であれば損失が増えている。とすると、許容損失は少ないほどいいと言える。

勝てなければ何%にしても勝てない

一方、勝率50%のトレーダーは許容損失の大きさの影響は受けず、勝ちもしなければ負けもしない。まあ、当たり前だが。

勝率60%、70%のトレーダーは許容損失を2%とした場合、たったの1年で資金を倍以上にしている。そして許容損失が1%であれば利益が減り、3%であれば利益が増えている(グラフでは資金の増え方がすごいので上の方をカットした)。とすると、許容損失は多いほどいいと言える。

以上、検証結果を総合すると、「資金の何%」という議論は無意味で、勝てるトレーダーはどんどんリスクを取っていいし(注)、勝てないトレーダーはリスクを減らす、というよりトレードしないのが最善ということになりそうだ。

(注)ところがそうはいかない場合もある。「リスク管理」カテゴリの「最適レバレッジ」の記事を参照。

サンプルプログラム

○以下のコマンドを「IPython console」にコピー&ペーストして「Enter」キーを2回押す。

import matplotlib.pyplot as plt
import numpy as np

n_trades = 260
n_tests = 10000
balance = np.empty(4)
risk = np.array(range(4)) / 100
for i in range(5):
    win_per = (i + 3) / 10
    for j in range(4):
        temp = np.empty(n_trades)
        mean = 0
        for k in range(n_tests):
            change = np.random.choice([risk[j], -risk[j]], n_trades,
                                      p=[win_per, 1.0-win_per])
            for l in range(n_trades):
                if l == 0:
                    temp[0] = 1.0 + change[l]
                else:
                    temp[l] = temp[l-1] * (1.0 + change[l])
            mean += temp[n_trades-1]
        mean = mean / n_tests
        balance[j] = mean
    plt.plot(risk, balance, label=str(win_per))
plt.title('Balance and Risk')
plt.xlabel('Risk')
plt.ylabel('Balance')
plt.xlim(0.0, 0.03)
plt.ylim(0.0, 2.0)
plt.xticks([0.00, 0.01, 0.02, 0.03])
plt.legend(title='win_per', fontsize = 'small')
plt.axhline(y=1.0, color='black', linestyle=':')
plt.tight_layout()
plt.savefig('balance_and_risk.png', dpi=150)
plt.show()
(2017/02/09更新)

VirtualBoxの使い方

VirtualBoxのインストール

①端末に以下のコマンドをコピー&ペーストして「Enter」キーを押す。

sudo apt-get install -y virtualbox

②「[sudo] **** のパスワード:」でパスワードを入力して「Enter」キーを押す。

VirtualBoxをLauncherに登録

①端末に以下のコマンドをコピー&ペーストして「Enter」キーを押す。

virtualbox

「Oracle VM VirtualBox マネージャー」が起動する。

②Launcherの「Oracle VM VirtualBox マネージャー」を右クリックする。

③「Launcherに登録」をクリックする。

VirtualBoxの起動

○Launcherの「Oracle VM VirtualBox マネージャー」をクリックする。

VirtualBoxの終了

○「Oracle VM VirtualBox マネージャー」の「×」ボタンをクリックする。

仮想マシンの作成

例として仮想マシンを作成し、その仮想マシンにUbuntuをインストールしてみる。

①「Oracle VM VirtualBox マネージャー」のツールバーで「新規」ボタンをクリックする。

②「仮想マシンの作成」の「名前とオペレーティングシステム」で「名前」に「Ubuntu」と入力する。

③「タイプ」が「Linux」に、「バージョン」が「Ubuntu (64-bit)」に変更されたのを確認して「次へ」ボタンをクリックする。

ホストマシンが32bitなら、「Ubuntu (32-bit)」となる。

④「メモリーサイズ」で「4096」と入力する。

ホストマシンの実メモリに基づき、余力を残して設定する。

これは後で設定し直すこともできる。

実マシンでメモリの増設などができるのと同じである。

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

⑥「ハードディスク」で「仮想ハードディスクを作成する」を選択する。

⑦「作成」ボタンをクリックする。

⑧「仮想ハードディスクの作成」の「ハードディスクのファイルタイプ」で「VDI(VirtualBox Disk Image)」を選択する。

⑨「次へ」ボタンをクリックする。

⑩「可変サイズ」を選択する。

⑪「次へ」ボタンをクリックする。

⑫「ファイルの場所とサイズ」でサイズに「500.00 GB」と入力する。

ホストマシンのHDDに基づき、余力を残して設定する。

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

仮想マシンはデフォルトでは「~/VirtualBox VMs」フォルダーに作られる。

仮想マシンの設定

①「Oracle VM VirtualBox マネージャー」で仮想マシン(ここでは「Ubuntu」)を選択する。

②ツールバーの「設定」ボタンをクリックする。

③「Ubuntu - 設定」の「一般」をクリックする。

④「高度」タブをクリックする。

⑤「クリップボードの共有」を「双方向」に変更する。

⑥「ドラッグ&ドロップ」を「双方向」に変更する。

⑦「システム」をクリックする。

なお、メモリのサイズを再設定したい場合は「システム」の「マザーボード」タブの「メインメモリー」に設定したいサイズを入力すればいい。

⑧「プロセッサー」タブをクリックする。

⑨「プロセッサー数」に「2」と入力する。

ホストマシンのプロセッサー数に基づき、余力を残して設定する。

⑩「ディスプレイ」をクリックする。

⑪「スクリーン」タブをクリックする。

⑫「ビデオメモリー」に「32 MB」と入力する。

128MBまで設定できるが、大きければいいというものでもないらしい。

⑬「アクセラレーション」の「3Dアクセラレーションを有効化」にチェックを入れる。

⑭「ストレージ」をクリックする。

⑮「ストレージツリー」で「コントローラー: IDE」の下の「空」をクリックする。

⑯「属性」の「光学ドライブ」右端にあるアイコンをクリックする。

⑰「仮想光学ディスクファイルを選択...」をクリックする。

⑱「仮想光学ディスクファイルを選択してください」で「ubuntu-16.04-desktop-amd64.iso」ファイルのあるフォルダーに移動する。

⑲「ubuntu-16.04-desktop-amd64.iso」を選択する。

⑳「開く」ボタンをクリックする。

㉑「Ubuntu - 設定」で「OK」ボタンをクリックする。

仮想マシンにUbuntuをインストール

①「Oracle VM VirtualBox マネージャー」で仮想マシン(ここでは「Ubuntu」)を選択する。

②ツールバーの「起動」ボタンをクリックする。

「起動」ボタンをクリックすることは仮想マシンからは電源を入れたように見える。また、「仮想マシンの作成」の⑥から⑬の手順により、仮想マシンからは空のHDDがあるように見える。さらに、「仮想マシンの設定」の⑭〜⑳の手順により、仮想マシンからはUbuntuのisoイメージが書き込まれたDVDがDVDドライブに挿入されているように見える。

そのため、仮想マシンを起動すれば、その後は実マシンにUbuntuをインストールする手順と同じである。Ubuntuのインストールについては「簡易マニュアル」カテゴリの「Ubuntu簡易マニュアル」を参照。

(2017/01/09更新)