[TOC]

名前が示すように、適応型移動平均(KAMA)は移動平均のカテゴリに属しますが、従来の移動平均とは異なり、非常に「スマート」です。通常の移動平均には多くの欠点があることはわかっています。たとえば、短期移動平均は価格動向に近く、非常に敏感ですが、誤ったシグナルを生成しやすいです。長期移動平均は、判断が非常に正確です。トレンドはありますが、市場が反応するまでにはしばらく時間がかかることがよくあります。
KAMA の「インテリジェンス」は、現在の市場状況、つまりボラティリティに基づいて感度を自律的に調整する機能にあります。その現れは、不安定な市場では KAMA の変化が大幅に遅くなり、トレンドが発生するとすぐに反応することです。実際の取引においては、「日々の混乱」によって生じる取引コストを削減し、市場が急騰したときに間に合うように取引に参加できることが利点です。

このうち、n、n1、n2 はすべて期間パラメータです。デフォルトでは、n は 10 期間、n1 は 2 短期期間、n2 は 30 長期期間です。これは、KAMAの著者であるペリー・カウフマンが認めたパラメータのセットでもあります。nは方向とボラティリティの計算効率に使用されます。n1とn2は高速移動平均と低速移動平均の期間です。理論的には、 n1 パラメータが大きいほど、KAMA は滑らかになります。
KAMA の計算方法は、まず方向 (DIR) とボラティリティ (VIR) を計算し、次に 2 つの比率に基づいて効率を計算します。効率性 (ER) は価格変動の度合いを測る指標であり、方向 / 変動率で簡単に計算されます。計算結果は 0 から 1 の間です。ER 値が 0 に近い場合、市場が不安定な状態にあることを示します。ER 値が 1 に近い場合、市場がトレンド状態にあることを示します。
効率 (ER) が計算されると、高速移動平均と低速移動平均を組み合わせることで平滑定数 (CS) を導き出すことができます: 効率 * (高速 - 低速) + 低速。 CS はトレンドの動きの速度を表します。CS の計算式によれば、CS の変化は常に ER の変化に比例することがわかります。
次に、係数 (CQ) は平滑化パワーに基づいて計算され、低速サイクル パラメータが計算でより重要な役割を果たすようにすることが目標であり、これもより保守的なアプローチです。 KAMAの最終的な滑らかさは係数(CQ)によって決まります。KAMAの計算では、係数(CQ)は最後の2つの移動平均平滑化の期間パラメータを決定します。つまり、指数加重平均(動的移動平均(終値、係数)、2)。
KAMA の計算方法は非常に複雑ですが、その使い方は通常の移動平均と似ています。実際の応用では、市場の動向を判断するだけでなく、正確な売買ポイントにも使用できます。非常に「スマート」なので、多くの取引戦略に使用でき、デジタル通貨でも試してみる価値があります。
ステップ1: KAMAを計算する
知らせ!左上隅で、プログラミング言語を選択します。My语言。 talib ライブラリにはすでに既製の KAMA がありますが、外部パラメータ (n) は 1 つだけであり、n1 と n2 はデフォルトで 2 と 30 になっています。この記事の戦略は参考用です。実践的なスキルを持つ友人は、独自の戦略を作成することもできます。次に、My 言語を JavaScript 言語と直接混合することもできます。次のコードに注意してください。
%% // My语言内JavaScript的标准格式
scope.KAMA = function() {
var r = _C(exchange.GetRecords); // 获取K线数组
if (r.length > 140) { // 过滤K线长度
var kama = talib.KAMA(r, 140); // 调用talib库计算KAMA
return kama[kama.length - 2]; // 返回KAMA的具体数值
}
return;
}
%% // My语言内JavaScript的标准格式
ステップ2: 取引条件を計算して注文を出す
%%
scope.KAMA = function() {
var r = _C(exchange.GetRecords);
if (r.length > 140) {
var kama = talib.KAMA(r, 140);
return kama[kama.length - 2];
}
return;
}
%%
K^^KAMA; // 把KAMA打印到图表上
A:CLOSE; // 把收盘价打印到图表上
K > REF(K, 1) && CLOSE > K,BK; // 开多
K < REF(K, 1) && CLOSE < K,SK; // 开空
K < REF(K, 1) || CLOSE < K,SP; // 平多
K > REF(K, 1) || CLOSE > K,BP; // 平空
ステップ3: 戦略信号のフィルタリング方法を設定する
%%
scope.KAMA = function() {
var r = _C(exchange.GetRecords);
if (r.length > 140) {
var kama = talib.KAMA(r, 140);
return kama[kama.length - 2];
}
return;
}
%%
K^^KAMA;
A:CLOSE;
K > REF(K, 1) && CLOSE > K,BK;
K < REF(K, 1) && CLOSE < K,SK;
K < REF(K, 1) || CLOSE < K,SP;
K > REF(K, 1) || CLOSE > K,BP;
AUTOFILTER; // 启用一开一平信号过滤机制
実際の取引環境に近づけるために、バックテスト中にストレステストを実行するために、ポジションの開始と終了に 2 ジャンプのスリッページを使用します。テスト環境は次のとおりです。
テスト環境
収益の詳細
資金調達曲線

上記のバックテストの結果から判断すると、このシンプルなKAMA戦略は本当に期待に応えました。2018年のデジタル通貨の超弱気相場でも、資本曲線は大きなリトレースメントを示さず、市場は長期にわたる不安定な時期にありました。ポジションを開いたり閉じたりすると、不必要な損失が発生します。同時に、2019年の強気相場でも好調なパフォーマンスを見せました。
クリックすると、商品先物やデジタル通貨に適したMy言語に基づいた完全な戦略ソースコードをコピーできます。
実践できる優れた戦略は、何度も何度も改良され、磨かれてきたに違いありません。この記事で紹介した戦略には、フィルタリング条件の追加、積極的な利益確定、ストップロスなど、最適化とアップグレードの余地がまだたくさんあります。損失条件等KAMA は移動平均の一種として、通常の移動平均の長所と短所を継承し、同時に改善しています。予測不可能な市場では、「最適なパラメータ」を固定しても、将来の市場状況に適応することは困難です。したがって、トレンドを追って市場状況に応じて変更するこの方法の方が、より良い選択となる可能性があります。