Pythonトレーディングボットの自作方法
モリッツ・プッツハンマー
2022年8月30日 – 8 読む
目次
Trality Bot Code Editorと最初のPython取引ボットを使い始めるために、この投稿を使って、シンプルな取引アルゴリズムを構築するためのかなり基本的なアプローチを取り上げます。これは標準的なテクニカル分析(TA)で構成されていますが、Trality APIのいくつかの機能も含まれており、学習を進めるにつれて、より洗練された取引ボットを作成するのに役立つことでしょう。さらに、過去のデータでアルゴリズムをテストする、結果のバックテストを分析し、その後、オプティマイザーを使用して、最大限の利益を得るために戦略のパラメータを最適化します。
トラリピのPythonコードエディタでトレーディングボットを作成する
トラリティの最新鋭のPythonコードエディターにより、ユーザーは以下のことを行うことができます。 非常に革新的で複雑なアルゴリズムを作成することができます。 を最も効率的な方法で作成します。
アルゴリズムとバックテストの結果に満足したら、以下のような最も信頼できる取引所でライブ取引またはペーパー取引用にボットを配備できます。 バイナンス, バイナンス US, FTX, ビットパンダ, コインベースプロおよび クラーケン.
トレーディングボットはどのように機能するのか?
トレーディングボットは、市場内の値動きなどの情報に基づいてトレーダーに代わって意思決定を行い、事前に定義された一連の基準に従って反応を生成します。価格、数量、注文、時間といった従来の市場シグナルと、機械学習モデルなどのより高度なシグナルを解釈・融合し、取引を実行する良い機会かどうかを判断します。
トレーディングボットのための金融データ
中央集権的な暗号通貨取引所(CEX)から得られる生の市場データには、主に2つのタイプがあります。1つは指値注文帳(LOB)からの引用データで、もう1つは取引データです。気配値は、マッチングされていない所定の価格レベルの指値注文の集合のスナップショットを集約したものです。
取引は、LOB に残っている他の注文と一致する注文が発注されるたびに発生します。生のマーケットデータは、ウェブソケットを介して取引所からストリーミングされます。取引所の LOB に何らかの更新が発生すると、その変更に関する情報がウェブソケットを介してリアルタイムでプッシュされます。
トラリティエンジンでは、ローソク足データは特定の期間における資産の価格を表現するために使用されます。ローソク足には、1)始値、2)最高値、3)最安値、4)終値、5)出来高の5つの主要な構成要素があります。
各ローソク足は、取引所からの価格バーを聞くのではなく、生のウェブソケットを経由して生の市場データから導出されます。取引所がこれらのバーを構築して公開するには時間がかかります。それを生成することで、バーが閉じてからボットが利用できるようになるまでの待ち時間を最小限にすることができます。より迅速に反応できるようになることで、ボットが取引したいときに達成できる執行価格が向上します。
マーケットデータの最も重要な部分の1つは、バックテストがライブ環境と一致していることです。これにより、ボットの動作がバックテスト環境でもライブ環境でも同じであることが保証されます。
トラリティは、ボットが受け取るローソク足データが、ライブ、仮想、バックテストの各環境で同じであることを確認することで、これを実現しています。その結果、ボットが市場データを使って行うどのような決定も、すべての環境にわたって一貫したものとなります。
ローソク足データもまた、複数の時間枠に渡って一貫している必要があります。1時間のローソク足は、それを構成する4本の15mバーと整合性がとれていなければなりません。そして、各5mバーは、それを構成する5本の1mバーと整合しています。Tralityでは、最も忠実度の高いデータから長期のバーを導き出し、ローソク足の正確さだけでなく、すべての時間枠で一貫性を確保することで、これを実現しています。
Pythonトレーディングボットの作成
では、2022年のような激動の年に、簡単な暗号通貨取引ボットで資産を守るにはどうすればいいのでしょうか?今回は、よく使われるTA指標である指数移動平均(EMA)、正確には2本のEMAのクロスオーバーを利用した、初級者向けの戦略例を紹介します。
をご覧ください。
トラリピのドキュメント でEMAクロスオーバー戦略の詳細な説明をご覧ください。
簡単に言うと、EMAは移動平均(MA)の一種で、直近のデータポイントに大きな重みと重要性を持たせています。指数関数的に加重された移動平均は、単純移動平均(SMA)よりも最近の価格変動に 大きく反応します。クロスオーバーは、長短2本の移動平均をチャートに適用する手法です。
短めのMAが長めのMAを上抜けると、トレンドが上にシフトしていることを示すため、買いシグナルとなります。一方、短期MAが長期MAを下回ると、トレンドが下降していることを示すため、売りシグナルとなる。
そこで、2本のEMA(20本と50本のローソク足の振り返り期間)を使用した戦略を開発します。6時間足のローソク足で取引するため、中短期の値動きに敏感に反応します。このシナリオでは、ポジションを取る際に口座残高の80%を割り当てる。
このアルゴリズムをコーディングするために、トラリピのPythonコードエディタを使用します。主要な構成要素を一段階ずつ見ていきましょう。
ステップ0:ハンドラ関数の定義
まず始めに、私たちの スケジュール・デコレータ は、指定された時間間隔で実行され、シンボルデータを受け取ります。これらのアノテーションされた関数をハンドラと呼びますが、好きなように命名してください。ただ、2つの引数を取る必要があります。最初の関数を 状態 を、第2引数はデータを受け取ります。第2引数には常に シンボルデータ を指定した間隔で表示します。このボットでは、6時間のローソク足間隔で取引しており、取引シンボルはBTCUSDTを指定しています。もちろん複数のシンボルで取引することも可能です
def initialize(state):
pass
@schedule(interval="6h", symbol="BTCUSDT")
def handler(state, data):
ステップ1:データから指標を計算する
アルゴリズム作成の最初のステップでは、2つの指数移動平均(EMA)を定義します。1つはルックバック期間が短い20本のローソク足、もう1つは長い50本のローソク足です。
ema_short = data.ema(20).last
ema_long = data.ema(50).last
ステップ2:シンボルのポジションを取得する
第二のステップでは、任意のオープンな ポジション をシンボルで指定します。この関数を呼び出すことで、そのシンボルのオープンポジションが存在するかどうかを示すブール値を受け取ります。
position = query_open_position_by_symbol(data.symbol,include_dust=False)
has_position = position is not None
ステップ3:シンボルのポジションを取得する
3番目のステップでは、任意のオープンな ポジション をシンボルで指定します。この関数を呼び出すことで、そのシンボルのオープンポジションが存在するかどうかを示すブール値を受け取ります。
position = query_open_position_by_symbol(data.symbol,include_dust=False)
has_position = position is not None
ステップ3:売買シグナルを解決する
第3のステップでは、アルゴリズムの心臓部である取引戦略を定義します。私たちは 注文APIを使用して、注文を作成します。.具体的には、このアルゴリズムは、短い方のEMAが長い方のEMAを上回った場合、口座残高の80%でロングとなる成行注文を出します。
また、売りロジックも定義しており、アルゴリズムがオープンポジションを検出し、短い方のEMAが長い方のEMAを下回ったら、オープンポジションをクローズさせます。
if ema_short > ema_long and not has_position:
order_market_target(symbol=data.symbol, target_percent=0.8)
elif ema_short < ema_long and has_position:
close_position(data.symbol)
ピースを組み立てる
これらのステップをすべてまとめると、次のような小さなコード片ができ、その後、最初のバックテストを行うことができます。
def initialize(state):
pass
@schedule(interval="6h", symbol="BTCUSDT")
def handler(state, data):
'''
1) Compute indicators from data and add parameters into strategy
'''
ema_short = data.ema(20).last
ema_long = data.ema(50).last
'''
2) Fetch position for symbol
'''
position = query_open_position_by_symbol(data.symbol,include_dust=False)
has_position = position is not None
'''
4) Resolve buy or sell signals
'''
if ema_short > ema_long and not has_position:
order_market_target(symbol=data.symbol, target_percent=0.8)
elif ema_short < ema_long and has_position:
close_position(data.symbol)
Pythonボットをヒストリカルデータでバックテストする
今回作成した初心者向け暗号通貨取引ボットを評価するために、上記のコードをTralityバックテスターで実行し、以下の結果を得ました。
上図は、2022年6月28日から2022年7月28日までのPythonトレーディングボットの結果です。トラリピのバックテストは常に為替手数料を含んでおり、スリッページを考慮したモデル化が可能です。個々のポジションと統計から明らかなように、ボットは4つの取引を実行し、指定された期間のトータルリターンは-6.61%である一方、ベンチマークパフォーマンスは10.65%となっています。
次の最終ステップは、最適化の段階です。
ストラテジーパラメータの最適化
Pythonベースの収益性の高いボットを作成することは困難です。満足のいくアルゴリズムのアイデアがあっても、そのパラメータを最適化することは、フラストレーションと時間のかかることです。そのため、私たちの研究チームはオプティマイザーを構築しました。
Pythonコードボットを作成する際のバックテスターのための新機能であるオプティマイザは、パラメータの最適化プロセスを自動化することを可能にします。ボットコードを書く際に、最高のPnLを達成するために最適化したい関連パラメータとそれぞれの範囲を定義するだけで、オプティマイザーがその魔法をかけます。
トラリティのオプティマイザーのチュートリアル
ボットの最適化のためのプロセスを非常にシンプルにしました。の最適な周期を求めるとしましょう。 ema_short と 絵馬長 を利用することで、最高のリターンを得ることができます。
以下のコードからわかるように、私たちは新しい機能アノテーションを追加する必要があります。 パラメータ をイニシャライザーの上に追加します。一旦、それが終わると、それを使うために パラメータ アノテーションを追加する必要があります。 パラメタ オブジェクトを関数とインジケータに追加します。
@parameter(name="ema_short", type="float", default=20, min=10, max=25, enabled=True)
@parameter(name="ema_long", type="float", default=50, min=30, max=60, enabled=True)
def initialize(state, params):
pass
@schedule(interval="6h", symbol="BTCUSDT")
def handler(state, data, params):
'''
1) Compute indicators from data
'''
ema_short = data.ema(params.ema_short).last
ema_long = data.ema(params.ema_long).last
'''
2) Fetch position for symbol
'''
position = query_open_position_by_symbol(data.symbol,include_dust=False)
has_position = position is not None
'''
4) Resolve buy or sell signals
'''
if ema_short > ema_long and not has_position:
order_market_target(symbol=data.symbol, target_percent=0.8)
elif ema_short < ema_long and has_position:
close_position(data.symbol)
これで最適化する準備ができました。 詳細設定でオプティマイザーを有効にするのをお忘れなく!
オプティマイザーを実行した結果、ema_shortの最適パラメータは10、ema_longの最適パラメータは30であることが判明しました。上の画像でバックテストの結果を見ることができます。最適なパラメータで、ボットはトータルリターンを-6.61%から3.21%に増加させることに成功しました。
Pythonトレーディングボットの留意点
これはかなり単純な取引ボットであり、分析の出発点として意図されていることに注意することが重要です。Tralityは、市場を大幅にアウトパフォームするためのボットを作成するための、より多くの可能性を提供します。そのためには、複数の間隔と複数のコインで取引したり、複数の注文タイプで洗練された注文管理を行うなど、よりニュアンスのあるコードの要素が必要になるかもしれません。そして最後になりますが、トラリピの最先端のオプティマイザーを活用し、ストラテジーパラメータを自動的に最適化し、最大の利益を得るための最適な設定を見つけましょう。
より詳細な機能については、以下のページをご覧ください。 ドキュメント.また、これから始めようと思っている方は、私たちの マスタークラス.
免責事項 この記事に記載されている内容は、投資アドバイスとみなされるべきものではありません。 上記の記事は単なる意見であり、投資方法、取引方法、どの資産に投資するかについて、いかなる種類の取引アドバイスや提案も行うものではありません。 または提案 オン トレーディングボットやトレーディングアルゴリズムがどのように使用され得るか、または使用されるべきかについてd!投資する前に必ず自分自身で調査し、必ず(!)失ってもいい金額だけを投資するようにしましょう バックテストは将来の結果を示唆するものではありません。.