『botterのリアル』のrichmanbtc氏のチュートリアル入門してみた

本読んだけど内容がまったくわからなかった人おる?

richmanbtcのチュートリアルには前提として

  • トレードの知識
  • テクニカル指標の知識
  • 仮想通貨の知識
  • プログラミングの知識
  • 機械学習の知識
  • 取引所の知識
  • サーバー設置の知識
  • Dockerの知識

これぐらいはわかっているでしょう。というレベルで書かれているので内容についていけない人は多いとおもいます。(俺も、その一人)

初心者向けの解説もふまえてrichmanbtc氏のチュートリアルを一通りやっていこうとおもう。

richman機械学習チュートリアルURL

機械学習とルールベースのトレードの違い

先にルールベースついて説明すると、

ルールベースはトレードの予約注文です。「新規注文タイミング」と「決済タイミング」をあらかじめ指定します。

ルールベースはテレビの毎週録画みたいなものですね。

例えば「前日から価格10%値下がりしたらBuy」「ポジション保有して3%値上げ、又は2%下落したらポジションクローズ」というカウンター予約注文をだしておくと、この通りに自動売買します。

では機械学習トレードは?

機械学習のトレードでは”おまかせ”が出来るようになります。

わたしは散髪にいくとき、いつも床屋さんに”おまかせ”しています。

richmanbtcさんは機械学習で”完全おまかせ”にするのではなく、

ルールベース+機械学習で戦略を練っています。

ルールベースのシグナルで、機械学習は審判の役割を果たします。

審判のレベルで勝率アップです。

チュートリアル初期値はチンパンジーレベルの審判かもしれません。

システムトレードやプログラミングがまったくわからない

そういう人は、先にMT4で自動売買を作ってみた方が良いです。

richmanbtc式はテクニカル指標を使った自動売買の延長線にあるので、元を辿るとMT4のEAでの自動売買です。

このブログでもMT4、MT5、TradingViewなどのプラットフォームサービスを使った簡単に作れる自動売買を紹介しています。

以下のリンクは1時間でさくっと作れる自動売買作成方法を紹介しています。

以下、動画でわかるTradingViewとPythonを使った自動売買作成方法です。

以下、テクニカル指標SMA(単純移動平均)を使った自動売買作成方法です。

以下、ドル円のアノマリーEAの作成方法です。

機械学習をトレードに応用する

本題はいります。

界隈で「仮想通貨の値動きをAIで予測するのは運ゲー」と言われてるみたい。

たしかに同じようなチャートでも上がったり下がったりランダムに動きますから、同じデータでもある時は上昇しある時は下落します。

kaggleの株価予測はクソコンペ

他の機械学習のお題よりも攻略難易度が高い、ということは頭の片隅に置いといてください。

richmanbtc方式では15分ごとに指値をだして、実際に利益がでるかどうかを機械学習させることにしています。

richmanbtcチュートリアルの執行戦略

  • 15分ごとに指値する

チュートリアルでは以下の順番でMLBOTをつくっていますので上からなぞっていきたいと思います。

  1. ヒストリカルデータのデータ取得
  2. 取引所手数料のデータ取得
  3. 特徴量の作成
  4. 目的変数の作成
  5. AIに学習させる
  6. バックテスト・検定

MLBOTの善し悪しは何でわかるの?

機械学習は汎化性能で良いか悪いかを判別するみたいです。

以下のサイトから引用します。

ここで機械学習モデルの性能とは、訓練データに対してではなく、未知の入力(テストデータ)に対して望ましい結果を返すことです。このような性能を、機械学習の分野では 汎化性能と呼びます。

機械学習がなんなのかをなんとなく理解してからやった方がいいかも。

EAの最適化とは違うの?

EAの最適化は数値を総当たりで入力して過去チャートにフィッティングさせています。

機械学習は数値を与えて訓練させて未来予測させます。

訓練方法は色々な方法があり、訓練方法をモデルとか手法とか呼びます。

線形回帰や決定木を使った方法があるみたいです。

線形回帰がよく分からない人はまず以下の動画がおすすめです。数式を使わずに説明してくれます。

線形回帰とは、説明変数に対して目的変数が線形またはそれから近い値で表される状態。 線形回帰は統計学における回帰分析の一種であり、非線形回帰と対比される。 また線形回帰のうち、説明変数が1つの場合を単純線形回帰、2つ以上の場合を重回帰と呼ばれる。 ウィキペディア

MLBOTをつくる

買い指値・売り指値の判定が必要なので判断するAIを2体つくります。

機械学習では (1).正解データ※ と (2).特徴量※ 2つのデータを与えると機械がパターンを見つけてくれます。

※(1).正解データ 答えとも目的変数とも呼ばれる正解の数値(ここでは取引結果)
※(2).特徴量 説明変数とも呼ばれる答えを導き出すトレードの判断材料(ここでは各テクニカル指標)

チュートリアルではまず、特徴量(トレード判断材料)を作ることから始めます。

MLBOTは特徴量というトレードの判断材料(ここではテクニカル指標の数値)を観てトレードするしないを判断します。

あなたがトレードする時はどこを見て売買を判断していますか?

多分チャートの値動きやテクニカル指標をみたりすると思います。

richmanbtc式のMLBOTはチャートの値動きを見ません。

そのタイミングのテクニカル指標の数値で売買を判断しています。

MLBOTに覚えさせる判断材料は、こちらで用意する必要があるのでPythonのテクニカル指標ライブラリのtalibを使います。

ライブラリをインストールしたらテクニカル指標を計算するために、ヒストリカルデータ(過去のローソク足データ)をダウンロードします。

ライブラリのインポート

Pythonに機能追加させます。

ライブラリの説明(アルファベット順)

  • math 数学の計算
  • crypto_data_fetcher.gmo ヒストリカルデータ取得
  • joblib 並列処理
  • lightgbm 機械学習
  • matplotlib グラフ描画
  • numba 計算の高速化
  • numpy 計算
  • pandas 表計算
  • scipy 数値解析
  • seaborn グラフ描画
  • talib テクニカル指標
  • sklearn 機械学習

ヒストリカルデータ取得(15分ローソク足過去データ)と表計算のデータに変換

ohlcvヒストリカルデータの表
pandasでヒストリカルデータの始値、高値、安値、終値、取引高を表計算用データに変換している

ヒストリカルデータが手に入りました。

ライブラリcrypto_data_fetcher.gmoを使ってヒストリカルデータを取得後、表計算ライブラリのpandas形式にした過去ローソク足のデータ表を作っています。

メイカー取引手数料の取得、取引手数料の列を表に追加

GMOコインのメイカー手数料を取得しています。取得後、表に手数料の列[fee]を追加します。

GMOコインは手数料がマイナスなのでトレードするたびに利益が発生します。

これでローソク足のOHLCV(始値、高値、安値、終値、取引高)と取引所の取引手数料(fee)のデータが手に入りました。

取引手数料の列[fee]を追加

特徴量(説明変数)の作成、テクニカル指標の列を追加

PythonライブラリTA-Libを使ってテクニカル指標の列を作成しています。

特徴量には価格情報を含めないテクニカル指標を使います。

テクニカル指標の計算はご存知ですか?

例えばテクニカル指標の移動平均線は期間の平均を計算しています。

期間とはローソク足の本数です。

期間14の場合はローソク足14本。

ローソク足14の終値の平均価格が移動平均線の数値です。

richmanbtcチュートリアルでは価格情報を含まないテクニカル指標を採用して、時系列変化に強いBOTを作っています。

移動平均線なんかは価格がもろ反映されるので移動平均線というデータは使いません。

ボリンジャーバンドも移動平均線使っているのでボリンジャーバンドから価格情報を引いた数字を使っています。

これで特徴量が出来ました。使いたい特徴量を列から選びます。

特徴量は買いでも売りでも同じデータを使い回します。

このあとの特徴量の選択は省略します。

表にテクニカル指標の列を追加

正解データ(目的変数)の作成、正解データの列を追加

答え(目的変数)には「指値が刺さったときの取引結果」を計算していきます。

トレードの結果(損益)を目的変数yにしています。

AI2体のため答えも2個(買い指値・売り指値)用意しましょう。

指値価格はテクニカル指標のATRを使って毎回計算しています。

買い指値価格 前ローソク足終値 – ATR * 0.5
売り指値価格 前ローソク足終値 + ATR * 0.5

例えば0時00分00秒に、23時45分のローソク足の終値からATRを使って計算した価格に買い指値をだします。

そのローソク足の安値が指値価格以下になれば指値→指値約定したことになります。

約定したポジションを今度は決済します。

決済もATRで計算した指値が刺さるまでローソク足が切り替わりに指値をだします。

指値が刺さったら1回の取引結果がわかるので、その取引結果を機械学習の正解データとします。

順番としては

指値価格計算

指値が刺さった約定価格(fep)を計算

そのローソク足でエントリーしたかどうかを計算

エントリーしたポジションの取引結果を計算

正解データは買いと売りように2つ用意します。

取引結果を正解データする。

  • y_buy 買い指値の取引結果
  • y_sell 売り指値の取引結果

正解データ(y_buy、y_sell)の列を表に追加します。

機械学習をする(特徴量と正解データをBOTに食べさせる)

機械学習のプログラミングはライブラリを使うとシンプルに実装できます。

本番用の分類器model_y_buy.xz、model_y_sell.xzを払い出してます。

バックテスト用はクロスバリデーションでオーバーフィッティングを避けます。

クロスバリデーション難しいので下記Youtubeの動画視聴推奨です。

特徴量(各テクニカル指標)と正解データ(y_buy、y_sell)が出来たのでこの二つをモデル(機械学習の手法)に与えることで、機械学習を行ってくれます。

model BOTに覚えさせる方法

model.fit BOTに特徴量、正解データを与え覚えさせる

そうすると学習済みモデル(特徴量で判断するボットの頭脳)が完成するので、学習済みモデルに予測させます。

y_pred_buy 買い予測結果

y_pred_sell 買い予測結果

学習モデルが特徴量を読み取って、この特徴量ならリターンがプラスになる(利益がでる)と予測をだしたときに指値を実行させます。

チュートリアルのBOTは予測精度がそこまで高くありません。

なので予測有り、予測無しでもあまりリターン結果のグラフは見た目かわらないです。

クロスバリデーションについては説明が難しいので機械学習で株価予測する以下ののYoutubeが参考になります。

バックテストとp検定

バックテストは過去のチャートで実際にポジションをとった場合どうなるかを確認しています。

コードの意味はつかまなくてよいかも。雰囲気でOKです。

いま(2022/05/20)はBacktesting.pyというライブラリを使った方がいいかもしれないです。

p検定は今後も使えるかどうか(安定的に威力を発揮するか)を確認しています。

バックテストでは

  • 買いAIに特徴量から予測させた数値がプラスだったら、買い
  • 売りAIに特徴量から予測させた数値がプラスだったら、売り

決済は予測にかかわらず、ATRで計算したところにローソク足毎指値をだしています。

バックテストは難しいので図解しました。

バックテストの図解
前回の終値をスタートpriceにしている。エントリー時のバックテストの損益計算方法。

バックテストで利用する取引コストを計算

コストの計算おさらい

np.where(条件式,trueの場合,falseの場合) で指値約定した場合の一回のコストを計算(青色の部分)

df[‘buy_cost’] = np.where(df[‘buy_executed’],df[‘buy_price’] / df[‘cl’] – 1 + fee,0)

df[‘buy_price’]は指値価格。現在の足の 終値 – ATR * 0.5

df[‘buy_executed’]は指値が刺さったかどうか。一個先の安値で計算。計算式には df[‘lo’].shift(-1) を使う。

df[‘buy_executed’],df[‘buy_price’] / df[‘cl’] – 1

-1しているのでbuy_cost[i] (コスト)は全てマイナスの数字になる

バックテストでは、その行に「コストが含まれている場合かつポジションを保有している場合」に以下の計算でリターンにプラスしている。

ret -= buy_cost[i] * vol

buy_cost[i]マイナスの数字なのでリターンからマイナスするとプラスになる。

– buy_cost[i]

-買い指値コスト(マイナスの数字)

バックテストのclose計算に使う価格は

cl[i] #一個先の始値(open)

cl[i + 1] #一個先の終値(close)

つまり、すべて一個先の計算をしている。

  • buy_price[i] #一個先に出す指値価格
  • lo[i+1] #一個先の安値(lo)
  • cl[i] #一個先の始値(open)
  • cl[i + 1] #一個先の終値(close)

頭ごちゃごちゃしているかと思いますが、図の通りです。

バックテストの図解
前回の終値をスタートpriceにしている。エントリー時のバックテストの損益計算方法。

以上でチュートリアル部分おわりです。

初期値のBOTの審判精度は高くないのでこっからどんどんパワーアップさせたいです。

ここまでやって初めてスタートラインです。

参考になるブログ・記事

理解するのが難しいと思うので助けになる記事を張っておきます。上から3つは無料で読めて、ADAMさんのは有料noteです。

機械学習おすすめ本の紹介

難易度が低い順番でおすすめしてきます。すべて目は通してあります(読み切ってはいない)

この本が体系的にまとまってておすすめ。Pythonの復習にも◎

難易度低いので3時間ぐらいで読める本。初心者向け。

ここから中級者向けです。

Pythonを理解してるなら、この本がおすすめ。

ルールベースのバックテスト方法が丁寧に解説されています。

内容は為替がメインで実際に動くBOTをつくってます。

説明不要!

まだいそぐ必要はないかも。(パラっとめくっただけ)

ここから上級者向け。

俺は無理だった

全章通して1ミリもわからない

異次元の難易度。

ポーカーでは勝率期待度でベット額を変えるらしい。

筆者の知見が増えたら更新します。

特徴量という宝探し

チュートリアルが終わったら次は実際にMLBOTを開発してみたいと思います。

そのあとは特徴量を探します。

なにかヒントがあればいいんですが…

そういえば機械学習のkaggleコンペで株価予測が開催されているみたい。

もしかしたらヒントが見つかるかも

機械学習コンペ

上位入賞者の解法はrichmanbtc式に似てる要素があるみたいですね。

一旦テクニカル指標を全て使い予測精度に悪影響及ぼす特徴量を削除、テクニカル指標の相関を調べているとのことです。

東京証券取引予測
richmanbtc式のBOT開発中
機械学習株式分析チュートリアル

次はMLBOT作って、機械学習株式分析チュートリアルやります。

みんなも一緒にやろう。

分類問題の方が良いかも

  • -
    コピー

この記事を書いた人

最近のコメント

  1. アバター
  2. アバター
  3. アバター
  4. アバター
  5. アバター

人気記事