プログラムについて完全に素人でただの雑談レベルの話なのでプロの方はモヤモヤするかもしれませんがスルーいただければ幸い。
プログラムって結構一般の人から見たらとっつきにくくて滅茶苦茶大変そうって思われるかもしれないのですが、実は案外そうでもなくて、タイトルにもある通り日本語(母国語)だけで割とすんなり書けちゃったりします。
私は趣味でたまにプログラムを書くのですが、大体は電車の移動中とかにスマホにまとめてポチポチ書いて、家でガーーーっと組み立てる感じで作るタイプの人間です。
で、そのスマホに書くときは全部日本語。プログラムって極端に言えば「日本語」という言語を「プログラム言語」に作り直す作業をするだけだったりします。コンパイルとかも挟むと、日本語→プログラム言語→機械言語になるのですが、極論、最初の日本語部分でしっかり作っておけばあとはガーっと作業だけで済んだりします。※趣味レベルの簡単なものに限る
ということで、ちょっとサンプルを書いてみましょうか。
私は今ビットコインで「CME窓」を使った取引に夢中になっています。以下過去記事。
超ざっくり説明すると、CMEの取引時間内の最後の終値から、CMEの取引時間外の最初の始値で大きく差が生じて「窓」と呼ばれるチャートの間の空間が生まれる所があるのですが、それを「埋める」確率が非常に高いというもの。
で、上記の過去記事で目視でなんとなく1時間足で窓が開いた後に閉じる動きをしている所の勝率を過去1年分だけしかみてないですが、それがかなり高かったと。
ただ、あくまで「目視」で見ただけであって、もっと厳密に見たら勝率は結構変わるかもしれないという思いもあります。
そこでプログラムを作って確認するにはどうしたらいいかというのを考えることになります。もしくはエクセルでまとめたり。エクセルもなんだかんだプログラム言語チックな所があるので、実際に簡単な出力結果が欲しいなら実はエクセルと関数使えば済んだりします。
とはいえ、一旦ここではプログラムを作る話にしましょうか。次の部分を考えることになります。
また、予防線ですが、私自身まだ実装してないので以下の想定から全然足りてなかったりするかもしれません。なんとなく今日パッと記事にしただけなのでその点ご了承ください。
プログラムで必要なもの
- 最終的に何が出力されればいいのか(目標)
- 目標に到達するにはどんな機能が必要か
- その機能を実現するためにどんな数値/要素が必要か
ということで、まずは目標を考えます。
今回の目標
- 指定期間のCME窓の発生個所を調査し、発生した部分が閉じた回数と閉じなかった回数を調べて勝率を叩き出す。
大まかにこんな目標を掲げます。1時間足バージョンと日足バージョン両方できるようにしてもいいかも。それは小目標としてできれば実装しましょうか。今回は1時間足のみで考えてみましょう。
ではこの目標を到達するのに何が必要かを考えます。
必要なもの
多分これだけあれば十分。他取引所のBTCの価格データについては別になくても実装はできるかなと。ただ、逆にCMEの取引データの取得方法が私が分からなかったので、これらのデータを集めるのはちょっと難しそう。
なので代替案として、他取引所のBTCの価格データと、CMEが取引しているのは日本時間の土曜日の朝6時59分で営業時間が終了し、月曜日の朝8時00分に再開するので、
があれば、なんとなくCMEの取引データが無くてもギリギリ調査自体は可能かなと。本当は祝日も考慮すべきなのでしょうが今回は割愛。もしCMEの取引データ自体を取得できれば超絶らくちんなのですが、あったら教えてくださいって感じで私には分からなかったので仕方なく上記だけで調査します。
BTCの価格データ自体はcoingeckoからもCSVファイルを取得できるのでそれをデータベースにでも突っ込んでおけば後はググって「データベース SELECT {使いたい言語}」でやれば出てくるのでそこから取得すればよい。
話が脱線しました。
ということで、欲しいデータの見当は付けました。では目標を実現するためにどのような機能があればいいでしょうか。
必要な機能
- BTCの価格データを取得する機能
- CME窓が発生する日時の終値と始値を調べてその差が「xxx」を超えたかどうかを判定してその「終値」が発生した「日時」と「終値」をリストに保存する機能
- そのリストの発生日時以降に窓を埋めるだけの値が発生したかを調査する機能
今回はあくまで「勝率」を出すだけなのでこれぐらいあればいいかな?という感じ。勝率に追加で「最大の儲け度合」とかを調べる場合はCME窓が発生した後日の高値もしくは終値がピークに到達した時からCME窓を埋める差額を求めればなんとなく出るかなぁという感じ。
今回の目標はあくまで「窓」を埋める確率だけを見たいのでこんな感じにしました。
ではこの機能を実現するために必要な要素とかを考えます。
必要な要素
- 自分が知りたい調査開始日
- 自分が知りたい調査終了日
- CMEの営業日時をまとめたリスト(※任意)
- BTCの価格データを保管するリスト(日時,終値,安値,高値)
- CME窓判定がでた際の日時と終値を保管するリスト(日時,終値)
これぐらいあれば行けるかなぁ。多分。
調査開始日と調査終了日は、例えば2011年頃とかBTCがまだ始まったばかりの頃のデータは扱うにしてもあんまり意味がないかなぁとか思えば、例えば2015年とか2016年ぐらいから取得するためにその日を指定して調査開始日とするとかね。
で、CMEの営業日時をまとめたリストは任意としました。今回は単純に日本時間土曜日の6時59分(※7時)と月曜日朝8:00のデータがあればいいと決め打ちにしてるので、最初のCMEの営業日時を引数かプログラムに直接書き込んで、あとは7日間周期でとるプログラムを実装すればとれるので。ちょっと雑ですが個人で適当にデータを取るだけならそのぐらいの実装でも問題ないのだ。
で、あとはBTCの価格データを保管するリストは毎日毎時のデータをリストに入れて、CME窓の判定日以降に安値か高値とCME窓発生日の終値が超えてるかどうかを確認する機能を作りこめばいいことになります。
では最後に「機能」をどう実装するかをもう少し考えます。
BTCの価格データを取得する機能
これは任意。手動でcoingeckoからCSV取得してデータベースに入れ込むというのを手でやってもいいし、APIとかがあればそこから取得できたらいいなと思う。世の中便利なもので、コマンド一つでこういうデータが取れたりするのだ。
ですが、私はやり方が分からない素人(※というか調べるの面倒)なので、CSVファイルをDBにインポートしたりしてます。
この方法については任意の機能であり、手動で入れてもいいかなと思うので割愛。やり方は「CSV データベース(※例えばMySQL) インポート」とかでググったら大量にでてくるのでそれを手動でやることになります。
CME窓判定機能
では続いてCME窓判定の機能をどう実装するか。いったん、CME窓発生日の営業日をテキストファイルに書き込んだ場合を想定して記載します。
- CME窓発生日のテキストファイルをインポートする
- CME窓発生時の終値 - CME窓発発生後の始値を計算して、その絶対値が「xxx」を超えた場合は「終値の発生日」と「終値」をリスト化する
- これを「調査開始日」~「調査終了日」まで繰り返す
- 全てのデータがリストに入ったらそれを結果として返す
ここがプログラムの実装部分となります。上から順番にプログラム言語に書き直すだけという感じです。後はこのリストを実際に出力して、その結果が本当に正しいかどうかをTradingViewのBTC1!とかで見比べてみて、実際に「窓」が発生するぐらいに価格差が生じているかを確認することになります。
CME窓が埋まったか調査機能
上記の機能からCME窓が発生したリストを入手できました。これを今度は判定する機能を作りこんで調理します。
- 「CME窓が発生したリストの開始日」~調査終了日」までを毎日チェックします
- BTCデータの日々の「高値」もしくは「安値」が「CME窓が発生したリスト」の「終値」を超えているかどうか判定し、そこに引っかかったら勝利、ひっかからなかったら敗北として記録を付けます
- 調査が終わったら「CME窓が発生したリスト」の次の日を調査対象に加えて最初に戻ります
こんな感じかなぁ。もっとスマートなやり方あると思うけどデータも少ないし力業のごり押しでもそんなに処理時間はかからないので適当に作ればこんなもんか?
とにかく勝率を出すだけなのでCME窓発生時の終値を起点にそこまで値が戻ってくるか否かを判定できればOKということです。
後は実際に「勝利数」 ÷ 「CME窓が発生したリスト」の要素数 で勝率がでるとこういう感じですね。
後は自分が気に入ったプログラム言語を使って上記の機能の詳細部分をプログラム言語に翻訳していけばプログラム完成です。
最近だとpythonが流行ってるのかな?人工知能で使われてるそうなので、もし将来性を考えて、仕事でも使う可能性も考慮するならpythonでいいんじゃないかなと思わなくもない。ちなみに私は全く使ったことがないので知らない。けど、この程度のプログラムならどの言語でも簡単に書けると思います。
後はCMEやBTCのデータを簡単に取得できるAPIが対応しているプログラム言語を使うのが楽かなと思った次第。
「BTC API 取得」でググったら結構どんなプログラム言語でも取得できるっぽいからほんと、どれでも良さそうだねぇ。
WindowsならPowerShell使ってもいいし、Linuxならデフォで入ってるbashとかperlとかphp、Rubyとかでもいいかなと。rubyとphpはデフォでは入ってないかもだけど。
ということで、日本語でやりたいこと書いて、あとはなんでもいいからプログラム言語に置きなおすだけで実際プログラムは書けますよってお話でした。