序文
なぜこのコースを学ぶのですか?
このコースを勉強して何を得ましたか?まず、このコースは JavaScript と Python プログラミング言語に基づいています。言語は単なる技術であり、最終的にはこの技術を業界に適用する必要があります。定量取引は、現在急速な発展段階にあり、人材に対する需要が非常に高い新興産業です。
このコースの体系的な学習を通じて、定量取引の分野についてより深く理解することができます。定量取引の分野に参入しようとしている学生にとっても役立つでしょう。株式投資家であれば、または先物投資愛好家であれば、定量取引はあなたの主観的な取引を完全に支援することができます。取引戦略を開発することで、金融市場で利益を上げ、投資と財務管理のチャネルとプラットフォームを拡大することができます。
その前に、私の個人的な取引経験についてお話しさせてください。私は金融専攻ではなく、統計学専攻です。学生時代から主観的な株式取引に従事し、その後、縁あって国内プライベートエクイティファンドの定量取引実務者となり、主に戦略の研究開発に従事。
私は10年以上トレーディング業界に携わり、さまざまな種類の戦略を開発してきました。私の投資哲学は、何よりもリスク管理を優先し、絶対収益に重点を置くことです。私たちのコースのタイトルは、「定量取引から資産管理へ - 絶対収益のための CTA 戦略開発」です。
1. 先物CTA戦略で儲けるロジック
1.1 先物CTAの理解
CTA とは何なのかと疑問に思う人もいるかもしれません。CTA とは何でしょうか? CTA は海外では商品取引アドバイザーと呼ばれ、国内では通常投資マネージャーと呼ばれます。従来のCTAは、多数の投資家の資金をプールし、それを専門の投資機関に委託し、最終的にトレーディングアドバイザー(つまりCTA)を通じて株価指数先物、商品先物、国債先物に投資します。
しかし実際には、世界の先物市場が成長と発展を続けるにつれて、CTA の概念も絶えず拡大しており、その範囲は従来の先物をはるかに超えています。先物市場だけでなく、金利市場、株式市場、外国為替市場、オプション市場などにも投資できます。この商品に一定量の履歴データがあれば、対応するCTA戦略をこれらの歴史的データに基づいて開発されました。
1980年代以前は、電子取引技術がまだあまり成熟していませんでした。当時、ほとんどのトレーダーは、ウィリアムズ指標、KDJ、RSI、MACD、CCIなどのテクニカル指標を手動で描画して、商品先物の将来の動向を判断していました。その後、一部のトレーダーは、顧客の資産管理を支援するために特別な CTA ファンドを設立しました。本当の意味での CTA ファンドが登場し始めたのは、1980 年代に電子取引が普及してからのことでした。
上記のグラフを見ると、特に定量取引の増加により、世界のCTAファンドの規模は2005年の1,306億ドルから2015年には3,000億ドル以上に増加していることがわかります。さらに、CTA 戦略は、世界的なヘッジファンドの主流の投資戦略の 1 つにもなっています。
CTAファンドのパフォーマンスも規模とともに向上しています。下の図でBarlake CTA Indexを見てみましょう。Barlake CTA Indexは、世界的な商品取引アドバイザーの代表的な業界ベンチマークです。 1979年末から2016年末までのバーレイクCTAファンド指数の累積収益は28.95倍に達し、年率収益率は9.59%、シャープレシオは0.37、最大ドローダウンは15.66%でした。
なぜなら、資産配分ポートフォリオにおいて、CTA 戦略は通常、他の戦略との相関が非常に低いからです。下の図の赤丸で示すように、2000年から2002年にかけての世界的な株価下落相場と2008年の世界的サブプライム住宅ローン危機の際、バーレイクCTAファンド指数は下落しなかっただけでなく、プラスのリターンを達成しました。株式市場と債券市場では、CTA は強力な収益をもたらすことができます。さらに、1980 年以降のバークレイズ・コモディティ CTA 指数の利益水準は常に S&P 500 指数よりも高く、そのドローダウンも S&P 500 指数よりもはるかに低いことがわかります。
私の国におけるCTAの発展はここ10年ほどですが、勢いは非常に強いです。これは主に、国内商品先物の比較的オープンな取引環境、低い取引資本の閾値、ロングとショートの2つの取引を可能にする証拠金システムによるものです。双方向取引、低い取引手数料、取引所の技術的アーキテクチャが株式よりも進んでおり、システム内での取引が容易であるなどの利点があります。
2010 年以降、CTA ファンドは主にプライベート エクイティ ファンドの形で存在しています。国内政策によりファンド特別口座の投資範囲が徐々に開放されるにつれ、CTAファンドもファンド特別口座の形で存在し始めており、そのより透明でオープンな運用方法は、より多くの投資家にとって資産配分の必須ツールにもなっている。
上図に示すように、開始の難易度、資本の閾値、取引戦略の実行方法、API ドッキングのいずれの観点から見ても、CTA 戦略は他の取引戦略よりも個人トレーダーに適しています。国内先物契約は非常に小規模です。例えば、トウモロコシや大豆ミールの1ロットは数千元で取引でき、資本の閾値はほとんどありません。さらに、一部のCTA戦略は伝統的なテクニカル分析から来ているため、比較的簡単に実行できます。他の戦略と比較して使用します。
CTA戦略の設計プロセスも比較的簡単です。まず、履歴データを予備処理し、定量モデルに入力します。定量モデルには、数学的モデリング、プログラミング設計、その他のツールによって形成された取引戦略が含まれており、計算によって取引シグナルを生成します。これらのデータを分析します。もちろん、実際の開発では、上の図のように単純ではありません。これは、全体的な概念を全員に伝えるためのものです。
1.2 先物CTA戦略の種類
取引戦略の観点から見ると、CTA戦略も多様化しています。トレンド戦略や裁定取引戦略、大きなサイクルの中長期戦略、1日以内の短期戦略など、戦略ロジックはテクニカル分析またはファンダメンタル分析。表面分析。主観的な取引または体系的な取引になります。
CTA戦略にはさまざまな分類方法があり、取引方法によって、主観的取引と体系的取引に分けられます。海外でのCTA戦略の開発は比較的進んでおり、体系的取引のCTA戦略はほぼ100%に達しています。分析方法によって、ファンダメンタル分析とテクニカル分析に分けられます。収益源に応じて、トレンド取引とスイング取引に分けられます。
一般的に、取引市場全体では、トレンド戦略が CTA 戦略の約 70% を占め、平均回帰戦略が約 25% を占め、逆トレンドまたはトレンド反転戦略が約 5% を占めています。その中で、最も大きな割合を占めるトレンド戦略は、保有期間に応じて、高頻度取引、デイトレード、中短期取引、中長期取引に分けられます。
高頻度マーケットメイキング戦略
現在、市場には 2 つの主流の高頻度取引戦略があります。1 つは高頻度マーケット メイキング戦略、もう 1 つは高頻度アービトラージ戦略です。マーケット メイキング戦略は、取引市場に流動性を提供することです。つまり、マーケット メーカーがいる取引市場では、誰かが買いたい、または売りたい場合、マーケット メーカーはその注文が確実に実行できるようにする必要があります。市場の流動性が不十分で注文が執行できない場合、マーケットメーカーは他の人の取引相手と売買を行う必要があります。
高頻度裁定取引戦略
高頻度裁定取引とは、相関性の高い 2 つの株式または ETF と ETF の組み合わせの取引です。 ETF の計算方法に基づいて、同じ方法を使用して ETF の予想価格を計算できます。 ETFの予想価格からETFのインデックス価格を差し引いて価格差を求めることができます。通常、この価格差は価格チャネル内で動作します。価格差が上限チャネルと下限チャネルを突破した場合、この価格差をトレードして待つことができます。価格差を戻してそこから利益を得る。
日中戦略
文字通りの意味に従えば、ポジションを一晩保持しない限り、デイトレード戦略と呼ぶことができます。日中取引の保有期間は比較的短いため、通常、市場に参入した後、すぐに利益を上げることはできず、すぐに市場から撤退することになります。したがって、この取引方法では市場リスクが低くなります。ただし、市場は短期間で急速に変化するため、通常、日中取引戦略ではトレーダーに高い要件が課せられます。
中長期戦略
理論的には、保有期間が長くなるほど戦略能力は大きくなり、リスク・リターン比は低くなります。特に機関投資家の取引においては、短期戦略のキャパシティが限られており、短期間で大口資金が市場に出入りできないことから、中長期戦略がより多く配分されることになります。通常、保有期間は数日、数か月、あるいはそれ以上になります。
CTA戦略データ
一般的に、CTA戦略は、始値、最高値、最低値、終値、取引量など、分、時間、日次データを調査対象として使用します。ティックデータを使用するCTA戦略はごくわずかです。たとえば、 L2 データ内の買値、売値、買量、売量などの深度データ。
CTA 戦略の基本的な考え方について言えば、まず思い浮かぶのは従来のテクニカル指標です。この点に関しては公開されている参考資料が多く、ロジックも通常より単純で、そのほとんどは統計的原理に基づいています。たとえば、誰もがよく知っているさまざまなテクニカル指標:MA、SMA、EMA、MACD、KDJ、RSI、BOLL、W&R、DMI、ATR、SAR、BIAS、OBV などです。
市場には、マルチ移動平均の組み合わせ、DualThrust、R-Breaker、タートル取引法、グリッド取引法など、参考として使用したり改善したりできる古典的な取引モデルもいくつかあります。
上記はすべて、伝統的なテクニカル分析に基づいた取引戦略です。そのプロセスは、過去のデータと正しい取引コンセプトに基づいて、確率的な利点を持つ要因または売買条件を抽出し、市場が将来もこのパターンを維持すると想定することです。最後に、コードを使用して取引戦略を実装し、取引を完全に自動化します。ポジションを開く、利益を確定する、損失をストップする、ポジションを追加する、ポジションを減らすなど、これらには通常、人間の介入は必要ありません。実際、これは価格時系列の正の自己相関係数を利用して、高値で買って安値で売る戦略です。
CTA戦略の最大の利点は、現在の市場が上昇しているか下降しているかに関係なく、特に市場が強気市場と弱気市場の間で急速に変化しているときや、市場トレンドが明らかにスムーズなときに、絶対的な収益を得ることができることです。この戦略は非常に大きいです。つまり、トレンドがあり、利益があります。ただし、市場が不安定な状態にある場合やトレンドが明確でない場合、この戦略では高値で買い、安値で売り、損失を止めるために絶えず前後に動くことになる可能性があります。
1.3 先物CTA戦略の利益原則
先物 CTA 戦略が利益を生むことができる理由は、主に次の理由によるものです。
- 価格変動は反射的であり、常にトレンドの形で継続します。投資家は価格が上昇しているのを見ると、買い付けを行い、価格がさらに上昇します。価格が下落した場合も同様です。投資家の行動がより非合理的になるため、価格が上昇するときには異常なレベルまで上昇し、価格が下落するときには異常なレベルまで下落することがあります。
- 各投資家は損益率に対する許容度が非対称であり、リスク許容度も異なります。ほとんどの個人投資家は、より保守的なトレンド追従型の取引方法を選択することを好み、市場はトレンドに沿って動く可能性が高くなります。
- 価格形成は取引によって決定され、取引は人によって推進されます。しかし、人間の本質は変えるのが難しいため、固定パターンが繰り返し現れます。この戦略は、過去のデータでバックテストすると効果的です。これは、それが効果的である可能性があることを示しています。将来。
トレンドフォロー取引のもう一つの特徴は、市場がないときには少額の損失を出し、市場が来たときには大金を稼ぐことです。しかし、取引をしたことがある人なら誰でも、市場が最も不安定な状態にあることを知っています。の時代であり、ほんのわずかな期間でそれがトレンドになります。引用。そのため、トレンドフォロー戦略は取引時の勝率は低くなりますが、全体的な取引ごとの損益は比較的大きくなります。
トレンド追随戦略はリターンが不安定なため、多くの投資機関は複数の品種と複数の戦略を使用して投資ポートフォリオを構築し、その中には一定量の反転戦略も含まれます。反転戦略とは、価格時系列が負の自己相関係数を持ち、高値で売り、安値で買うことを意味します。
上記のチャートを見ると、理論的には、市場価格のさまざまな変化に同時に直面すると、異なるスタイルまたは相関の低い複数の戦略が、時には同じ、時には異なる取引シグナルを生成します。複数の利回り曲線が重なり合うと、全体的なリターンが互いに補完し合い、利回り曲線はより平坦になり、それによってリターンの変動性が低下します。
上記の観点から、マスターレベルの戦略を開発する代わりに、複数の平凡なサブ戦略を開発する方がよいと結論付けることができます。では、これらの戦略をどのように制御するのでしょうか?ここでは、機械学習におけるランダム フォレスト アルゴリズムを参照できます。ランダム フォレストは独立したアルゴリズムではなく、複数の決定木を含む意思決定フレームワークです。これは、意思決定ツリーのサブ戦略の上にある親戦略に相当します。親ポリシーを通じて子ポリシーのクラスターを整理および制御します。
次に、マスター戦略を設計する必要があります。商品先物市場全体におけるさまざまな商品の流動性、収益性、安定性を評価し、ボラティリティの低い商品先物ポートフォリオを選別し、業界中立を実施します。業界全体のボラティリティをさらに低減することができます。最終的に、実際の商品先物多品種ポートフォリオは、取引のための市場価値マッチングを通じて構築されます。
各商品は、複数のパラメータ戦略で構成することもできます。バックテストのパフォーマンスが良好なパラメータの組み合わせを選択できます。市場のトレンドが明らかな場合、複数のパラメータ戦略は通常、一貫したパフォーマンスを発揮し、ポジションを追加するのと同じです。市場が不安定な市場では、複数のパラメータ戦略を使用してパフォーマンスを向上させることができます。戦略は一貫性のない動作をすることが多いため、それぞれがリスクをヘッジするためにロングまたはショートを行います。これはポジションを減らすことと同じです。これにより、全体的な収益率はそのままに、ポートフォリオの最大収益率がさらに低下する可能性があります。
2. クラシックフューチャーCTA戦略事例
ニュートンはかつてこう言いました。「私が他の人よりも遠くを見ることができるのは、巨人の肩の上に立っているからだ。」
市場で公開されている CTA 戦略には、移動平均戦略、ボリンジャー バンド戦略、タートル トレーディング メソッド、モメンタム戦略、アービトラージ戦略などがあります。定量的取引戦略にはすべて、光の中で消滅するという特徴があります。戦略が公開されると、徐々に効果がなくなります。しかし、これは、私たちがこれらの戦略を学び、その本質を理解し、巨人の肩の上に立つという観点から問題を見ることに影響を与えるものではありません。
2.1 先物ファンダメンタルズ分析(在庫、基準、価格)
ファンダメンタル分析では、短期的な価格動向を気にする必要はありません。価値は最終的に価格に反映されると信じています。価格の背後にある要因を分析し、この品種がどれだけの価値があるかを判断することが重要です。一般的には、マクロ要因、多様性要因、その他の要因からのトップダウン分析手法が採用されます。
上の図を見ると、商品価格に影響を与える要因は数多くあり、その数は数十に上ります。さらに細かく分類すると、さらに数十の項目があり、これらのデータは常に変化しています。個人投資家がそのような膨大な量のデータを入手することは不可能であり、ましてや客観的な分析を行うことは不可能です。
実際、商品先物取引のファンダメンタル分析は、すべての要素を分析することを意味するわけではありません。複雑な情報からパターンを見つけるには、ファンダメンタル分析の中核となる要素を把握するだけで十分です。
マクロ要因
マクロ経済データは複雑かつ変化に富んでいます。毎日、毎瞬、各国の政治家、中央銀行、投資銀行から公式・非公式を問わず、多くの経済データが発表されています。政治や経済の危機を除けば、マクロ分析は会話の良い材料ではあるが、あまり実用的ではない。アメリカの有名な資産運用専門家ピーター・リンチはかつて、「私は経済動向の分析に年間15分以上は費やさない」という意見を述べました。
多様性要因
ファンダメンタル分析において、商品分析は主にプレミアムとディスカウント、需給関係、商品在庫、業界利益などを分析します。商品先物商品の要因分析をマスターすれば、基本的にほとんどの市場動向を判断できると言えます。
先物取引を行ったことがある友人は、国内商品先物は工業製品と農産物に簡単に分けられることを知っています。工業製品と農産物では分析方法が異なります。需要と供給の2つの側面から説明します。工業製品は供給が比較的安定しており、大きな技術革新がない限り、生産能力が短期的には上昇しますが、時間の経過とともに大きな変化があり、工業製品の価格に影響を与える要因は主に需要です。農産物の需要は比較的安定している。長期的には農産物の需要に変化があるが、短期的には農産物の需要は安定する傾向がある。そのため、農産物の価格に影響を与える要因は主に供給です。
したがって、経済の法則によれば、商品の価格を最終的に決定するのは需要と供給の関係です。理論的には、需要と供給のデータを入手できれば、商品の将来の価格を判断することができます。工業製品の場合、供給データは比較的入手しやすいが、需要データは入手しにくい。農産物の場合、需要データは比較的入手しやすいが、供給データは入手しにくい。
実際、さらに進んで減算を行うことができます。経済市場における需要と供給の相互の結果が在庫です。在庫データを使用して、市場の需要と供給の関係の強さを判断できます。ある商品の在庫が非常に多い場合、それは市場の供給力が需要よりも大きいことを意味し、外部条件が変わらなければ商品の価格は下落します。ある商品の在庫が非常に少ない場合、それは市場の需要の力が供給を上回っていることを意味し、外部条件が変わらなければ商品の価格はすぐに上昇するでしょう。
商品在庫の分析に加え、いわゆるベーシスであるスポット市場と先物市場の価格差の分析も必要です。先物価格がスポット価格よりも高い場合はプレミアムと呼び、先物価格がスポット価格よりも低い場合はディスカウントと呼びます。先物受渡システムによれば、先物受渡日に先物価格はスポット価格と等しくなるはずです。
プレミアムかディスカウントかに関わらず、先物受渡制度の制約により、理論上は受渡日の先物価格はスポット価格と等しくなるはずです。受渡日が近づくにつれて、スポット価格と先物価格は一致する傾向があり、一方は先物がスポットに戻り、もう一方はスポットが先物に戻ります。
上記の原則に基づいて、在庫と基準を使用して将来の先物価格を同時に決定できます。商品の在庫が少なく、先物価格がスポット価格よりも大幅に低い場合、スポット市場の需要が供給を上回っており、将来スポット価格が上昇する可能性が高いと結論付けることができます。受渡日が近づくにつれて、先物価格はスポット価格に合わせて上昇し、将来的に先物価格が上昇する可能性が高まります。
最後に、在庫と基準を通じて将来の価格の最も可能性の高い方向を決定しましたが、より正確な買いポイントと売りポイントはないため、明確なエントリーとエグジットのシグナルを出すにはテクニカル分析が必要です。ファンダメンタル分析の全体的な枠組みは、在庫が少ない + 大幅な値引き + テクニカル分析の強気シグナル = ロング、在庫が多い + 大幅なプレミアム + テクニカル分析の弱気シグナル = ショートです。
2.2 タートル取引ルール
取引戦略に関しては、代表的なタートル取引ルールについて話す必要があります。タートル トレーディング ルールは、商品投機家リチャード デニスが、優れたトレーダーは生まれつきのものか、後天的なものかを調べようとしたときに行われた、トレーディング史上最も有名な実験の 1 つから生まれました。この目的のために、彼は 1983 年に 13 名を採用し、先物取引の基本概念と、彼自身の取引方法と原則を教えました。これらの学生は「ウミガメ」と呼ばれています。
その後 4 年間で、タートルズは年間平均 80% の複利収益を達成しました。デニスはまた、シンプルなシステムとルールを使用すれば、取引経験がほとんどない人でも優れたトレーダーになれることを実証しました。ただし、一部のタートルは、利益を目的としてタートル取引ルールをウェブサイトで販売しています。この行為を止めるために、2 人の元タートルズ、カーティス・フェイスとアーサー・マドックは、タートル取引ルールを Web サイトで無料で一般に公開することを決定しました。
真実が明らかになった後、タートル取引ルールは最適化されたドンチャンチャネルを採用し、ポジション管理にATRインジケーターを使用していたことが分かりました。数十年にわたる歴史的テストを経て、一般の個人投資家が簡単に利益を上げるために使用できる取引方法となり、特定の商品に対しては今でも有効です。
タートルコア原則
- 優位に立つ: 長期的にはプラスの収益を生み出すため、プラスの期待値を持つ取引戦略を見つけます。
- リスクを管理する: リスクを管理し、自分の立場を守ります。そうしないと、結果を出す日が来ないかもしれません。
- 揺るぎないコミットメント: 戦略を揺るぎなく実行することによってのみ、真に体系的な結果を達成できます。
- シンプルさと明快さ: 長期的には、複雑なシステムよりもシンプルなシステムの方が実行可能です。
それでは次に、タートル取引ルールが実際に何を言っているのか見てみましょう。
- 市場 - 何を売買するか、つまりどの市場で取引するか。タートルズは先物取引業者であり、取引量が多く流動性の高い市場のみを選んだ。取引量の少ない市場を選ぶと損失のリスクが高まるからだ。お金。市場から退出する際の余分なスリッページにより、多くのトレンドの機会を逃すことになります。
- ポジション サイズ - どれだけ買うか、または売るかは、戦略全体の中で非常に重要な部分ですが、ほとんどの人は通常、それを無視したり、誤って扱います。タートル トレーディング ルールでは、ATR (平均真の範囲) インジケーターを使用して、ポジションの開始、シグナルの追加、およびストップロス シグナルを計算します。これは非常に巧妙な設計で、市場の絶対的なボラティリティに応じてポジションサイズを調整することを目的としています。市場のボラティリティが強い場合はポジションサイズが縮小され、市場のボラティリティが弱い場合はポジションサイズが拡大されます。 。まず単位を定義します。この単位の計算式は次のとおりです。(総資産*1%)/ATR。初期ポジションは1単位。当日の商品の下落がATR水準に達したとしても、当日の損失は総資産の1%以内に抑えられます。価格が 0.5 単位上昇すると、ロング ポジションは 1 単位増加し、最大 4 単位になります。
- 市場への参入 - タートルの市場への参入はドンチャンチャネルに沿って行われます。価格が過去20または55のKラインの最高価格を上回ると、市場に参入してロングを行います。価格が過去20または55のKラインの最高価格を下回ると、過去 20 または 55 の K ラインの最低価格で市場に参入し、ロングを行います。市場に参入してショートするだけです。シグナルが表示されたら、終値や次の K ラインを待たずに取引を開始します。
- ストップロス - 長期的には、ストップロスのない取引は成功しませんが、ほとんどのトレーダーは市場が好転することを期待して、損失ポジションを保持します。タートルズには、損失ポジションをいつ解消するかについての厳格なルールがありました。ロングポジションを保持し、価格が 2 単位下がった場合、ロングポジションはストップロスで決済されます。ショートポジションを保持し、価格が 2 単位上昇した場合、ショートポジションはストップロスで決済されます。
- 利益確定 - タートルの利益確定は、浮動利益の多くを失うことを意味しますが、これは多くのトレーダーにとって受け入れがたい部分でもあります。現在ロングポジションを保有しており、価格が10日間のドンチャンチャネルの下限を下回った場合は、すべてのロングポジションをクローズします。現在ショートポジションを保有しており、価格が10日間のドンチャンチャネルの上限を上回った場合は、ドンチャン チャネル、すべてのショート ポジションをクローズします。
このことから、タートル取引ルールはシンプルに見えますが、実際には実際の取引システムの原型を形成していることがわかります。完全な取引システムのすべての側面をカバーしており、トレーダーの余地はありません。主観的な想像力の余地があります。システムのプログラムされた動作の利点を引き出すことを可能にする意思決定。エントリーとエグジットのルール、資金管理、リスク管理などが含まれます。
タートル取引法の最大の利点は、効果的な取引方法を確立するのに役立つことです。これは、バッチオープン、動的なストッププロフィットとストップロス、市場トレンドフォロー、特にATR値とポジションの使用を組み合わせた戦略です。管理。この概念は学ぶ価値があります。もちろん、トレンドフォロー戦略に共通する問題として、未実現利益の獲得があります。上昇を追いかけて得た浮動利益は、その後の急落によって失われる可能性が非常に高いです。大きなトレンドでは非常に強力ですが、不安定な市場ではパフォーマンスが低下します。
3. 先物CTA戦略の実践的開発
3.1 マイ言語に基づくCTAトレンド戦略の展開
前世紀の終わりに、アメリカの金融投資分野で魔法のような取引方法が人気を博し始めました。何千人もの人々がそれを実践した後、人々はこの方法が効果的で大きな実用的価値があることに気づきました。同時に、多くの投資専門家によって認められました。プロのトレーダーによって認められており、外国為替、金、株式、先物、原油、インデックス、債券など、ほぼすべての金融投資分野に完全に適用できます。これはカオス操作法。
カオスという言葉は、もともと宇宙の混沌とした状態を表す言葉です。結果は必然であるが、既存の知識では計算できないという考えです。計算自体も結果を変えており、最大値や最小値は最終的に結果が現れるかもしれませんが、必然性はありません。結果。これは、参加者が市場を分析して取引を売買する際に市場を変化させる市場取引と非常によく似ています。市場は永遠に変化します。参加者が新しい市場形態について学習すると、市場も参加者によってそれが認識されていることを学習し、突然変異が起こります。そして、市場は参加者が知らない方向に変化していく傾向が確実にあります。市場は参加者がその変化するパターンを捉えるのを妨げるほどの知恵を持っています。言い換えれば、市場は安定しておらず、市場の過去を理解しても将来を予測することはできません。
カオス運用法は、ビル・ウィリアムズによって考案された投資アイデア、取引戦略、エントリーおよびエグジットシグナルの完全なセットです。現在、多くの国際投資家がカオス操作法を利用して市場取引に参加しています。中国の金融市場の発展が遅れていることと、カオス理論が比較的新しい考え方であることから、中国ではカオス操作法を研究する人はほとんどいません。カオスオペレーションメソッドは、株式、債券、先物、外国為替、デジタル通貨など、ほぼすべての金融投資分野に適用できる非常に普遍的な取引戦略であるため、このコースでは、カオス戦略の簡易版を出発点として使用します。全員の投資利益と収益を向上させます。
カオス操作法の理論的根拠は、その名の通り、気象学者エドワード・ローレンツが提唱したカオス理論であり、20世紀後半の最も偉大な科学的発見の一つです。彼は有名な「バタフライ効果」を提唱した人物です。ビル・ウィリアムズは、カオス理論を金融投資の分野に創造的に応用し、フラクタル幾何学、非線形力学、その他の分野と組み合わせて、非常に効果的な一連のテクニカル分析指標を作成しました。
カオス操作方法全体は、次の 5 つの次元 (テクニカル指標) で構成されています。
上の図を見てみましょう。アリゲーターラインは、フラクタル幾何学と非線形力学を使用したバランスラインのセットです。その本質は、移動平均の一種である拡張指数加重移動平均ですが、計算方法は少し複雑です。通常の移動平均よりも。次に、Mai 言語で Alligator ラインを定義する方法を見てみましょう。
// 参数
N1:=11;
N2:=21;
// 定义价格中线
N3:=N1+N2;
N4:=N2+N3;
HL:=(H+L)/2;
// 鳄鱼线
Y^^SMA(REF(HL,N3),N4,1);
R:=SMA(REF(HL,N2),N3,1);
G:=SMA(REF(HL,N1),N2,1);
まず、2つの外部パラメータN1とN2を定義し、外部パラメータに基づいて最高価格と最低価格の平均HLを計算します。次に、それぞれ異なるパラメータで平均HLを計算します。リップキスの場合、正中線の小周期。平均すると、歯は正中線の中周期の平均であり、顎は正中線の大周期の平均です。この戦略では、ジョーを使用します。
フラクタルの概念は、カオスオペレーションメソッドで非常に鮮明に定義されています。例え話をしてみましょう。手のひらを開いて指を上に向けてください。中指が上部のフラクタル、小指と薬指が左側、人差し指が右手の指と親指は損傷を受けていない部分を表します。新しい高値の K ライン。基本的なフラクタルはこの 5 つの K ラインで構成されます。次に、次のコードを使用してフラクタルを定義できます。
// 分形
TOP_N:=BARSLAST(REF(H,2)=HHV(H,5))+2;
BOTTOM_N:=BARSLAST(REF(L,2)=LLV(L,5))+2;
TOP:=REF(H,TOP_N);
BOTTOM:=REF(L,BOTTOM_N);
MAX_YRG^^MAX(MAX(Y,R),G);
MIN_YRG^^MIN(MIN(Y,R),G);
TOP_FRACTAL^^VALUEWHEN(H>=MAX_YRG,TOP);
BOTTOM_FRACTAL^^VALUEWHEN(L<=MIN_YRG,BOTTOM);
アリゲーター ラインとフラクタルを計算した後、アリゲーター ラインとフラクタル インジケーターを計算するためのベンチマーク価格として指数加重移動平均のセットを使用して、これら 2 つの条件に基づいて単純なカオス操作戦略を作成できます。もちろん、本来のカオス作戦戦略はもっと複雑です。コードは次のとおりです。
// 如果当前无多单,并且收盘价升破上分形,并且上分形在鳄鱼线上方时,多头开仓
BKVOL=0 AND C>=TOP_FRACTAL AND TOP_FRACTAL>MAX_YRG,BPK(1);
// 如果当前无空单,并且收盘价跌破下分形,并且下分形在鳄鱼线下方时,空头开仓
SKVOL=0 AND C<=BOTTOM_FRACTAL AND BOTTOM_FRACTAL<MIN_YRG,SPK(1);
// 如果收盘价跌破鳄鱼的下巴时,多头平仓
C<Y,SP(BKVOL);
// 如果收盘价升破鳄鱼的下巴时,空头平仓
C>Y,BP(SKVOL);
理解しやすいように、コードには詳細なコメントを含めました。この戦略の取引ロジックを簡単に列挙すると、次のようになります。
- ロングポジションを開く: 現在ロング注文がなく、終値が上部フラクタルを突破し、上部フラクタルがアリゲーターラインより上にある場合。
- ショートポジションを開きます: 現在ショート注文がなく、終値が下限フラクタルを下回り、下限フラクタルがアリゲーターラインを下回っている場合。
- ロングポジションを終了: 終値がアリゲーターの顎を下回った場合。
- ショートポジションを解消: 終値がアリゲータージョーを上回った場合。
次に、このシンプルなカオス操作戦略のバックテストの結果を見てみましょう。バックテストを実際の取引環境に近づけるため、取引手数料を取引所の2倍に設定し、ポジションのオープンとクローズに2ジャンプのスリッページを加えています。バックテストのデータタイプは鉄筋インデックス、取引タイプは鉄筋メイン連続、オープンポジションは1ロットに固定されています。以下は、1 時間レベルでの予備的なバックテスト パフォーマンス レポートです。
資本曲線とバックテストのパフォーマンス データから判断すると、この戦略はうまく機能し、全体的な資本曲線は着実に上昇しています。しかし、2016年末以降、鉄筋の市場特性は、以前の高ボラティリティの一方的な傾向から、幅広い変動へと変化しました。資本曲線から判断すると、2017年以降、利益は明らかに弱くなっています。
要するに、カオス操作法の本質は転換点を見つけることです。市場がどのように動くか、またはそれが真か偽の突破であるかどうかを心配する必要はありません。フラクタルを突破すれば、参入することができます。市場に直接。決して市場を予測しようとせず、観察者および追随者になりましょう。
3.2 JavaScript言語に基づくCTAアービトラージ戦略の開発
1987年に執筆された著書「金融の錬金術」の中で、ソロス氏はかつて重要な命題を提示した。「市場価格は将来に偏っているという意味で常に間違っていると私は信じている。」彼は、市場効率性仮説は単なる理論的な仮定に過ぎないと考えている。実際、市場参加者は常に合理的であるとは限らず、あらゆる時点で参加者がすべての情報を完全に入手し、客観的に解釈することは不可能である。さらに、同じ情報であっても、情報、フィードバックは人それぞれです。言い換えれば、価格自体に市場参加者の誤った期待がすでに含まれているため、市場価格は本質的に常に間違っているのです。これが裁定取引業者の利益源となるかもしれない。
上記の原則に基づくと、非効率的な先物市場では、異なる期間の受渡契約に対する市場の影響が必ずしも同期されておらず、その価格設定は完全に効果的ではないことがわかります。そして、異なる期間の同じ取引対象の受渡契約価格に基づき、2つの価格に大きな価格差がある場合、異なる期間の先物契約を同時に売買して、期間間裁定取引を行うことができます。
商品先物と同様に、デジタル通貨にも期間をまたいだ裁定契約の組み合わせが関連しています。たとえば、OkEX 取引所には、ETC Weekly、ETC Biweekly、ETC Quarterly があります。たとえば、ETC 週次と ETC 四半期間の価格差が長期間 5 前後で推移しているとします。ある日にスプレッドが 7 に達した場合、将来のある時点でスプレッドが 5 に戻ると予想されます。その後、スプレッドをショートするために、ETC を毎週売却し、四半期ごとに ETC を購入することができます。逆に。
この価格差は存在しますが、手動アービトラージでは、時間のかかる手動操作、精度の低さ、価格変動の影響などにより、多くの不確実性が伴うことがよくあります。定量的裁定取引の魅力は、定量モデルを通じて裁定機会を捉え、裁定取引戦略を策定するとともに、プログラムされたアルゴリズムを通じて取引所に自動的に取引注文を出すことで、迅速かつ正確に機会を捉え、効率的かつ安定的に利益を獲得することにあります。
このコースでは、デジタル通貨取引におけるOkEX取引所のInventor Quantitative Trading PlatformとETC先物契約の使用方法を学び、シンプルな裁定取引戦略を使用して、瞬時の裁定取引の機会を捉え、利益を得る機会を逃さずにつかむ方法を説明します。起こりうるリスクをヘッジする。
暗号通貨のクロスピリオド裁定戦略の作成
難易度: 普通
戦略環境
- 取引対象: イーサリアムクラシック (ETC)
- 価格差データ: ETC 週次 - ETC 四半期次 (共和分検定は省略)
- 取引サイクル: 5分
- 位置マッチング: 1:1
- 取引タイプ: 同じ商品の期間をまたぐ取引
戦略ロジック
- ロング スプレッドの開始条件: 現在の口座にポジションがなく、スプレッドが下限ボール トラックよりも小さい場合は、スプレッドでロングします。つまり、ETC を週単位で購入し、ETC を四半期単位で売却します。
- ショートスプレッドポジションを開く条件:現在の口座にポジションがなく、スプレッドがボルアッパートラックよりも大きい場合は、スプレッドをショートします。つまり、ETC を週単位で売り、ETC を四半期単位で買います。
- ロング スプレッドをクローズする条件: 現在の口座が ETC の週次ロング ポジションと ETC の四半期ショート ポジションを保有しており、スプレッドがボルの中間トラックよりも大きい場合、ロング スプレッドはクローズされます。つまり、ETC を週単位で売り、ETC を四半期単位で買います。
- ショート スプレッドをクローズする条件: 現在の口座が今週の ETC のショート ポジションと四半期の ETC のロング ポジションを保持しており、スプレッドがボルの中間トラックよりも小さい場合、ショート スプレッドはクローズされます。つまり、ETC を週単位で購入し、ETC を四半期単位で売却します。
上記は、デジタル通貨の期間間裁定戦略のロジックの簡単な説明です。では、プログラムでアイデアをどのように実装するのでしょうか?私たちはまず、Inventor Quantitative Trading Platform 上にフレームワークを構築しようとしました。
function Data() {} // 基础数据函数
Data.prototype.mp = function () {} // 持仓函数
Data.prototype.boll = function () {} // 指标函数
Data.prototype.trade = function () {} // 下单函数
Data.prototype.cancelOrders = function () {} // 撤单函数
Data.prototype.isEven = function () {} // 处理单只合约函数
Data.prototype.drawingChart = function () {} // 画图函数
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 计算boll技术指标
data.trade(); // 计算交易条件下单
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
//入口函数
function main() {
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
スーパーバイザー取引における取引プロセスがどのようなものかを想像してみてください。システムトレードには本質的な違いはなく、データの取得、データの計算、注文の発注、注文後の処理に過ぎません。プログラムでも同じです。まず、プログラムは20行目のメイン関数を実行します。これは慣例です。プログラムが取引戦略の前処理(ある場合)を完了すると、無限ループモードに入ります。ラウンドポーリングモード。ポーリングモードでは、onTick 関数が繰り返し実行されます。
次に、onTick関数では、主観的な取引における取引プロセスがあります。まず、基本価格データを取得し、次に口座残高を取得し、次に指標を計算し、次に取引条件の計算を開始して注文を出し、最後に注文後の処理を行います。注文のキャンセル、絵の描画、単一契約の処理など、注文に関するあらゆる操作を実行できます。
戦略的なアイデアと取引プロセスを比較することで、戦略フレームワークを簡単に構築できます。戦略全体は、次の 3 つのステップに簡略化できます。
- トランザクション前の処理。
- データを取得して計算します。
- 注文してフォローアップを処理します。
取引戦略フレームワークを構築した後、実際の取引プロセスと取引の詳細に基づいて、戦略フレームワークに必要な詳細コードを入力する必要があります。
1. 取引前処理
1. 必要なグローバル変数を宣言する
- チャートを構成するためにチャートオブジェクトを宣言する
var chart = {} - チャートを初期化するにはChart関数を呼び出します
var ObjChart = Chart ( chart ) - 価格差のシーケンスを格納するための空の配列を宣言します
var bars = [] - 履歴データのタイムスタンプを記録する変数を宣言する
var oldTime = 0
2.戦略の外部パラメータを設定する
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
3. データ処理機能を定義する
- 基本データ関数: データ ( )
コンストラクター Data を作成し、その内部プロパティを定義します。含まれるもの: アカウント データ、ポジション データ、K ライン データ タイムスタンプ、アービトラージ A/B 契約のビッド/アスク価格、およびフォワード/リバース アービトラージ スプレッド。
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
- 位置取得関数: mp()
ポジション配列全体を走査し、指定された契約と方向のポジションの数を返します。ない場合はfalseを返します。
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
- Kラインとインジケータ関数: boll ( )
フォワード/リバース アービトラージ スプレッド データに基づいて新しい K ライン シーケンスを合成します。ボールインジケーターによって計算された上部レール、中間レール、下部レールのデータを返します。
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
- 注文関数: trade()
注文契約名と注文タイプを渡し、対価価格で注文を出し、注文後に結果を返します。異なる方向の注文を2つ同時に出す必要があるため、注文契約名に応じて関数内で買値/売値が変換されます。
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
- 注文キャンセル機能: cancelOrders()
未処理の注文すべての配列を取得し、それらを 1 つずつキャンセルします。未履行の注文がある場合は false を返し、未履行の注文がない場合は true を返します。
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
- 単一契約の保持の処理: isEven()
裁定取引でシングルレッグの状況に対処する場合、すべてのポジションをクローズするだけで対処できます。もちろん、フォローアップ注文方式に変更することも可能です。
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
if (positionData[i].Type == 0) { // 如果是多单
type = 10; // 设置下单参数
} else if (positionData[i].Type == 1) { // 如果是空单
type = -10; // 设置下单参数
}
// 平掉所有仓位
this.trade(positionData[i].ContractType, type, positionData[i].Amount);
}
}
}
- 描画関数: drawingChart()
ObjChart.add() メソッドを呼び出して、チャートに必要な市場データとインジケーター データ (上部トラック、中間トラック、下部トラック、正/負のスプレッド) を描画します。
Data.prototype.drawingChart = function (boll) {
var nowTime = new Date().getTime();
ObjChart.add([0, [nowTime, boll.up]]);
ObjChart.add([1, [nowTime, boll.middle]]);
ObjChart.add([2, [nowTime, boll.down]]);
ObjChart.add([3, [nowTime, this.basb]]);
ObjChart.add([4, [nowTime, this.sabb]]);
ObjChart.update(chart);
}
4. エントリ関数 main() で、トランザクション前の前処理コードを実行します。このコードは、プログラムの起動後に 1 回だけ実行されます。含む:
- コンソールで重要度の低い情報をフィルタリングする
SetErrorFilter ( ) - 取引するデジタル通貨を設定する
exchange.IO ( ) - プログラムが開始する前に、以前に描画したチャートをクリアします
ObjChart.reset ( ) - プログラムを起動する前に以前のステータスバー情報をクリアします
LogProfitReset ( )
上記の取引前処理を定義した後、次のステップに進み、ポーリング モードに入り、onTick() 関数を繰り返し実行します。また、一部の暗号通貨取引 API には一定期間内のアクセス制限が組み込まれているため、Sleep() がポーリングするときにスリープ時間を設定します。
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
2. データを取得して計算する
- 取引ロジックで使用するための基本データ オブジェクト、口座残高、およびボール インジケーター データを取得します。
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
}
3. 注文してフォローアップする
- 上記の戦略ロジックに従って、売買操作を実行します。まず、価格とインジケーターの条件が満たされているかどうかを判断し、次にポジションの条件が満たされているかどうかを判断し、最後にトレード()注文関数を実行します。
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
- 注文後、未履行注文や単一契約保留などの異常事態に対処する必要があります。チャートを描きます。
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
上記では、わずか 200 行強でシンプルなデジタル通貨の期間間裁定戦略を作成しました。完全なコードは次のとおりです。
// 全局变量
// 声明一个配置图表的 chart 对象
var chart = {
__isStock: true,
tooltip: {
xDateFormat: '%Y-%m-%d %H:%M:%S, %A'
},
title: {
text: '交易盈亏曲线图(详细)'
},
rangeSelector: {
buttons: [{
type: 'hour',
count: 1,
text: '1h'
}, {
type: 'hour',
count: 2,
text: '3h'
}, {
type: 'hour',
count: 8,
text: '8h'
}, {
type: 'all',
text: 'All'
}],
selected: 0,
inputEnabled: false
},
xAxis: {
type: 'datetime'
},
yAxis: {
title: {
text: '价差'
},
opposite: false,
},
series: [{
name: "上轨",
id: "线1,up",
data: []
}, {
name: "中轨",
id: "线2,middle",
data: []
}, {
name: "下轨",
id: "线3,down",
data: []
}, {
name: "basb",
id: "线4,basb",
data: []
}, {
name: "sabb",
id: "线5,sabb",
data: []
}]
};
var ObjChart = Chart(chart); // 画图对象
var bars = []; // 存储价差序列
var oldTime = 0; // 记录历史数据时间戳
// 参数
var tradeTypeA = "this_week"; // 套利A合约
var tradeTypeB = "quarter"; // 套利B合约
var dataLength = 10; //指标周期长度
var timeCycle = 1; // K线周期
var name = "ETC"; // 币种
var unit = 1; // 下单量
// 基础数据
function Data(tradeTypeA, tradeTypeB) { // 传入套利A合约和套利B合约
this.accountData = _C(exchange.GetAccount); // 获取账户信息
this.positionData = _C(exchange.GetPosition); // 获取持仓信息
var recordsData = _C(exchange.GetRecords); //获取K线数据
exchange.SetContractType(tradeTypeA); // 订阅套利A合约
var depthDataA = _C(exchange.GetDepth); // 套利A合约深度数据
exchange.SetContractType(tradeTypeB); // 订阅套利B合约
var depthDataB = _C(exchange.GetDepth); // 套利B合约深度数据
this.time = recordsData[recordsData.length - 1].Time; // 获取最新数据时间
this.askA = depthDataA.Asks[0].Price; // 套利A合约卖一价
this.bidA = depthDataA.Bids[0].Price; // 套利A合约买一价
this.askB = depthDataB.Asks[0].Price; // 套利B合约卖一价
this.bidB = depthDataB.Bids[0].Price; // 套利B合约买一价
// 正套价差(合约A卖一价 - 合约B买一价)
this.basb = depthDataA.Asks[0].Price - depthDataB.Bids[0].Price;
// 反套价差(合约A买一价 - 合约B卖一价)
this.sabb = depthDataA.Bids[0].Price - depthDataB.Asks[0].Price;
}
// 获取持仓
Data.prototype.mp = function (tradeType, type) {
var positionData = this.positionData; // 获取持仓信息
for (var i = 0; i < positionData.length; i++) {
if (positionData[i].ContractType == tradeType) {
if (positionData[i].Type == type) {
if (positionData[i].Amount > 0) {
return positionData[i].Amount;
}
}
}
}
return false;
}
// 合成新K线数据和boll指标数据
Data.prototype.boll = function (num, timeCycle) {
var self = {}; // 临时对象
// 正套价差和反套价差中间值
self.Close = (this.basb + this.sabb) / 2;
if (this.timeA == this.timeB) {
self.Time = this.time;
} // 对比两个深度数据时间戳
if (this.time - oldTime > timeCycle * 60000) {
bars.push(self);
oldTime = this.time;
} // 根据指定时间周期,在K线数组里面传入价差数据对象
if (bars.length > num * 2) {
bars.shift(); // 控制K线数组长度
} else {
return;
}
var boll = TA.BOLL(bars, num, 2); // 调用talib库中的boll指标
return {
up: boll[0][boll[0].length - 1], // boll指标上轨
middle: boll[1][boll[1].length - 1], // boll指标中轨
down: boll[2][boll[2].length - 1] // boll指标下轨
} // 返回一个处理好的boll指标数据
}
// 下单
Data.prototype.trade = function (tradeType, type) {
exchange.SetContractType(tradeType); // 下单前先重新订阅合约
var askPrice, bidPrice;
if (tradeType == tradeTypeA) { // 如果是A合约下单
askPrice = this.askA; // 设置askPrice
bidPrice = this.bidA; // 设置bidPrice
} else if (tradeType == tradeTypeB) { // 如果是B合约下单
askPrice = this.askB; // 设置askPrice
bidPrice = this.bidB; // 设置bidPrice
}
switch (type) { // 匹配下单模式
case "buy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
case "sell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closebuy":
exchange.SetDirection(type); // 设置下单模式
return exchange.Sell(bidPrice, unit);
case "closesell":
exchange.SetDirection(type); // 设置下单模式
return exchange.Buy(askPrice, unit);
default:
return false;
}
}
// 取消订单
Data.prototype.cancelOrders = function () {
Sleep(500); // 撤单前先延时,因为有些交易所你懂的
var orders = _C(exchange.GetOrders); // 获取未成交订单数组
if (orders.length > 0) { // 如果有未成交的订单
for (var i = 0; i < orders.length; i++) { //遍历未成交订单数组
exchange.CancelOrder(orders[i].Id); //逐个取消未成交的订单
Sleep(500); //延时0.5秒
}
return false; // 如果取消了未成交的单子就返回false
}
return true; //如果没有未成交的订单就返回true
}
// 处理持有单个合约
Data.prototype.isEven = function () {
var positionData = this.positionData; // 获取持仓信息
var type = null; // 转换持仓方向
// 如果持仓数组长度余2不等于0或者持仓数组长度不等于2
if (positionData.length % 2 != 0 || positionData.length != 2) {
for (var i = 0; i < positionData.length; i++) { // 遍历持仓数组
if (positionData[i].Type == 0) { // 如果是多单
type = 10; // 设置下单参数
} else if (positionData[i].Type == 1) { // 如果是空单
type = -10; // 设置下单参数
}
// 平掉所有仓位
this.trade(positionData[i].ContractType, type, positionData[i].Amount);
}
}
}
// 画图
Data.prototype.drawingChart = function (boll) {
var nowTime = new Date().getTime();
ObjChart.add([0, [nowTime, boll.up]]);
ObjChart.add([1, [nowTime, boll.middle]]);
ObjChart.add([2, [nowTime, boll.down]]);
ObjChart.add([3, [nowTime, this.basb]]);
ObjChart.add([4, [nowTime, this.sabb]]);
ObjChart.update(chart);
}
// 交易条件
function onTick() {
var data = new Data(tradeTypeA, tradeTypeB); // 创建一个基础数据对象
var accountStocks = data.accountData.Stocks; // 账户余额
var boll = data.boll(dataLength, timeCycle); // 获取boll指标数据
if (!boll) return; // 如果没有boll数据就返回
// 价差说明
// basb = (合约A卖一价 - 合约B买一价)
// sabb = (合约A买一价 - 合约B卖一价)
if (data.sabb > boll.middle && data.sabb < boll.up) { // 如果sabb高于中轨
if (data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "closebuy"); // 合约A平多
}
if (data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "closesell"); // 合约B平空
}
} else if (data.basb < boll.middle && data.basb > boll.down) { // 如果basb低于中轨
if (data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "closesell"); // 合约A平空
}
if (data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "closebuy"); // 合约B平多
}
}
if (accountStocks * Math.max(data.askA, data.askB) > 1) { // 如果账户有余额
if (data.basb < boll.down) { // 如果basb价差低于下轨
if (!data.mp(tradeTypeA, 0)) { // 下单前检测合约A是否有多单
data.trade(tradeTypeA, "buy"); // 合约A开多
}
if (!data.mp(tradeTypeB, 1)) { // 下单前检测合约B是否有空单
data.trade(tradeTypeB, "sell"); // 合约B开空
}
} else if (data.sabb > boll.up) { // 如果sabb价差高于上轨
if (!data.mp(tradeTypeA, 1)) { // 下单前检测合约A是否有空单
data.trade(tradeTypeA, "sell"); // 合约A开空
}
if (!data.mp(tradeTypeB, 0)) { // 下单前检测合约B是否有多单
data.trade(tradeTypeB, "buy"); // 合约B开多
}
}
}
data.cancelOrders(); // 撤单
data.drawingChart(boll); // 画图
data.isEven(); // 处理持有单个合约
}
//入口函数
function main() {
// 过滤控制台中不是很重要的信息
SetErrorFilter("429|GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout|Futures_OP");
exchange.IO("currency", name + '_USDT'); //设置要交易的数字货币币种
ObjChart.reset(); //程序启动前清空之前绘制的图表
LogProfitReset(); //程序启动前清空之前的状态栏信息
while (true) { // 进入轮询模式
onTick(); // 执行onTick函数
Sleep(500); // 休眠0.5秒
}
}
裁定取引はモルガン・スタンレーの株式取引戦略から生まれました。その概念は、相関性の高い2つの商品の価格差の変動が「ポップコーンプロセス」に従う、つまり、価格差が過去の平均値から外れた位置から常に平均値に戻るというものです。 、そして平均値からのもう一つの偏差。
このことから、価格差に基づいて安く買って高く売ることで利益を得ることができます。そして、統計学の標準偏差の原理によれば、ボリンジャーバンドは標準偏差によって計算される中間レールと上部レールと下部レールで構成されています。 3つのメッシュを形成します。スプレッド裁定取引に非常に役立ちます。
テストの結果、手数料や影響コストを考慮せずに戦略に従うと、1回あたりの利益はそれほど高くないものの、全体的な利益は比較的安定していることがわかりました。なお、統計的裁定取引であるため、逆方向に価格差が拡大するリスクがあり、設計時にはストップロスの問題を考慮する必要があることに留意する必要がある。第二に、インパクトコストにも注意を払う必要があります。取引に関係する2つの契約の流動性が低下すると、リターンに大きな影響を与えるため、投資家は適宜回避する必要があります。
4. CTA戦略開発の高度な反復
4.1 先物CTA戦略の落とし穴を避ける
過去 2 つのクラスでは、トレンド戦略を Mai 言語で記述し、アービトラージ戦略を JavaScript で記述しましたが、戦略のバックテストで問題は見つかりませんでした。ただし、定量取引は、単にプログラムを書いて、バックテストが成功したら直接取引するだけではありません。
実際、バックテストは戦略の単なるシミュレーションであり、履歴データにおける戦略のパフォーマンスを評価するためにのみ使用され、トレーダーが一部の取引戦略を迅速に評価して放棄できるようにします。
多くの場合、バックテストでは優れているように見える戦略は、実際の取引ではバックテストの基準を満たさないことがよくあります。多くの理由があり、そのうちのいくつかはトレーダーの制御を超えていますが、失敗の一部は一般的なエラーまたは潜在的なエラーによるものです。 。
静的データと動的データ
定量分析を行う際には、まず静的データと動的データの概念を理解する必要があります。バックテストでは、静的な履歴データを使用します。各 K ラインの価格は完全であり、各取引シグナルは 100% 売却できます。しかし、実際の市場のデータは動的です。例えば、最高価格がオープン後1時間以内に最高価格よりも高ければ、買いです。ただし、現在のKラインが完成していない場合、最高価格は動的であり、取引シグナルが点滅することがあります。 。この状況は、この戦略が売買取引の条件を決定する際に将来の関数を使用していることを示しています。
未来の機能
未来関数とは何ですか?まず、百度百科事典の説明を見てみましょう。ある量が別の量、例えば量Aと量Bに依存し、Bの変化がAの変化を引き起こす場合、AはBの関数です。Bが後から量、A は以前の量に対して、B とともに変化し、A は B の将来の関数です。誰もが混乱するかもしれません。
簡単に言えば、明日の価格を使用して明日の価格を予測するなど、将来のデータを参照する機能です。テクニカル指標に未来関数が含まれている場合、そのシグナルは不確実です。多くの場合、その瞬間に取引シグナルが発行されますが、次の K ラインが現れると、シグナルは消えたり、位置が変わったりします。
終値は将来の関数です。最新の K ラインが完成するまで、終値は常に変化しています。終値を決定するには、K ラインが完成するまで待つ必要があります。終値自体は将来の関数であるため、終値に基づくすべてのテクニカル指標も将来の関数です。
したがって、テクニカル指標が確定した終値を基礎データとして、どれだけ時間が経過しても売買シグナルが変化しない場合、そのテクニカル指標は未来の機能を参照していないと言えます。ただし、使用する基本データはまだ確定していない終値であるため、このテクニカル指標は将来の機能を参照しており、実際の適用では売買シグナルが変化する可能性があります。
過去の価格
future 関数は将来の価格を使用しますが、過去の価格を使用する場合もあります。これは多くの初心者が見落としがちな問題です。将来この問題をよりわかりやすく説明するために、例を挙げてみましょう。現在の最高価格が始値から 1 時間以内の最高価格よりも高い場合は、始値で購入します。もちろん、この売買シグナルの条件には何の問題もありませんが、注文に使用された価格は過去の価格です。
バックテストでは、静的データに基づくバックテストエンジンは、買いシグナルがある限り、100%の確率で取引を完了できるため、戦略は正常です。しかし、実際の市場では、最高価格がオープン後1時間以内に最高価格。この時点で、過去のオープン価格を使用して注文することはできなくなります。
価格の空白
いわゆる価格真空とは、Kラインチャートに表示されている価格が、実際の市場で取引できない状態を指します。主に以下の状況に分けられます。
- 取引をしたことがある人なら誰でも、価格が上限に達すると買うのが難しくなり、価格が下限に達すると売るのが難しくなることを知っています。ただし、バックテストでの取引は可能です。
- 取引所のマッチングメカニズムは、価格優先と時間優先です。一部の商品では注文が大量に発生することがよくあります。リアルタイムで売買注文を出す場合、他の人の注文の後ろに待機し、他の人の注文が執行されるまで取引を完了できません。場合によっては、取引を完了する前に価格が変更されている可能性があります。ただし、バックテスト中に注文を出す戦略の場合、取引はタイムリーに完了しますが、これは実際の取引環境とは異なります。
- アービトラージ戦略を使用している場合、バックテストを行うたびに、これらの価格差を獲得したと想定されるため、バックテストの利益は非常に高くなります。実際には、多くのスプレッドは利用できないか、1つのレッグしか利用できません。一般的に言えば、あなたの方向に不利な方が先に取引されるので、もう一方のレッグをすぐに埋める必要があります。このとき、スリッページはすでに発生しています。1点や2点ではなく、裁定取引戦略自体がこれらのポイントの価格差から利益を得ています。この状況はバックテストではシミュレートできません。実際の利益はバックテストほど良くありません。
- ブラックスワンイベントは一般的ではありませんが、それでも定量取引に大きな影響を与えます。たとえば、スイスフランのブラックスワンイベントでは、チャートは高値の始まりと安値の終わりの両方を示しています。実際、極端な場合、当日の市況、中間の価格は真空状態、大量のストップロス注文が殺到し、流動性がゼロで、取引が非常に困難ですが、バックテストでストップロスを達成できます。

過剰適合
過剰適合は、定量取引の初心者が陥りがちな間違いです。過剰適合とは何でしょうか? 簡単な例を挙げてみましょう。学校で試験を受けるとき、たくさんの問題を解いてすべての問題を暗記するという戦略を取る人がいます。試験中に質問が少しでも変わると、彼は答えられなくなるでしょう。なぜなら、彼は各質問に対するアプローチを非常に複雑な方法で記憶していたが、一般的なルールを抽象化していなかったからです。

上の図に示すように、モデルが十分に複雑であれば、データに完全に適応できます。定量取引におけるオーバーフィッティングについても同様です。戦略が複雑で多くの外部パラメータがある場合、限られた履歴データのバックテストでは、戦略に完全に適合する1つまたは複数のパラメータが常に存在します。過去の市場状況に沿って。
しかし、将来の実際の取引では、価格変動が戦略の限界を超える可能性があります。実際、定量取引戦略開発の本質は、大量の一見ランダムなデータからローカルな非ランダムデータをマッチングするプロセスです。したがって、統計を使用する必要があります。この罠を回避するために知識をどのように活用できるでしょうか?
妥協案としては、サンプル内データとサンプル外データの両方を使用することです。データ全体を 2 つの部分に分割し、サンプル内データをトレーニング セットとして使用し、データのバックテストを担当します。サンプル外データは検証のためのテスト セットとして使用されます。履歴データが少ない場合は、クロステスト方式を使用することもできます。
サンプル外データのパフォーマンスが良くないことがわかったが、モデルを破棄するのは残念だと思う場合、またはモデルが良くないことを認めたくない場合は、サンプル外データでモデルの最適化を継続します。サンプル外データでも同様のパフォーマンスを発揮するまでサンプル外データでテストすると、最終的に損害を受けるのは実際のお金になります。
生存バイアス
生存バイアスは次の例で説明できます。
- 正しい場所に立てば、豚でも飛べる。
- オンラインで販売されているパラシュートのレビューはすべて肯定的です。パラシュートに問題を抱えている人がいないからです。
- チケットを購入できなかった人はバスに乗ることができなかったため、記者はバスに乗っている人々にインタビューして、チケットを購入したかどうかを確認した。
- メディアは宝くじに当たらない人を積極的に宣伝しないので、宝くじに当たる可能性を宣伝します。
上記の例から、人々が通常受け取る情報は実際には選別されており、大量のデータやサンプルが選択的に無視されていることがわかります。その結果、生存者バイアスに基づく結論はリアルタイムから逸脱しています。次に、定量取引では、バックテストの結果が運によるものかどうかも考慮する必要があります。多くの場合、バックテストの結果は、バックテスト全体の中で最高のパフォーマンスになる可能性があります。次の図に注意してください。

左の図は非常に優れた取引戦略です。資本曲線が良好で、大きなドローダウンがなく、安定した利益を得ることができます。しかし、右側の画像を見てください。これは、何百もの取引バックテストの中で最もパフォーマンスが優れているものです。一方、金融市場を見ると、長生きするスターよりもスターのほうが常に多く存在します。トレーダーの戦略が市場の状況と一致していれば、毎年の市場の状況によってスターが生まれる可能性がありますが、 3年以上連続で長寿を全うできるスターはなかなかいない。安定した収益を上げている誕生日の人。
コストへの影響
保留中の注文を出さない限り、取引時に価格のずれが発生する可能性があります。活発に取引されている商品の場合、ビッド価格とアスク価格の差は通常 1 ポイントです。あまり活発に取引されていない商品の場合、スプレッドは大きくなる可能性があります。積極的に取引を行うたびに、少なくとも 1 つ以上のスプレッドが必要になります。ただし、バックテストでは、取引の問題を考慮する必要はありません。シグナルがあれば、取引を完了できます。したがって、実際の取引環境をシミュレートするには、少なくとも 1 つのスリッページを追加する必要があります。
特に、比較的取引頻度の高い戦略の場合、戦略をバックテストする際にスリッページを考慮しないと、資本曲線は常に上向きに傾きます。適度なスリッページが加わると、すぐに損失に転じてしまいます。また、この現象はスプレッドの問題だけが原因ではなく、実際の取引環境では、ネットワークの遅延、ソフトウェアやハードウェアのシステム、サーバーの応答などの問題も考慮する必要があります。
政策能力
同じ戦略でも、効率的な市場と非効率的な市場では、まったく異なる、あるいはまったく逆の効果をもたらすことがあります。例えば、国内株式市場や商品先物、海外デジタル通貨などの非効率な市場では、取引量の基盤が小さいため、高頻度取引戦略自体のキャパシティはそれほど大きくありません。より多くの人が利用すれば、利益率がなく、元の高頻度戦略でさえ利益が出なくなります。利益が出る戦略が損失を出す戦略に変わります。しかし、効率的な外国為替市場では、さまざまな種類の高頻度戦略を採用する余地があります。
上記は、戦略の開発と使用中に発生する可能性のある問題と落とし穴です。経験豊富な取引システム開発者にとって、バックテストは必須です。戦略のアイデアが過去の取引で効果的であることが検証できるかどうかを判断できるからです。しかし、多くの場合、バックテストは将来の収益性を意味するものではありません。バックテストには落とし穴が多すぎるため、お金をかけて学ばなければ理解できません。そして、これらの教訓は実際のお金を使って学ばれます。このコースは、少なくとも多くの定量的な迂回や罠を回避するのに役立ちます。
4.2 最適なポジション管理の確立
『ある株取引人の回想録』には、興味深いエピソードがある。主人公のリバモアと同じ証券会社で働いていたオールドターキー(元々はパートリッジという名前だった)は、常に大きな売買を行っていた。利益を上げて、株価が下がった後に買い戻すのです。オールド・ターキーはいつも真剣にこう言います。「いや、ご存知のとおり、これは強気相場だ!」
リバモア氏でさえ、ついにはため息をついた。「トレンドを正確に予測することには何も素晴らしいことはない。市場では、強気相場では強気で、弱気相場では弱気な人がたくさんいるものだ。」しかし、彼らは常に市場との交渉が上手で、最低価格で買い、最高価格で売ろうとします。まさにオールドターキーのように、本当に大金を稼ぐ人は、市場を正しく見極め、自分のポジションをしっかりと維持する人です。これは学ぶのが最も難しいことでもあります。これには、ターゲットとタイミングの選択だけでなく、より重要な質問も含まれます。それは、どの程度のポジション(リスク)を保持(取る)べきかということです。
失敗したトレーダーはみな偏った考え方を持っています。トレードをするとき、貪欲な人は利益だけを見てリスクを見ません。一方、臆病な人はリスクだけを見て利益を見ません。貪欲で臆病な人は、市場は上昇中です。下落中の利益は忘れてください。しかし、成功するトレーダーはリスクと報酬の両方を考慮します。つまり、稼いだ 1 ドルごとに数ドルのリスクを負うのです。リターンとリスクを測る指標は、リターン・リスク比率です。
利益が大きくなればリスクも大きくなる、つまりリターンはリスクに比例するということは多くの人が知っています。一部の人々の意見では、リターンとリスクの関係は、横軸がリスクの割合を表し、縦軸が利益の割合を表すと、次のようになるはずです。

しかし、実際の取引では、リターンとリスクは 2 点間の直線のように単純ではなく、少なくとも常に直線的に動くわけではありません。実際のリスクは、期待収益の範囲内で被る可能性のある最大損失であり、これを最大ボラティリティと呼びます。取引結果からの最大浮動損失が必ずしも最終損失と等しくない場合もありますが、最大浮動損失は実際の損失です。
このことから、上図の利益リスク比率は実際の表現ではないことがわかります。実際の取引環境では、利益リスク比率は次の図のようになります。

上の図を見てみましょう。黄色の曲線は、さまざまなリスク下での純価値の変動を表しています。期待収益が拡大し続けるにつれて、リスクも徐々に拡大しています。破産率を 0.5 に設定すると、最大損失が 50% に達することになり、これは失敗した取引戦略となります。この戦略の最終的なリターンはプラスですが、実際には途中で破綻しています。
たとえあなたの戦略がプラスの期待戦略であったとしても、間違ったポジション管理により破綻することになります。したがって、この観点からは、いつ買うか売るかよりも、いくら買うか売るかの方が重要であり、科学的にポジションを管理する方法が金融取引における基本的な問題となっている。したがって、この問題を解決する前に、ギャンブルで科学的に賭ける方法を見てみましょう。

コイン投げを例に挙げてみましょう。コインの両面が同じ重さだと仮定すると、表が出れば利益は2元、裏が出れば損失は1元です。明らかに、これは勝率が50%で損失が2元の、期待値がプラスのゲームです。ここで疑問が湧きます。現在、あなたは 100 元を持っていますが、どのようにして繰り返し賭けて、できるだけ早く 100 元を 100 万元に到達させることができるでしょうか。
よく考えないと、各賭けの利益は50%なので、*2-50%*1、つまり50%です。最大の利益を素早く実現するためには、各ギャンブルにできるだけ多くの資金を投資する必要があります。賭け金は100%にする必要があります。
しかし、すべてのギャンブルゲームに資本の 100% を投資するのは明らかに不合理です。なぜなら、たとえ可能性が非常に低くても、一度でも負ければ資本は失われるからです。なぜなら、何度もギャンブルをすれば、お金を失うことは必ず起こるからです。
100% の賭けは無理なので、90% 以下の賭けはどうなのかと尋ねる人もいるかもしれません。実際、この問題を解決するには、このギャンブル ゲームをシミュレートする実験を行い、各賭けの結果を確認することができます。次の図に示すように:
図から、ポジションを90%、80%、70%、60%、50%と徐々に減らしていくと、同じ賭けの結果が全く違うことがわかります。注意深い友人はすでに気づいているかもしれません。ポジションが徐々に縮小するにつれて、最終資金は実際には徐々に増加しています。
毎回 10% など、少額ずつ賭けた方が良いのかと疑問に思う人もいるかもしれません。すべての賭け率を計算することはできませんよね? これは、有名なケリーの公式が解決するために設計された問題です。統計学では、ケリーの公式は、各ギャンブルにおける最適な賭け比率を計算することで、期待される繰り返し賭けがプラスの戦略の長期的な成長率を最大化できます。
それだけでなく、元金と賭け金を無限に分割できると仮定すると、ケリーの公式を使用すると、どんな賭けでも破産することは不可能になります。特に金融取引の実際の応用においては、攻撃と防御の両方を兼ね備えたポジション管理戦略となります。ケリーの公式がどのように計算されるかを見てみましょう。次の図をご覧ください。
- fは既存の元本の最適な賭け率である
- b はオッズであり、取引における損益比率とも呼ばれます。
- pは成功率である
- qは故障率である
次に、ケリーの公式を使用して、このクラスのギャンブルの例を計算します。初期資本が100元で、勝率が50%でオッズが2の場合、資本を最大にするためにはどのような賭け率を使用すればよいでしょうか。利益は出るか?最速は100万元に達する。ケリーの公式を使った計算プロセスは次の通り。
(0.5*(2+1) -1)/2=0.25
50%の勝率は0.5で、オッズ2プラス1を掛け、1を引いて、最後に2で割ります。結果は0.25で、これは各賭けで元本の25%が賭けに使われることを意味します。最速で100万元に到達できます。計算結果に基づいて手動でシミュレーションし、正しいかどうかを確認できます。
上の写真は手動シミュレーションの結果です。最後の行を見てください。同じ賭けで、100回以上プレイした後、25%のポジションが最初に100万元に達しました。ポジションの 90%、80%、70%、60% の結果はマイナスであり、これは、プラスの期待値を持つ取引戦略であっても、誤ったポジション管理により破綻することを完全に示しています。
また、ポジションの 50% は最終的に損失も利益も出ないこともわかります。これは、大数の法則の結果とも一致しています。この問題をさらに詳しく説明するために、手動シミュレーション中に 10% のポジションも追加しました。最終結果はプラスのリターンでしたが、その効果は 25% のポジションの場合よりも数桁悪かったです。
ケリーの公式の威力を見てきました。実際の適用で10%の元本ポジションを選択すると、100回以上の賭けで元本が30,000以上になります。利益は莫大ですが、 25%の元本ポジションでは、利益がまったく出ないのと同じです。これが知識の力です。
ケリーの公式を使って人生でお金を稼ぎたいなら、ケリーの公式の適用条件を満たす必要があります。このギャンブルは金融市場から来なければならないことは間違いありません。特に定量取引では、過去のデータをバックテストすることで、対応する勝率やオッズを大まかに計算することができます。
もちろん、ケリーの公式を金融取引に実際に適用するのはそれほど簡単ではありません。レバレッジ取引における資金コスト、実際の取引における資金とポジションの分離の不可能性など、対処すべき細かい点がまだたくさんあります。取引における勝率とポジションの差。オッズは動的に変化しているなど。しかし、どのような場合でも、ケリーの公式は、最適なポジション管理方法を確立する方法を示しています。


















