技巧をUbuntuにインストール (2017/07/21)

第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に登録するには以下のようにする。

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

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

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

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

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

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

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

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

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

⑨「エンジン設定」の「BookFile」で「...」ボタンをクリックする。

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

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

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

⑫「エンジン設定」に戻って「DepthLimit」を「1」に設定する。

こうすると最も弱い設定になる。最強は「100」である。

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

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

参考リンク

将棋ソフト「技巧」

elmoをUbuntuにインストール (2017/07/21)

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

elmoは評価関数と定跡だけなので、将棋エンジンに設置する必要がある。

elmo開発者の瀧澤誠さんご自身が説明している導入方法では将棋エンジンとしてやねうら王を使っている。そこで、ここでもそのようにする。

やねうら王のダウンロード

やねうら王を「ダウンロード」フォルダーにダウンロードする。

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

https://github.com/yaneurao/YaneuraOu/

②「Clone er download」をクリックする。

③「Clone with HTTPS」で「Download ZIP」をクリックする。

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

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

elmoのダウンロード

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

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

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

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

③「Google ドライブではこのファイルのウィルス スキャンを実行することはできません。」で「ダウンロード」ボタンをクリックする。

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

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

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

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

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

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

elmoをやねうら王に設置

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

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

$ cp ~/デスクトップ/elmo.shogi/eval/*.bin ~/デスクトップ/YaneuraOu-master/exe/eval; \
cp ~/デスクトップ/elmo.shogi/book/yaneura_format/standard_book.db ~/デスクトップ/YaneuraOu-master/exe/book; \
cp -r ~/デスクトップ/YaneuraOu-master/exe/eval ~/デスクトップ/YaneuraOu-master/exe/2017Early; \
cp -r ~/デスクトップ/YaneuraOu-master/exe/book ~/デスクトップ/YaneuraOu-master/exe/2017Early

やねうら王のコンパイル

やねうら王にあるexeファイルはUbuntuでは実行できないようである。そこでソースファイルをコンパイルする。

やねうら王開発者のやねうらおさんによると「make avx2」でコンパイルすればよいらしい。だが、私の環境でははうまくいかなかった。そこで「make sse42」とした。

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

$ cd ~/デスクトップ/YaneuraOu-master/source; \
make sse42; \
cp ~/デスクトップ/YaneuraOu-master/source/YaneuraOu-by-gcc ~/デスクトップ/YaneuraOu-master/exe/2017Early

やねうら王(elmo)をShogiGUIに登録

やねうら王(elmo)をShogiGUIに登録するには以下のようにする。

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

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

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

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

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

⑤「Open」で「~/デスクトップ/YaneuraOu-master/exe/2017Early」フォルダーに移動する。

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

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

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

⑨「エンジン設定」の「BookDepthLimit」を「0」に設定する。

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

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

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

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

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

⑮「Threads」を「16」に設定する。

推奨の設定ではCPUコア数の2倍とあり、私のPCは8コアなので、上のように設定した。

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

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

参考リンク

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

やねうら王2016MidのLinux/Mac対応について

ubuntuに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

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

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

Ubuntuのトラブル (2017/07/07)

私の環境で時々起きるUbuntuのトラブルとその解決法を備忘録として残す。

「システムプログラムの問題が見つかりました」

Ubuntuを起動すると、「システムプログラムの問題が見つかりました」と表示されることがある。一度、表示されると、以降、起動するたびに表示されるようになるので鬱陶しい。

クラッシュが発生したときに生成されるcrashファイルが原因のようである。これを削除すれば、以降、表示されなくなる。

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

$ ls /var/crash

crashファイルの名前が表示される。一応、何がクラッシュしたのか確認しておく。

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

$ sudo rm /var/crash/*

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

crashファイルが削除される。

「ファイル“****”を開く際にエラーが発生しました。」

Windowsで作成したテキストファイルをテキストエディターで開こうとすると、「ファイル“****”を開く際にエラーが発生しました。」と表示が出て、開けない場合がある。

「エンコーディング」は「現在のロケール (UTF-8)」となっている。「再試行」ボタンをクリックしても、やはり「ファイル“****”を開く際にエラーが発生しました。」と表示が出て、開けない。

Windowsで作成したテキストファイルはshift-JISで書かれていると思う。そこで、テキストエディターで「エンコーディング」を「日本語 (SHIFT_JIS)」に変更して「再試行」ボタンをクリックしてみる。だが、今度は「ファイル“****”を開けませんでした。」と表示は変わるものの、やはり開けない。

原因ははっきりしないが、テキストエディターで読めるようにするにはとりあえず文字コードをUTF-8に変換するのが手っ取り早い。

例として「ホーム」フォルダーに「file_shift-jis.txt」ファイルがあるとして、これをUTF-8に変換して「file_utf-8.txt」ファイルとする手順を説明する。

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

$ nkf -w ~/file_shift-jis.txt > ~/file_utf-8.txt

「file_shift-jis.txt」ファイルはそのまま残り、「file_utf-8.txt」ファイルが新たに作成される。「file_utf-8.txt」ファイルをテキストエディターで開くと、無事にファイルの内容を見ることができる。

的中率とシャープレシオ (2017/07/06)

的中率とシャープレシオとの間にどのような関係があるかをシミュレーションによって調べてみる。

単純化のため、ここでいくつかの仮定を置く。

先ず、ボラティリティは1.0で固定とする。固定でさえあれば、実際にはどの数値でも結果は変わらない。

次に1年当たりのトレード数を260回とする。これは数値を変えると結果も変わるので動かせない。この数値は1年当たりの営業日が260日であることに基づく。イメージとしては毎日、上がるか下がるかを予測して売買し、1日の損益の絶対値は常に一定、と考えればいい。

最後にコストは考慮していない。

それではシミュレーションを始める。

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

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

②的中率とそれに対応したシャープレシオを計算する。

start = 50
end = 105
step = 5
n = int((end - start) / step)
accuracy = np.array(range(start, end, step)) / 100
sharpe_ratio = np.empty(n)
volatility = 1.0
trades = 260
for i in range(n):
    ret = ((volatility*accuracy[i]) - (volatility*(1.0-accuracy[i]))) * trades
    risk = volatility * np.sqrt(trades)
    sharpe_ratio[i] = ret / risk

的中率は50-100%の範囲で5%刻みとする。

③グラフを表示する。

plt.plot(accuracy, sharpe_ratio)
plt.xlabel('Accuracy')
plt.ylabel('Sharpe ratio')
plt.xlim(0.5, 1.0)
plt.savefig('sharpe_ratio_accuracy.png', dpi=150)
plt.show()

グラフを見ると、的中率とシャープレシオは比例していることが分かる。

④的中率とシャープレシオの関係を示すモデルを作成する。

def model(accuracy, slope, intercept):
    return slope * accuracy + intercept

上のグラフから以下のような関係を想定している。

シャープレシオ = 傾き * 的中率 + 切片

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

popt, pcov = curve_fit(model, accuracy, sharpe_ratio)
slope = popt[0]
intercept = popt[1]
print('Sharp Ratio = ', slope, ' * Accuracy + ', intercept)

Sharp Ratio =  32.2490309932  * Accuracy +  -16.1245154966

求められた傾き、切片によると、的中率が5%上昇するだけでシャープレシオは約1.61上昇するということが分かる。的中率で見ると、5%くらい大した違いではないように思うかもしれない。だが、これは大変な改善なのである。

もし的中率が70%であったら、

シャープレシオ = 32.2490309932 * 0.7 + (-16.1245154966) = 6.4498061986399975

となる。

シャープレシオが3.0以上なら、それは素晴らしい戦略だろう。6.0を超えるとなると、もはや尋常ではない。言い換えれば、的中率が70%に達するというのは尋常ではないのである。

機械学習、またはディープラーニングで株価予測的中率が○○%になった、というような話をよく聞く。だが、実際に尋常ではない素晴らしい成果が得られたのか、それとも何らかの間違いを犯していたり、単なる誇大広告であったりしないか、しっかりと吟味する必要がある。