Cryptowatchで過去6000件以上のローソク足を保存して自前で価格データを蓄積する以前の記事でも解説したように、CryptowatchのAPIから直接に取得できるBitflyerFXのローソク足は原則として最大6000件までです。1)問題点6000件のローソク足データは、1分足だと約4日分、1時間足でも8カ月分程度にしかなりません。広範なバックテストをしたいとき(例えば、フォーワードテストやローリングウィンドウなどをしたい場合)は、少し物足りなく感じるでしょう。複数の時間軸を併用する売買ロジックをテストするときや、他の時間軸と成績を比較したいときに、期間が揃わないという問題もあります。そこで、自前でローソク足データを定期的に収集して保存するスクリプトを作成してみましょう。収集した価格データは個人利用の目的でのみ使用できます。2)普通に価格を取得して保存するスクリプト最終的には、自動的に価格データを収集し、新しく増えた価格データ(差分)だけを上書きで追加していくスクリプトを作ります。普通にCryptowatchのAPIで取得したJSONデータをそのままファイルに保存するコードを作成してみましょう。after=1483228800)ここまでは、以前に勉強した内容そのままです。CryptowatchのAPIの基本的な仕様やパラメーターをよく理解していない方は、まず以下の記事を参考にしてください。・バックテストに必要な過去の価格データを集めようこれで、まずは上記のコードで直近6000件の価格データをファイルに保存することができました。APIで取得する内容がそのまま保存されます3)差分だけを取得して追加保存するスクリプトでは次に、さきほど作成したファイルに新しく増えた価格データ(差分)だけを追加取得するスクリプトを作ってみましょう。実際のスクリプト運用時には、両者は同じファイル名になります。after=1483228800)1分足の価格データをCryptowatchのAPIで取得し、さらに同じ1分足の価格データをファイルから読み込み、差分を取得して、増えた価格データだけを配列の末尾に追加して再保存しています。同じファイルを指定すると上書き保存になります。今回は、説明しやすいように敢えて別のファイル名にしています。試しに2時間後に上記のコードを同じ1分足で実行してみました。▽以下のようにファイルに保存されます▽差分だけが順番通りに追加されていますコードの解説pythonで配列同士の差分を取得したい場合には、集合型(set型)を使います。set()で、配列を集合に変換することができます。取得このとき、引く順番に注意してください。集合A)を計算する必要があります。何個も並んだ多次元配列の構造になっています。多次元配列はそのままでは集合に変換できませんので、一度、タプル型に変換する必要があります。))これについては、以下の記事を参考にさせて貰いました。・集合型で2次元リストの中の重複した行を削除する差分データの順番を時系列順に直す2つの集合の差分を取った時点では、新しく増えた差分の価格データは順番がぐちゃぐちゃです。そのため、これを時系列順に直してから元のファイルの配列の末尾にくっつけます。多次元配列の順番は、以下のように修正できます。日時データなので、こちらを基準にソートすればOKです。pythonでの多次元配列のソートについては以下の記事が参考になります。・参考:pythonでのソートファイルデータの末尾を削除するCryptowatchから取得した価格データの末尾には、まだ確定していないリアルタイムに形成中の足が含まれています。こちらをそのまま放置すると、その時間の足が確定したときに「差分」として検出されてしまうため、出力後のファイルに同じ時間の足が2つ存在してしまうことになります。そのため、差分を取得する前にあらかじめ、元ファイルの末尾のデータを削除しておきます。以上で完成です!4)ファイルから価格データを読み込むスクリプト最後にファイルから価格データを読み込むスクリプトを作っておきましょう。今回の記事では、CryptowatchのAPIで取得したデータを加工せずにそのままJSON形式で保存しています。そのため、基本的にはCryptowatchのAPIをパースする関数を、そのまま流用することができます。期間も指定できるようにしてみましょう。最初に指定した期間をunix時間に変換して、開始時点(start_period)~終了時点(end_period)までのローソク足データを返します。開始時点と終了時点を指定しなかった場合は、ファイルに存在する全てのローソク足を返します。期間を指定した場合でも、その期間のデータが存在しない場合は、存在する範囲のローソク足データを返します。実行してみましょう!実行結果まずは以下のように何も引数を指定しなかった場合の実行結果です。無事、6000件を超えるデータを取得できていますね。次に期間を指定してみましょう。期間を指定する場合は以下のように引数を設定します。実行結果このように、指定期間のデータだけを抽出することができました!5)データの欠損を調べるちなみに上記のデータには一部に欠損があります。1分足で24時間の範囲を指定したのに、ローソク足データが1429件しかないのはおかしいですね。どのデータが欠損しているのか調べてみましょう。さきほどのコードの末尾に以下のようなプログラムを足してみてください。chart_secこれを実行すると以下のようになります。午前4時0分~12分までの1分足データがごっそり欠落しています。ブラウザでAPIを叩いてみても該当する時間帯のローソク足のデータは存在しないことがわかります。Bitflyerは毎朝4時にサーバーの定期メンテナンスがあります。そのため、他の日時で試しても、朝4時0分~10分頃のデータが存在しないことが多いようです。それ以外にデータの欠損はありませんが、一応、ときどきこのようなデータの欠損がないかは確認してみるといいかもしれません。上記のコードの実行は、蓄積したいのが1時間足であれば1カ月に1度程度、1分足でも1~2日に1回実行すれば十分です。実行頻度がそれほど高くないため、常時起動してWhile文でループするのはあまりに効率が悪いです。手動で実行しても構わないのですが、手動での実行だと忘れてしまう可能性もあります。そこで、Windowsのタスクスケジューラにpythonのファイルを登録して、OSに定期実行して貰うよう設定するのがお勧めです。今の状態でリアルタイムにトレードさせたらどうなるか、コードを部分的に差し替えて個人的にテストしてます。損得関係なくコードがあったら試さずにいられないタチでして。あと資産管理編読みながら、リンク張って頂いた数学の動画もめっちゃみてます。数学Iで時間が止まってる自分には大変ありがたいです。数学ってこんな面白かったんだって今実感してます。動画の説明のわかりやすさもあると思いますが笑いえいえ、こちらこそ。コメントをキャンセルメールアドレスが公開されることはありません。