はじめに
暗号資産の自動売買ツールやバックテスト環境を自作している方、きっと一度は経験する悩みがあります。 過去の Tick やローソク足データを読み込んでグラフを表示すると価格の動きは滑らかに見えるのに、計算した口座の純資産が実際の損益とずれてしまう現象です。
最初は「行情データが欠損しているのかな」「API の配信に不具合があるのかな」と思って、一つ一つ価格データを確認しても原因が見つからず、時間を無駄にしてしまうことも多いです。
私自身、長年定量開発の現場に携わり、多くの自作ツール開発者の相談を受けてきました。このズレの正体は、API の時系列データに価格情報だけが記録され、保有枚数が変わるエアドロップスナップショットやハードフォークのイベントが別管理されていないことにあります。
価格データと資産変動イベントを混ぜて計算すると、目に見えない誤差が積み重なり、バックテストでは好成績なのに実際に運用すると全然違う結果になってしまいます。今回は初心者にも分かりやすく、現場で使えるデータ管理手法、3 階層のデータ構造、リアルタイム行情とイベントの紐付け方法、サンプルコードまでまとめました。
1. 自作ツールでよくある 3 つの落とし穴
① エアドロップスナップショットを Tick と同じように計算してしまう
多くの行情 API にはエアドロップ専用の項目がなく、event_typeやevent_flagといった隠しパラメータでスナップショットのタイミングを記録しています。
ここで大切なポイントは、エアドロップは取引ではなく「保有資産の状態変化」だということ。市場の価格を動かさず、持っているコインの枚数だけ増える仕組みなので、普通の約定 Tick と同じ計算式で純資産を算出すると、シミュレーションの収益と実際の受取額に大きな差が生まれます。初心者に一番多いミスなので要注意です。
② ハードフォーク発生時の資産時系列を分離せず二重計上してしまう
ハードフォークは単なるエアドロップと違い、特定のブロック高で元の通貨が 2 つの独立したチェーンに分かれる現象です。API にはやといった項目で元チェーンと派生通貨を区別する情報が入っています。chain_tagsymbol_version
2 つの時系列を分けずにそのまま計算すると、同じ期間のデータが 2 種類の通貨に重複して反映され、複数銘柄のポートフォリオを検証すると誤差がどんどん大きくなります。現場で一般的な対策として、フォークが起きたブロック高を境に、新しい通貨のデータ系列を作成する方法が定番です。元の時系列に派生通貨のデータを追加する実装は避けましょう。
③ リアルタイム Tick にイベント情報がなく、過去データと実運用の基準がズレる
見落としがちな点として、保存済みの過去データにはエアドロップやフォークの記録が付いているのに、リアルタイム配信の Tick ストリームにはこれらの情報が含まれないことが挙げられます。
行情だけで戦略の動作検証をすると資産変動のタイミングが完全に抜け落ち、バックテストの結果が実際の運用の参考にならなくなります。
2. 誤差を抑える 3 階層データ管理の仕組み
複数のバックテストツールに導入して検証したところ、3 種類の時系列データを分けて保存し、タイムスタンプで紐付ける方法が一番安定しています。行情、イベント、損益計算用データを分離することで、それぞれの情報が干渉するのを防げます。
- 価格レイヤー:Tick、ローソク足、板情報の約定記録だけを保管。エアドロップやフォークといった資産変動の情報は一切入れない。
- イベントレイヤー:エアドロップスナップショット、ハードフォークの情報を独立して保存。発生時間、イベントの種類、分配比率、フォーク後の通貨名などの詳細を記録。
- 損益計算レイヤー:各エアドロップの配布枚数、フォークでの保有分割比率を記録し、口座純資産や累積損益の算出に専用で使用。
3 階層に分けておけば、純資産のズレが発生した時にどのイベントが原因かすぐ特定でき、デバッグの手間が大幅に減ります。
3. リアルタイム行情とイベントデータの紐付け実装
自動売買のリアルタイム環境を作る時は、Tick 行情の配信と資産イベントの記録を別々に取得・保存し、時間のウィンドウを利用してデータを照合します。
開発検証の際は AllTick API の WebSocket 長時間接続を利用してリアル Tick を取得しています。出力形式が統一されているので、自分で用意したイベントデータベースとタイムスタンプで簡単に紐付けられます。
実装のポイントとして、API から送られるリアル行情だけに頼らず、ローカルにイベントデータを保管する仕組みを作っておくこと。戦略をリプレイする時にイベント情報を読み込んで保有枚数を補正しないと、シミュレーション中に資産変動の記録が欠け、結果が大きく歪んでしまいます。
4. 長年開発して分かった大事な考え方
定量開発を続けて痛感したのは、価格のグラフは見た目だけの情報に過ぎず、バックテストの信頼度を決めるのはエアドロップやフォークといった資産イベントの記録だということです。
単一銘柄だけの簡単な戦略ではバックテストの結果が良く見えても、複数銘柄のポートフォリオやフォークを跨ぐ長期データを使うと結果が大きく変わるケースが非常に多いです。原因の多くは、開発時にエアドロップやフォークをノイズと判断して計算から除外してしまうことにあります。
自作ツールに導入したい標準的な流れをまとめます。
- データを保存する段階で価格・イベント・損益の 3 系統に分ける
- API に埋め込まれたイベント項目を読み取り、エアドロップとフォークにそれぞれタグを付ける
- ハードフォークはブロック高を境に時系列を切り、新しい通貨のデータ列を作成
- リアルタイム Tick とローカルのイベント保存データを時間で照合
- バックテスト実行時に 3 系統のデータを同時に読み込み、保有純資産を随時補正
この手順でデータ基盤を作成すれば、暗号資産の実際の保有変動を正しく再現でき、エアドロップやフォークによる計算のズレを解消できます。個人の小さな自動売買ツールから、小規模な定量検証環境まで幅広く活用できます。