本記事で説明するトレンドフォロー戦略は、コーヒー先物の取引において大きな成果を上げました。詳細を見ていきましょう。
今回の記事では、ニューヨークのインターコンチネンタル取引所(ICE)で取引されているコーヒー先物(@KC)について、システマチックなトレード戦略の開発を探ります。私たちの目標は、一般的な先物よりもあまり知られていない資産を取り入れることで、トレード・ポートフォリオを多様化させることです。
コーヒー先物は、砂糖、ココア、綿花、オレンジジュースの先物契約などを含む「ソフト商品」と呼ばれるカテゴリーに属しています。この市場には複数の魅力的な特性があり、その一つとしては、大きな日中の変動、株先物との相関が低いこと、そしてかなりの取引量があげられます。
この市場を分析するために、我々はトレンドフォロー手法を採用しました。これは、様々な商品市場で歴史的に良い成績を収めてきた手法です。我々の目標は、この手法がコーヒー先物の取引においても同様に効果的であるかどうかを判断することです。
コーヒー先物のトレンドフォロー戦略のロジックとコード
我々が開発しようとする戦略は、重要な高値と安値のブレイクアウトに基づいたトレンドフォロー手法に従います。
具体的には、システムは過去の一定回数のセッションで記録された最大の高値(Highの最大値、n_sessions)を超えた時にロングポジションを取ります。逆に、システムは一定回数のセッションで記録された最小の安値(Lowの最小値、n_sessions)を割ると、ショートポジションを取ります。
このシステムは、コーヒー先物の取引時間全体を通してアクティブであり、これは月曜日から金曜日までの午前4:15から午後1:30までの時間帯を指します。エントリー(新規ポジションの取得)とエグジット(ポジションの決済)は同じ取引日に行われ、つまり取引日の最後までにはすべてのポジションが決済されることになります(ただし、損切りが前もってトリガーされた場合を除く)。この初期の分析のために、我々は損切りを1,500ドルに設定しました。
我々は、取引実行用の15分足(data1)とエントリーレベル計算用のデイリータイムフレーム(data2)でシステムのパフォーマンスを評価しました。データの範囲は2010年初頭から2023年末までのものです。
このコンセプトをいくつかの簡潔なコードに落とし込むと、以下のようになります。
input:n_sessioni(5),mystop(1000),myprofit(0);
if EntriesToday(d)=0 then Buy next bar at Highest(High,n_sessioni)data2 stop;
if EntriesToday(d)=0 then Sellshort next bar at Lowest(Low,n_sessioni)data2 stop;
if mystop>0 then setstoploss(mystop);
if myprofit>0 then setprofittarget(myprofit);
setstopcontract;
setexitonclose;
この戦略を洗練させる最初のステップは、ブレイクアウトレベルの計算に使用するセッション数(”n_sessions“)を最適化することです。このため、1から10までの値を1刻みで検証し、パフォーマンスへの影響を評価しました。
図1-高値と安値の計算に最適なセッション数を特定するための”n_sessions”入力の最適化
最適化の結果、セッション数が増加すると、最大ドローダウンを除いた純利益やその他の総合的なパフォーマンス指標が悪化する傾向があることが分かりました。この分析に基づいて、我々はn_sessions = 2を選択し、過去2回のセッションの高値と安値に基づいてエントリーレベルを計算することを決定しました。これらのレベルのブレイクアウトがポジションエントリーをトリガーします。
最初のテストの結果を見ると、我々は利益を上げて着実に成長するエクイティカーブを観測しました。このことから、コーヒー先物はトレンドフォローのロジックによく反応すると言えます。さらなる改良が必要ではありますが、初期結果は約62ドルの平均取引と、約151,000ドルの純利益を上げたという結果が出ました。ロジックに関する追加のフィルタや最適化が行われていない初期段階のシステムとしては、それなりにいい結果と言えるでしょう。
図2-コーヒー先物のトレンドフォロー戦略の詳細なエクイティカーブ
図3-コーヒー先物のトレンドフォロー戦略のパフォーマンスの要約と総取引分析
トレンドフォローの取引システムを洗練させるための次のステップは、フルトレードセッションの時間枠を調整するかどうかを分析することです。
このため、最初にセッションごとのバイアスを分析するための独自のプログラムを使い、トレードが許可される時間枠を指定するための2つの新しい入力パラメータ「MyStartTrade」と「MyEndTrade」を導入しました。その後、これらの入力を最適化しました。
var:istartofsession(false);
istartofsession=_OHLCMulti5(0415,1330,ohlcvalues);
array:ohlcValues[23](0);
input: stoploss(1500), takeprofit(0);
input: MyStartTrade(415),MyEndTrade(1330);
input: n_sessioni(2);
//ingressi
if tw(MyStartTrade,MyEndTrade)
and EntriesToday(d)=0
then begin
Buy next bar at Highest(High,n_sessioni)data2 stop;
Sellshort next bar at lowest(Low,n_sessioni)data2 stop;
end;
if stoploss>0 then setstoploss(stoploss);
if takeprofit>0 then setprofittarget(takeprofit);
setstopcontract;
setexitonclose;
図4-「MyStartTrade」入力の最適化結果、最適なトレード開始時間を決定
図5-「MyEndTrade」入力の最適化結果、最適なトレード終了時間を決定
最適化の結果、トレードの時間枠を短縮するとシステム全体のパフォーマンスが向上することが分かりました。具体的には、取引開始時間を午前5:00、取引終了時間を午前12:00に調整すると、最大ドローダウンが25,000ドルから20,000ドル未満に減少するという結果になりました。
この改善が行われた理由としては、市場が開く直後の取引動向は予測不可能であり、はっきりした方向が見いだせないということが挙げられます。また、一度一定の時間が経過してから新しい取引をオープンすることにはあまり意味がないこともあります。なぜならば、このシステムは全てのポジションを一日中で決済するからです。
パフォーマンスを向上させるための取り組み:価格パターンフィルタの実装
我々のトレンドフォロー戦略をさらに洗練させるために、実際の取引で最も重要な指標の一つである、平均取引価格に焦点を当てます。この指標は、取引の実行には十分な高さである必要があります。これはコーヒー先物の場合特に重要であり、1ティックが18.75ドルという比較的高い値を持つためです。
可能な改善の一つは、前日のオープンからクローズまでの価格がその日のレンジ全体(高値から安値まで)のうちどれだけ動いたかを測定する「デイリーファクター」(DF)に基づいたフィルタを追加することです。
このパターンは市場の方向性を示すものではなく、ボラティリティに関する情報のみを提供します。つまり、前日からの価格の変動が全体のレンジに対して大きくないということを示すのです。逆に、前日からの価格の変動が大きいということは、明らかに強気または弱気のセッションを示しています。
デイリーファクター(「DF」)の値が計算されると、これをあらかじめ定義された閾値(「DF_level」)と比較し、取引を行うかどうかを判断します。DF」および「DF_level」の値の範囲は0から1までです。
このフィルタを組み込むには、0.1から1までの値を0.05刻みでテストし、最適な値を決定する必要があります。
//デイリーファクター
input:DF_level(1);
var: DF(0);
if (highs(1)-lows(1))0 then begin
DF=absvalue(opens(1)-closes(1))/(highs(1)-lows(1));
end;
図6-Daily Factorパターンに基づいたフィルタを1から10までの値をテストして最適化
最適化の結果、我々は0.8という値を選択しました。つまり、前回のセッションの中で出た値(オープン-クローズ)が、レンジ(ハイ-ローレンジ)の80%以下の場合のみ、新しいポジションをオープンするようなストラテジーに設定しました。このアプローチにより、私たちの平均取引が20ドル増加し、総取引が80ドルを上回り、最大ドローダウンが低下し、純利益が増加しました。
パフォーマンスをさらに向上させるための取り組み:曜日のバイアス
現在の段階で、取引にはかなり高いリスクが伴うことが分かりました。したがって、我々はこのアプロ