
CTA 取引システムの第 1 世代は 1960 年代と 1970 年代に登場しました。当時の商品市場の強いトレンドにより、CTA 戦略は当時かなりの利益を達成しました。この期間の商品市場の好調な傾向は、第二次世界大戦後の継続的な経済成長と経済インフレの上昇に起因すると考えられます。トレンドが強い市場では、シンプルなトレンド追従システムでより高い収益を達成できます。第一世代の CTA システムでは、扱う基本的な市場や種類が少なく、取引システムは比較的単純で、通常は複数の取引対象を追跡する取引システムでした。この戦略は、当時の商品市場の動向によりうまく機能しました。
第一世代の取引システムで使用された戦略は、移動平均システム(短期移動平均が長期移動平均を上回る場合やその逆の場合など、いくつかの簡単なフィルタリング条件を加えたもの)などの、現在ではおなじみのトレンド追随戦略でした。シンプルなトレンドフォロー戦略は、取引ターゲットのファンダメンタルズにおけるトレンドの継続に効果的に対応できます。この持続性の背景には、継続的な経済成長、インフレ、石油危機がある。しかし、多くのトレーダーが同じ戦略を使用し、ファンダメンタルズの継続的な存在がなくなった場合、第一世代の取引戦略は新しい環境に適応するために進化する必要があります。
米ドルと金の分離の結果、金融先物市場は 1970 年から 1980 年にかけて急速に発展し、先物運用ファンドが金融市場、債券市場、株価指数先物、株式金融デリバティブなど、多くの先物市場に参加できるようになりました。さらに、情報技術の発達と低コストにより、日中にデータを入手することが容易になりました。 CTA ファンドに流入する資本の増加と競争の激化により、CTA 戦略はより複雑かつ適応性の高いものになりました。
上記の市場特性に基づいて、第 2 世代 CTA 取引システムと戦略は、第 1 世代 CTA 戦略と比較して次の特性を備えています。
取引の対象は多様化しています。金融先物市場の導入により、取引商品と市場がさらに多様化しました。
取引戦略に関して言えば、第 2 世代 CTA 取引システムの戦略は、純粋なトレンド追従と価格ブレイクスルーに限定されません。より多くの数学モデルを適用して、複数の市場を監視します。さまざまな市場状況に基づいてトレンドフォローを使用するか、平均的な対応戦略を使用するか。先物市場に参加する多くの機関の流動性により、先物市場ではボラティリティが低い状態が持続しました。このような状況では、従来の第 1 世代の CTA システムでは収益性を確保し、市場の変化に適応することが困難になります。戦略が重要になります。
第 2 世代の CTA 戦略では、取引ウィンドウと保有時間を使用して短期取引を行うことができます。第 1 世代の CTA 戦略とは異なり、第 2 世代の戦略では、短期および高頻度取引の日中取引パターンを監視し始めています。この機能は、財務データの提供をよりタイムリーかつ頻繁にするコンピュータ技術の発展に由来しています。
第 3 世代の CTA 取引システムは、第 2 世代の取引システムのさらなる多様化、分散化、および適応性の向上を実現しています。第 3 世代の CTA では、より多くの取引システムを使用して、より多くの市場と品種を取引します。戦略面では、より収益性の高い市場モデルを使用します。これらすべては、複数の市場で複数のモデルを実行することの組み合わせに基づいています。
CTA戦略は広く使用され、時間の経過とともに成熟してきたため、広く使用され、定量的トレーダー(特に初心者)に理解されることが望まれている古典的な戦略モデルです。Inventor Quantitative Platformは、標準的なCTA戦略のクラスライブラリを開発しました。読者が Inventor Quantitative Platform に CTA 戦略を適用したい場合は、コードをコピーするか、このクラス ライブラリを直接参照するだけです。
拡張性も非常に便利で、コードコメントは非常に明確で理解しやすいです。詳細なカスタマイズや拡張を実行したい場合は、既存のフレームワークの下で直接実行できます。
ソースコードの一部(JavaScript バージョン):
function main() {
$.CTA(exchanges[0], 0.01, function(r, mp, pair){ // 第一个参数是要做的交易所对象,第二个参数0.01是交易所要求的最小下单数量,第三个匿名函数function(){...}是回调函数,交易逻辑就写在这个函数中,该回调函数第一个参数r接收最新的K线数据,第二个参数接收持仓数,第三个参数接收交易对名称
if (r.length < 20) { // 判断K线柱数量
return
}
var emaSlow = TA.EMA(r, 20)
var emaFast = TA.EMA(r, 5)
var cross = _Cross(emaFast, emaSlow); // 判断指标相交状态,_Cross参看:https://www.fmz.com/bbs-topic/1140
if (mp <= 0 && cross > 1) {
Log(pair, "买, 金叉周期", cross, "mp:", mp);
return 0.1 * (mp < 0 ? 2 : 1) // 返回的数值就是要开仓的数量,正数是 开多,负数是开空,0是全部平掉。
} else if (mp >= 0 && cross < -1) {
Log(pair, "卖, 死叉周期", cross, "mp:", mp);
return -0.1 * (mp > 0 ? 2 : 1)
}
})
}

詳細なソースコードとライブラリの完全なコンテンツについては、https://www.fmz.com/strategy/57267 をご覧ください。