双移動平均交差戦略は,一般的な量化取引戦略である. この戦略は,2つの異なる周期の移動平均を買い売り信号として使用し,短期平均線が長期平均線を横切るときに購入し,短期平均線が長期平均線を横切るときに売却する. この戦略のコードは,単純な移動平均 ((SMA),指数移動平均 ((EMA),二次移動平均 ((DEMA),三次移動平均 ((TEMA),加权移動平均 ((WMA) と成交加权移動平均 ((VWMA) など,複数の一般的な移動平均線タイプをサポートし, 短期平均線と長期平均線の周期を柔軟に設定できます.
この戦略の核心原理は,二つの異なる周期的な移動平均線の傾向特性と後退性を利用して価格の動向を捕捉することである.一般的に,短期平均線は価格の変化に敏感であり,長期平均線は比較的後退している.価格が上昇傾向にあるとき,短期平均線は長期平均線より先に上向きに動き,最終的に長期平均線を突破して”金叉”の買い信号を形成する.逆に,価格が下向きに動いているとき,短期平均線は長期平均線より先に下向きに動き,最終的に長期平均線を突破して”死叉”の売り信号を形成する.金叉と死叉の信号を捕捉することによって,この戦略は価格の主な動向に沿って取引することができる.
シンプルで使いやすい: 双移動平均の交差策は,新しいトレーダーが学習し,使用するのに適した,簡単に理解し,簡単に実行できる量化取引戦略です.
広く適用可能:この戦略は,株式,期貨,外貨,暗号通貨などの様々な金融市場と取引指標に適用できます.
パラメータの柔軟性:この戦略のコードは,一般的な移動平均の種類と価格の種類を多くサポートしています. ユーザーは,異なる市場環境と取引スタイルに対応するために,自分のニーズに応じてパラメータを柔軟に設定できます.
トレンド追跡: 2つの異なる周期平均線の交差信号により,この戦略は価格の主要なトレンドをよりよく捉え,順位のために逆転取引を避けるのに役立ちます.
遅滞性:移動平均は本質的にトレンドを追跡する指標であり,一定の遅滞性があり,最良の入場と出場のタイミングを逃す可能性があります.
震動市場での失敗: 震動市場または横盤整理の状況では,価格の変動が大きく,均線交差信号が頻繁で,戦略が頻繁に取引され,高額な取引コストと資金損失を引き起こす可能性があります.
パラメータ最適化の難しさ:平均線周期の選択は戦略効果に大きな影響を与えるが,最適なパラメータはしばしば市場の状況によって異なる.あらゆる場所の最適なパラメータの組み合わせを見つけるのは困難である.
トレンドフィルター導入:均線交差信号に基づいて,MACD,ADXなどの他のトレンド指標と組み合わせてトレンドフィルターを実行し,トレンドが明確である場合にのみ取引し,波動的な市場での頻繁な取引を避ける.
ストップ・ストップ・オプティマイゼーション: 戦略に合理的なストップ・ストップ・ロジック,例えば移動ストップ,波動率ストップなどを加え,単一取引のリスクを制御し,戦略のリスク・リターン比率を向上させる.
動的パラメータ最適化:異なる市場環境に対して,平均線周期などのパラメータを定期的に動的に最適化することで,戦略が市場変化に自律的に適応し,安定性を高めることができる.
多因子組合せ:双移動平均の交差信号を,他の有効な量化因子 (動量,値,交差量など) と組み合わせ,より安定した有効な多因子戦略を形成する.
双移動平均線交差策略は,2つの異なる周期平均線の交差信号によって価格トレンドを捉えるためのシンプルな古典的なトレンド追跡策略であり,トレンド市場には適している.しかし,この策略には,後退性やパラメータ最適化の難しさなどの問題があり,トレンドフィルタリング,ダイナミックパラメータ最適化,多因子組み合わせなどの他の方法と組み合わせて最適化および改善する必要がある.
/*backtest
start: 2023-05-08 00:00:00
end: 2024-05-13 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © SustainableInvestment
//@version=5
strategy("Moving average strategy (이동평균선 전략)", overlay=true)
// === INPUTS ===
basisType = input.string(defval = "EMA", title = "MA Type: SMA, EMA, DEMA, TEMA, WMA, VWMA ",options=["SMA", "EMA", "DEMA", "TEMA", "WMA", "VWMA"])
shortLen = input.int(defval = 1, title = "Short MA Period", minval = 1)
longLen = input.int(defval = 20, title = "Long MA Period", minval = 1)
price = input.string(defval = "Typical", title = "Price Type : Close, High, Open, Low, Typical, Center ",options=["Close", "High", "Open", "Low", "Typical", "Center"])
// === BASE FUNCTIONS ===
// 가격 종류 설정
priceType(price) =>
Typical = (high+low+close)/3
Center = (high+low) / 2
price=="High"?high : price=="Low"?low : price=="Open"?open : price=="Typical"?Typical : price=="Center"?Center : close
// 이동평균선 종류 설정
variant(type, src, len) =>
v1 = ta.sma(src, len) // Simple
v2 = ta.ema(src, len) // Exponential
v3 = 2 * v2 - ta.ema(v2, len) // Double Exponential
v4 = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len) // Triple Exponential
v5 = ta.wma(src, len) // Weighted
v6 = ta.vwma(src, len) // Volume Weighted
type=="EMA"?v2 : type=="DEMA"?v3 : type=="TEMA"?v4 : type=="WMA"?v5 : type=="VWMA"?v6 : v1
longCondition = ta.crossover(variant(basisType, priceType(price), shortLen), variant(basisType, priceType(price), longLen))
if (longCondition)
strategy.entry("Long Entry", strategy.long)
exitCondition = ta.crossunder(variant(basisType, priceType(price), shortLen), variant(basisType, priceType(price), longLen))
if (exitCondition)
strategy.close("Long Entry","Long Exit")