OANDA用設定ファイルの作成 (2017/05/10)

OANDA用の設定ファイルを作成する。設定は毎回、コマンド入力してもいいのだが、それでは面倒臭い。そこで毎回使う設定はファイルに記述しておく。

①以下の設定を「settings.ini」ファイルとして「~/py」フォルダーに保存する。

[DEFAULT]
environment = practice
account_id = 1234567
access_token = 1234567890123456789012345678901-2345678901234567890123456789012
fromaddr = abcd@yahoo.co.jp
password = 12345678
toaddr =abcd@example.com
folder_ea = .wine/drive_c/"Program Files (x86)"/"OANDA - MetaTrader"/mql4/Files

②自分の環境に合わせて設定内容を変更し、保存する。

  • environment: 口座の種類を設定するもので、デモ口座の場合は「practice」と入力する。
  • account_id: 「OANDA REST APIの準備」でメモしたアカウントIDを入力する。
  • access_token: 同じく「OANDA REST APIの準備」でメモしたアクセストークンを入力する。
  • fromaddr: 送信元メールアドレスを入力する。戦略のシグナルをメールで送信したい場合、このアドレスで送信する。また、ここではyahooメールを利用することとする。
  • password: 送信元メールアドレスのパスワードを入力する。
  • toaddr: 送信先メールアドレスを入力する。戦略のシグナルをメールで受信したい場合、このアドレスで受信する。これはどこのメールでも構わない。
  • folder_ea: MT4の「Files」フォルダーのパスを入力する。パスはMT4のインストール先によって設定例と違う場合もある。これは戦略のシグナルをEAに送信し、EAで執行したい場合に使う。

為替相場が動く時間帯 (2017/05/04)

よく忘れるので、為替相場が動きやすいと考えられる時間帯を一覧表にしておく。時間は日本時間である。

09:00-15:00 東京株式市場
09:55 東京仲値
15:00 東京オプションカット
17:00-25:30(夏時間16:00-24:30) ロンドン株式市場
17:00(夏時間16:00) ロンドンフィキシング(午前8時)
23:30-06:00(夏時間22:30-05:00) ニューヨーク株式市場
24:00(夏時間23:00) ニューヨークオプションカット
25:00(夏時間24:00) ロンドンフィキシング(午後4時)

なお、夏時間は

  • 米国: 3月第2日曜日〜11月第1日曜日
  • 欧州: 3月最終日曜日~10月最終日曜日

となっている。

Ubuntuのインストール (2017/05/02)

Ubuntuをインストールする。「Ubuntu 16.04.2 LTS」(2017年5月2日時点での最新のLTS版)を64bitマシン(ハードディスク500GB、メモリ4GB)にインストールする場合を例として手順を説明する。

OSがUbuntuでなければならない理由はない。だが、トレードやバックテストの環境を構築するに当たって、Ubuntuはとても便利である。

Ubuntuのダウンロード

Ubuntuのイメージファイルをダウンロードする。

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

https://www.ubuntu.com/download/desktop

②「Download Ubuntu Desktop」で「Download」ボタンをクリックする。

③「Help shape the future of Ubuntu」で「Not now, take me to the download ›」をクリックする。

④「ubuntu-16.04.2-desktop-amd64.iso を開く」で「ファイルを保存する」を選択する。

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

イメージファイルのDVDへの書き込み

ダウンロードした「ubuntu-16.04.2-desktop-amd64.iso」ファイルをDVDにディスクイメージとして書き込む。

起動デバイスの優先順位の変更

DVDドライブが起動デバイスの優先順位で1位ではない場合、BIOSで1位に変更する。そうしないと、PCに別のOSがインストールされている場合、そのOSが起動してUbuntuをインストールすることができない。

Ubuntuのインストール

準備が整ったら、Ubuntuのインストールを始める。

①ディスクイメージを書き込んだDVDをUbuntuをインストールするPCのドライブに挿入し、再起動する。

②「Welcome」で「日本語」を選択する。

③「Ubuntu をインストール」ボタンをクリックする。

④「Ubuntu のインストール準備」で「Ubuntu のインストール中にアップデートをダウンロードする」にチェックを入れる。

⑤「グラフィックス、Wi-Fi 機器、Flash、MP3 やその他のメディアに必要なサードパーティーソフトウェアをインストールする」にチェックを入れる。

⑥「続ける」ボタンをクリックする。

⑦「インストールの種類」で「それ以外」を選択する。

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

⑨「新しいパーティションテーブル...」ボタンをクリックする。

⑩「このデバイスに新しい空のパーティションテーブルを作成しますか?」で「続ける」ボタンをクリックする。

⑪「空き領域」を選択する。

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

⑬「パーティションを作成」で「サイズ」を「102400」に変更する。

⑭「新しいパーティションのタイプ」で「基本パーティション」、「新しいパーティションの場所」で「この領域の始点」、「利用方法」で「ext4 ジャーナリングファイルシステム」が選択されているのを確認する。

⑮「マウントポイント」で「/」を選択する。

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

⑰「空き領域」を選択する。

⑱「+」ボタンをクリックする。

⑲「パーティションを作成」で「サイズ」を「4096」に変更する。

⑳「新しいパーティションのタイプ」で「論理パーティション」、「新しいパーティションの場所」で「この領域の始点」が選択されているのを確認する。

㉑「利用方法」で「スワップ領域」を選択する。

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

㉓「空き領域」を選択する。

㉔「+」ボタンをクリックする。

㉕「パーティションを作成」の「新しいパーティションのタイプ」で「論理パーティション」、「新しいパーティションの場所」で「この領域の始点」、「利用方法」で「ext4 ジャーナリングファイルシステム」が選択されているのを確認する。

㉖「マウントポイント」で「/home」を選択する。

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

㉘「インストール」ボタンをクリックする。

㉙「ディスクに変更を書き込みますか?」で「続ける」ボタンをクリックする。

㉚「どこに住んでいますか?」で「Tokyo」と入力されているのを確認する。

㉛「続ける」ボタンをクリックする。

㉜「キーボードレイアウト」で両方とも「日本語」が選択されているのを確認する。

㉝「続ける」ボタンをクリックする。

㉞「あなたの情報を入力して下さい」で「あなたの名前」に名前を入力する。

「コンピューターの名前」、「ユーザー名の入力」は自動的に入力される。

㉟「パスワードの入力」にパスワードを入力する。

㊱「パスワードの確認」にもう一度同じパスワードを入力する。

㊲「ログイン時にパスワードを要求する」が選択されているのを確認する。

㊳「続ける」ボタンをクリックする。

インストールが始まるので、しばらく待つ。

㊴「インストールが完了しました」で「今すぐ再起動する」ボタンをクリックする。

㊵「Please remove the installation medium, then press ENTER:」でDVDを取り出し、「Enter」キーを押す。

㊶ログイン画面でパスワードを入力して「Enter」キーを押す。

インストールが完了し、ログインした状態になる。

Ubuntuの使い方 (2017/04/25)

「Ubuntuのインストール」から続けて、Ubuntuの使い方を簡単に説明する。

デスクトップ画面

Ubuntuのデスクトップ画面では上部に「メニューバー」、左側に「Launcher」がある。デスクトップ画面については、とりあえずこの2つの名前を覚えておけば十分である。

シャットダウン

Ubuntuをインストールした後、そのまま起動してログインしたので、もう一度、起動するところから説明したい。だが、その前にシャットダウンする必要があるので、先ずシャットダウンから説明する。

①メニューバー右端のアイコンをクリックする。

②「シャットダウン...」をクリックする。

③「シャットダウン」ボタンをクリックする。

ログイン

「Ubuntuのインストール」の最後でログインしているが、やり方はそれと同じである。

①PCの電源ボタンを押す。

②ログイン画面でパスワードを入力して「Enter」キーを押す。

端末のLauncherへの登録

このブログではUbuntuの端末を使った手順が多い。そこで、端末をLauncherに登録しておく。

①デスクトップの適当な場所を右クリックする。

②「端末を開く」をクリックする。

端末が起動する。

③Launcher上の「端末」を右クリックする。

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

端末の終了

端末をLauncherから起動する手順(手順というほどのものでもないが)を説明したい。だが、その前に起動した端末を終了させる必要があるので、先ず端末の終了から説明する。

○「端末」の「×」ボタンをクリックする。

端末が終了する。

端末の起動

では、端末を起動する。

○Launcher上の「端末」をクリックする。

端末が起動する。

破産レバレッジ (2017/04/15)

破産させるレバレッジを考えてみる。ここではそれを破産レバレッジと呼ぶことにする。

破産レバレッジの計算式

計算式は

破産レバレッジ >= 1 / 最小リターン * (-1)

とする。

もし最小リターンが-1%だったとする。すると破産レバレッジは1 / (-0.01) * (-1) = 100.0となる。最悪で1%の負けでもレバレッジ100倍なら100%の負け、つまり破産となるわけである。

最悪の負けはすべてのトレードの中で少なくとも1つはある。それがトレードの最初であろうと、最後であろうと、それ以外であろうと関係ない。破産レバレッジでそのトレードが行われた瞬間、たちまち破産する。

もちろん、最小リターンがマイナスでない場合、つまりすべてのトレードで1度も負けがない場合、破産レバレッジは意味をなさない。あくまでも勝つこともあれば負けることもあるトレードというのが前提である。

シミュレーション

さて、破産レバレッジをシミュレーションで確認してみる。ここに1トレード当たりの期待利益が0.1%、リスクが0.5%の戦略があるとする。トレードを100回行うとして実行してみる。

以下のコマンドを実行してシミュレーションを行う。

import matplotlib.pyplot as plt
import numpy as np

trades = 100
ret = np.random.normal(0.001, 0.005, trades)
x = np.array(range(1, 101))
y = np.zeros(trades)
for i in range(trades):
    if i == 0:
        y[i] = 1.0 * (1.0 + ret[i])
    else:
        y[i] = y[i-1] * (1.0 + ret[i])
    if y[i] < 0.0:
        y[i] = 0.0
mean = np.mean(ret)
std = np.std(ret)
worst_kelly = 1.0 / np.min(ret) * (-1)
ax=plt.subplot()
plt.plot(x, y)
plt.xlabel('Trades')
plt.ylabel('Equity curve')
plt.text(0.05, 0.9, 'Worst Kelly = ' + str(worst_kelly),
         transform=ax.transAxes)
plt.savefig('bankruptcy_leverage1.png', dpi=150)
plt.show()
plt.close()

n = 10000
equity_curve = np.empty(trades)
x = np.array(range(n)) / 100
y = np.empty(n)
for j in range(n):
    leverage = j / 100
    for i in range(trades):
        if i == 0:
            equity_curve[i] = 1.0 * (1.0 + ret[i] * leverage)
        else:
            equity_curve[i] = equity_curve[i-1] * (1.0 + ret[i] * leverage)
        if equity_curve[i] < 0.0:
            equity_curve[i] = 0.0
    y[j] = equity_curve[trades-1]
argmin = np.argmin(y)
ax=plt.subplot()
plt.plot(x, y)
plt.axvline(x=worst_kelly, color='green')
plt.axvline(x=x[argmin], color='green')
plt.axhline(y=1.0, color='red')
plt.xlabel('Leverage')
plt.ylabel('Balance')
plt.text(0.05, 0.9, 'Worst Kelly(actual value) = ' + str(x[argmin]),
         transform=ax.transAxes)
plt.text(0.05, 0.85, 'Worst Kelly = ' + str(worst_kelly),
         transform=ax.transAxes)
plt.savefig('bankruptcy_leverage2.png', dpi=150)
plt.show()
plt.close()

シミュレーション結果によると、破産レバレッジは63.7157243783で、実測値は63.72となっている。実測値は0.01のインターバルで測っているので、もっと細かくやれば理論値と一致するだろう。最適レバレッジの計算に比べれば非常に単純明快であり、近似式も必要ない。

永遠にトレードすれば破産?

ところで、最適レバレッジではトレード数が増えれば、リターンの平均、標準偏差は理論値に収束していく。だが、最小リターンというのは曲者で、わずか1回の発生でも最小リターンとなりうる。つまり、トレード数を1万回、100万回と増やしていけば最小リターンはより小さくなりうるのである。

最小リターンがより小さくなるなら、破産レバレッジもより小さくなるだろう。言い換えると、トレードを永遠に続ければ、いずれは破産するだろう。

ただ、上のコマンドの「trades」の数を変更してトレードを50万回やっても破産レバレッジは45倍前後である。日本国内の規制である25倍よりはまだ大きい。

トレーダーは果たして一生のうちに50万回もトレードできるのだろうか。人にもよるだろうが、それほど多くはないだろう。だとすれば、トレードしていればいずれ破産するというのは杞憂だ。

もちろん、1トレード当たりの期待利益が0.1%、リスクが0.5%の戦略であればの話である。期待利益がマイナスの戦略ならレバレッジなどは関係ない。遅かれ早かれ破産するので、トレードはやめたほうがいい。