アルゴリズムトレーディングのためのPython

  • URLをコピーしました!

アルゴリズムトレードのためのPython

Pythonを使用して独自の取引アルゴリズムを作成することをお考えですか?

トラリティのPythonボットコードエディターは、アルゴリズム取引ボットの構築、バックテスト、最適化、ライブトレードを希望するトレーダーのために設計されたブラウザベースの強力なツールです。 プライベートトレードで利用できる最高レベルの柔軟性と洗練された機能を提供します。実際、これは私たちTralityが行っていることの中核をなすものです。

なぜプログラミング言語としてPythonを使うのか?

まず、明白な質問から始めましょう。なぜPythonを使うのか?によると Tiobeのプログラミング言語人気度指数Pythonは、C、Java、C++、C#に続く、世界で最も一般的なプログラミング言語です。現在広く使われているプログラミング言語に興味があるなら、組み込みシステムを扱っている場合は明らかにC/C++を例外として、Pythonを一番の選択肢にすべきです。以下は、これほどまでに人気を博した理由の一部です。

Pythonは初心者に優しい

コンピュータ言語であれ、外国語であれ、新しい言語を学ぶのは大変なことですが、Pythonは違います。比較的学びやすく、使いやすいので、学習曲線が浅く、初心者にもユーザーにも優しいのです。また、構文が単純化されているため、自然言語に近く、記述や実行が他の言語に比べてはるかに高速に行えます。また、メンテナンスが容易なため、不要なドキュメントを読み込んで時間を浪費することがありません。

Pythonの協力的なコミュニティ

1980年代に グイド・ヴァン・ロッサム Pythonは1991年に登場し、30年以上の使用と実世界での応用に耐えてきたという利点があります。Pythonはその誕生以来、知識豊富で役に立つプログラマのコミュニティと、素晴らしいサポートとドキュメントを集め続けてきました。

Pythonと企業サポート

企業についてどのように考えているにせよ、彼らの支持は配当金を支払うことができます。Facebook、Amazon、GoogleはPythonに大きく依存しており、InstagramやSpotifyからWikipedia、さらにはRedditに至るまで、さまざまな企業が程度の差こそあれPythonを採用している。実際、Googleが最初にPythonを使い始めたのは2006年です。

Pythonと先端研究

企業の領域を超えて CERNNASA は、どちらもPythonを活用しています。Pythonがスペースシャトルのミッション設計を合理化するために使われていることを考えれば、その柔軟性は明らかでしょう。もし Python が、大きくて重い金属製の物体を 宇宙に送り出す(そして戻ってくる)ために、 迅速かつ効率的に、そして正確に使用できる のであれば、利益を生むアルゴリズム取引システ ムを作るという挑戦にもきっと応えられるでしょう。

なぜアルゴリズム取引にPythonを使うのか?

Pythonが特に便利な点の1つは、その関数型プログラミングのアプローチのおかげで、アルゴリズム取引の構造を簡単に書いたり評価したりできる点です。実際、最初の、あるいは次の暗号取引ボットのコーディングに興味を持つトレーダーにとって、比較的簡単でシンプルな使い方がPythonの主なセールスポイントの1つとなっています。 以下は、Pythonがアルゴリズム取引に最適な理由をいくつか挙げています。

Pythonは読みやすく、アクセスしやすい

アルゴリズム取引に初めて参加する人にとって、Pythonのコードは読みやすく、アクセスしやすいものです。他のコーディング言語とは異なり、単純に数が少ないので、Pythonを使った取引では、豊富なライブラリが利用できるため、必要なコード行数が少なくて済みます。 すでにあなたの目に留まっているアルゴリズム取引用のプラットフォームやツールは、Pythonを使用している可能性が高いです。アルゴリズム取引の文化は Python という言語で行われているため、コラボレーションやコードの取引、クラウドソーシングによる支援が容易に行えるようになっています。

Python、並列化、そしてパワー

並列化とPythonの圧倒的な計算力は、あなたのポートフォリオにスケーラビリティを与えます。他の言語に比べて、Pythonは新しいモジュールを固定化しやすく、拡張性が高いです。また、既存のモジュールがあるため、トレーダーが異なるプログラム間で機能を共有することも簡単です。

Pythonとデバッグ

Pythonは「インタプリタ」言語です。インタープリタは、コードを一度に実行し、すべての可能なエラーをリストアップするコンパイラとは異なり、コード文を「1つずつ」実行します。Pythonのデバッグは、コードとデータへのライブの変更を許可するため、包括的かつ徹底的であり、(複数のエラーではなく)単一のエラーが表示されてクリアすることができるので実行速度を向上させます。

Pythonは必要なコード行数が少ない

Pythonの広範で包括的なサポートライブラリは、使用頻度の高いほとんどのプログラミングタスクがすでにスクリプト化されていることを意味し、書かれるべきコードの長さが制限されます。さらに重要なことは、Pythonは箱から出してすぐに動くということです。多くのプログラマは、動的型付け、疑似コードに似た構文、そしてPythonインタプリタの組み合わせに起因していると考えています。 Pythonはフリーでオープンソース、学習しやすく、使いやすいだけでなく、アルゴリズム取引(および取引全般)に関連するほぼすべてのタスクに対応するライブラリの優れたセレクションを備えています。以下では、データ収集、データ操作、プロット、テクニカル分析、機械学習、バックテストなど、目的に応じて人気のあるライブラリを紹介します。

データ用Pythonライブラリ

堅牢なオープンソースのデータ分析・操作ツールで、素早く簡単に使えるものをお探しなら Pandas (特に時系列データや数値表の操作が得意です)。 Pythonはもともと数値計算のために作られたものではありません、そこで NumPyまたはNumerical Pythonが登場します。今日、Pythonを使って仕事をしている人は、事実上誰でも、C/C++やFortranのコード統合ツール、N次元配列オブジェクト、フーリエ変換など、NumPyの強力なツール群を利用している。 SciPy は、数学、工学、科学に加わる技術計算や科学計算を目的としたオープンソースのPythonライブラリです。線形代数、積分、補間、特殊関数、FFT、信号・画像処理、ODEソルバーなどの機能を備えています。

データ可視化のためのPythonライブラリ

Python用の分析、統計、科学的グラフ作成ライブラリのオンラインツールが必要なら Plotly が答えです。ローソク足チャートを修正して、例えば出来高を含めることは、Plotlyで2つの方法のいずれかで行うことができます(あるいは、別のチャートを作成することもできます)。 で統計グラフが作れます。 シーボーン (ベースは matplotlib) は、トレーダーがグラフを通して視覚的にデータを探索し、より良く理解することを支援します。

機械学習のためのPythonライブラリ

機械学習のためのPythonライブラリといえば、アルゴトレーダーとして自由に使える以下のような良いものがたくさんあります。 scikit-learn, ライトGBM, PyTorchTensorFlow.また、社内の専門家の記事もぜひ読んでみてください。 機械学習戦略のよくある落とし穴を避けるために.

マルコフ連鎖モンテカルロ法(MCMC)のPythonライブラリ

ベイズ統計モデルの実装や、確率分布からサンプリングするマルコフ連鎖モンテカルロ(MCMC)などのアルゴリズムの適合を PyMc で、可能な限り数値計算のためにNumPyとペアにします。

テクニカル分析のためのPythonライブラリ

金融テクニカル分析のインジケーターライブラリをお探しですか?以下のサイトをご覧ください。 チューリッピこれはNumPyを必要とします(すべての入力と出力はNumPyの配列です)。そして、あなたがそれをやっている間、見てください。 パンダ・タ で、130以上のインジケータとユーティリティ関数、60以上のテクニカル分析ローソク足パターンから選択することができます。

トレーディング分析のためのPythonライブラリ

アルゴトレーダーは、ポートフォリオプロファイリングを行うために QuantStatsは、リスク指標と分析を通じて、ユーザーが自分のパフォーマンスをよりよく理解できるようにします。

アルゴリズムトレーディングのためのPythonの長所と短所

上記のセクションでは、アルゴリズム取引にPythonを使用する多くの利点のいくつかを見てきました。Pythonは学びやすく、使いやすく、読みやすく、強力で、柔軟性があり、箱から出してすぐに使えるので、収益性の高いアルゴリズム取引戦略を構築する上で重要な要素となっています。

アルゴリズム取引におけるPythonの利点

経済学、金融、データサイエンスの架け橋となることで、Pythonは FinTech企業にとって最も人気のあるプログラミング言語の1つです。金融業界で最も人気のある言語の上位3つに常にランクインしています。 実際 Pythonは最も多くの求人情報を提供しています は、銀行セクターの中で絶対数が最も多い。以下の通りです。 2020年に行われた調査では、Pythonの仕事は1,500件近くあり、14人のPythonプログラマーが1件ずつ追いかけていました。シティグループのような大手企業は現在、継続教育の一環として、銀行のアナリストやトレーダーにPythonのコーディングクラスを提供しています。この記事で述べた多くの理由から、Pythonはトレーダーだけでなく、アナリストや研究者にも提供できることがたくさんあるのです。 もしあなたが銀行での仕事に興味があるなら、Pythonは間違いなくあなたの興味を引くはずです。Bank of AmericaのQuartzプログラムでは、Pythonをコア言語として使用しています。で 元BoAの技術グルKirat Singhの言葉です。JPモルガンの誰もがPythonを知る必要があり、Bank of Americaでは約5,000人の開発者がPythonを使っています。Pythonは優れたスクリプト言語であり、フロントエンドとバックエンドの両方に簡単に統合できるのが、最初に選んだ理由の1つです "と述べています。 Pythonは分析ツールであるため、以下のような分野で広く使用されています。 クオンツトレード.Pandasなどのライブラリのおかげで、Pythonユーザーはより簡単なデータの可視化と高度な統計計算の恩恵を受けています。金融サービス事業者は、強力な機械学習アルゴリズムとその予測分析を、scikit-learnやPyBrainなど、先に述べた多くのライブラリを利用したPythonベースのソリューションで活用することもできます。

アルゴリズム取引におけるPythonのデメリット

Pythonの主な強みの1つは、弱点の1つでもあります。その使いやすさや機能、豊富なライブラリにより、Pythonユーザーは、学習や習得に時間のかかる他のプログラミング言語での作業に支障をきたすことがあります。 Pythonはデスクトップやサーバーアプリケーションでは優れていますが、少なくとも一部のユーザーによると、モバイルコンピューティングではあまり印象的ではありません。 また、変数の問題もあります。変数はオブジェクトとみなされるため、非効率なメモリ管理から生じるメモリリークやパフォーマンスのボトルネック(つまり、数百万の変数が格納されている)につながる可能性があります。

アルゴリズム取引のためのワークスペースのセットアップ

そうですね。これでPythonについて詳しく知っていただけたと思います。Python の利点と、アルゴリズム取引で利益を得るための方法について理解されたことでしょう。次に、ワークスペースをセットアップする必要がありますが、これには様々な難易度があります。最低限必要なのは、システム上でPythonと統合開発環境(IDE)を実行することです。 より良い方法は、Tralityの最新鋭の Pythonボットコードエディタ - は、アルゴリズム取引ボットの構築、バックテスト、最適化、ライブ取引を希望するトレーダーのために設計された、ブラウザベースの強力なPythonボットコードエディタです。

Tralityコードエディタ チュートリアル

トラリピのボットコードエディターは、バーチャルトレードのために完全無料で使用できます。実際の取引量が月5,000EURを超える場合は 料金プラン は、取引量無制限で9.99 EURから最高59.99 EURまでとなります。

トラリピのPythonボットコードエディタで取引戦略を構築する

では、実際にトラリピのコードエディタを使うにはどうしたらいいのでしょうか。以下では、価格上昇の恩恵を受けると同時にポートフォリオを保護する、シンプルなアルゴリズム取引戦略を紹介します。この戦略では、2つの時間間隔、QQE(Quantitative Qualitative Estimation)モメンタム指標を使用し、ポジションを取ったらすぐに利食いとトレーリングストップロスを設定します。(当戦略の各側面の詳細な説明については トラリピのドキュメント.) この戦略では、短期・長期ともにアップトレンドにあるときのみトレードを行いたいと考えています。短期トレンドの場合、1時間足のローソク足を使用し、指数移動平均(EMA)5がEMA20の上に乗っていればアップトレンドと定義します。長いトレンドでは、1日ローソク足を使用し、単純移動平均線(SMA)15がSMA80の上にある場合、アップトレンドと定義します。さらに、現在の価格がEMAの5を下回っている場合のみ、取引を開始します。 前述の通り、正しいタイミングでトレードに入るために、QQE指標を使用します。QQEは相対力指数(RSI)のスーパートレンドです。もし、このインジケータの仕組みがよくわからない、または追加の説明が必要な場合は、弊社の ドキュメントページ. 最後に、ポートフォリオを保護するために、利食いを5%、トレーリングストップロスを10%に設定します。このPython戦略は、高い勝率が前提となっています。言い換えれば、テイクプロフィットをヒットすることは高い確率のイベントであり、トレーリングストップロスをヒットすることは低い確率のイベントであるべきです。 ストラテジーの定義ができたので、いよいよ構築を開始します。それでは、主な構成要素を一つずつ見ていきましょう。

ステップ1:ハンドラ関数の定義

手始めに、私たちの スケジュール・デコレータ は、指定された時間間隔で実行され、シンボルデータを受信します。これらのアノテーションされた関数を ハンドラしかし、あなたはそれらに好きな名前を付けることができます。しかし、それらは2つの引数を取る必要があります。私たちは最初の引数を 状態 を、第2引数はデータを受け取ります。第2引数には常に シンボルデータ を指定した間隔で表示します。このボットでは、1日ローソク足と1時間ローソク足を使用するため、2つの間隔で取引します。そのため、2つのハンドラを使用し、取引ペアとしてBTCUSDTを指定します。もちろん、複数のシンボルで取引することも可能です。 このステップでは、長期トレンドの識別を担当する handler_long の定義にのみ焦点を当てます。
def initialize(state):
    pass
 
@schedule(interval="1d", symbol="BTCUSDT")
def handler_long(state, data):

ステップ2:handler_longで長期トレンドのシグナルを解決する

アルゴリズムの最初のステップでは、handler_long関数で上昇トレンドを識別する機能を構築します。単純移動平均(SMA)を定義し、1つは15ローソク足の短いルックバック期間で、もう1つは80ローソク足の長い期間で定義します。
   sma_short = data.sma(15).last
   sma_long = data.sma(80).last

   if sma_short > sma_long:
   	state.long_trend = "uptrend"
   else:
   	state.long_trend = "downtrend"
簡単でしたね。これでhandler_long関数が完成しました。このような感じです。
@schedule(interval="1d", symbol="BTCUSDT")
def handler_long(state, data):
   sma_short = data.sma(15).last
   sma_long = data.sma(80).last

   if sma_short > sma_long:
   	state.long_trend = "uptrend"
   else:
   	state.long_trend = "downtrend"

ステップ3:handler_shortの定義

続けて、ハンドラーショートを定義しましょう。handler_shortは1時間足のローソク足で実行されることを忘れないでください!
@schedule(interval="1h", symbol="BTCUSDT")
def handler_short(state, data):

ステップ4: ハンドラーショート用のインジケーターデータと資産価格を取得する。

さて、handler_short関数に取り掛かりますが、その前に、まず、インジケーターデータを取得する必要があります。とはいえ、先に進む前に簡単におさらいしておきましょう。
  • 5と20のEMAを使って、短いトレンドを見極めることにします。
  • QQEを使い、設定(20、5、4.2)で、正しいタイミングでエントリーするようにします。
  • 資産価格がEMAの5を下回る場合のみトレードを行うので、データから資産価格を取得する必要があります。
    ema_short = data.ema(5).last
    ema_long = data.ema(20).last

    qqe = data.qqe(20, 5, 4.2)  
    last_trend = qqe["trend"].last

    last_closing_price = data.close_last 

ステップ5:handler_shortの買いシグナルを計算する。

このステップでは、取引に入るためのルールを設定します。そのために、signal_checkというインナー関数を作り、トレードを開始するためのルールが満たされているかどうかをチェックするようにします。インナー関数がチェックするのは、長い方のトレンドが上昇トレンド、短い方のトレンドが上昇トレンド、QQEが買い、そして資産の価格がEMAの5より下にあることです。すべてのルールが満たされた場合、signal_check は "True" を返します(そうでない場合は "False" を返します)。
 def signal_check():
        if state.long_trend == "uptrend" and ema_short > ema_long and last_trend > 0 and last_closing_price < ema_short:
            return True 
        else:
            return False

ステップ6:ポートフォリオ情報の取得

次に、すべてのオープンな ポジション をシンボルで指定します。この関数を呼び出すことで、そのシンボルのオープンポジションが存在するかどうかを示すブール値を受け取ります。最後に、未決済の注文があるかどうかをチェックします。
position = query_open_position_by_symbol(data.symbol, include_dust=False)
    has_position = position is not None
    has_open_orders = len(query_open_orders()) > 0

ステップ7:買い注文を解決する

ここで、私たちのアルゴリズムの心臓部である取引戦略が定義されます。私たちは 注文APIを使用して、注文を作成します。.具体的には、アルゴリズムは、内部関数 signal_check が 300 USDT で買いのシグナルを出した場合、ロングになる成行注文を出します。さらに、このアルゴリズムでは 他の注文の範囲をキャンセルする 5%で利食い、10%で損切りをしたいので、フルポジションの場合。
if signal_check() == True and not has_position and not has_open_orders:
        state.buy_order = order_value(symbol=data.symbol, value=300)
        with OrderScope.one_cancels_others():
            state.take_profit = order_take_profit(symbol=data.symbol,amount=state.buy_order.quantity, stop_percent=0.05,subtract_fees=True)
            state.stop_loss = order_trailing_iftouched_amount(symbol=data.symbol, amount=-subtract_order_fees(state.buy_order.quantity ), trailing_percent= 0.1, stop_price=data.close[-1]*0.88)

ステップ8:ピースを組み立てる

これらのステップをすべてまとめると、次のような小さなコード断片ができあがります。
def initialize(state):
    pass
 
@schedule(interval="1d", symbol="BTCUSDT")
def handler_long(state, data):
   sma_short = data.sma(15).last
   sma_long = data.sma(80).last

   if sma_short > sma_long:
   	state.long_trend = "uptrend"
   else:
   	state.long_trend = "downtrend"


@schedule(interval="1h", symbol="BTCUSDT")
def handler_short(state, data):

    ema_short = data.ema(5).last
    ema_long = data.ema(20).last

    qqe = data.qqe(20, 5, 4.2)  
    last_trend = qqe["trend"].last

    last_closing_price = data.close_last 

    def signal_check():
        if state.long_trend == "uptrend" and ema_short > ema_long and last_trend > 0 and last_closing_price < ema_short:
            return True 
        else:
            return False

    position = query_open_position_by_symbol(data.symbol, include_dust=False)
    has_position = position is not None
    has_open_orders = len(query_open_orders()) > 0
    
    if signal_check() == True and not has_position and not has_open_orders:
        state.buy_order = order_value(symbol=data.symbol, value=300)
        with OrderScope.one_cancels_others():
            state.take_profit = order_take_profit(symbol=data.symbol,amount=state.buy_order.quantity, stop_percent=0.05,subtract_fees=True)
            state.stop_loss = order_trailing_iftouched_amount(symbol=data.symbol, amount=-subtract_order_fees(state.buy_order.quantity ), trailing_percent= 0.1, stop_price=data.close[-1]*0.88)

取引戦略のバックテストと評価

トラリティは、ユーザーが戦略をテストする際に使用する、パフォーマンス、リスク・リターン、ランの3つのカテゴリーからなる一連の指標を提供しています。私たちの トラリティ・ドックス は、取引戦略のバックテストを行う際に自由に使える様々なツールやデータについて知っておく必要があること全てを含んでいます! 取引戦略をバックテストして、最も重要な指標を見る時が来ました。シャープレシオ、トータルリターン、そして最大ドローダウンです。このシナリオで使用されるタイムフレームは 01.06.21-01.12.21 です。
バックテスト結果
オプティマイザーの結果
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次