
Strategi ini didasarkan pada konsep statistik Z-Score, yang digunakan untuk mengidentifikasi statistical deviasi harga terhadap rata-rata lokalnya. Strategi ini menghitung Z-Score untuk harga close out, dan kemudian menerapkan rata-rata bergerak jangka pendek dan jangka panjang untuk meluruskan skor Z-Score. Strategi ini menghasilkan sinyal masuk multihead ketika melewati skor Z-Score jangka panjang di atas skor Z-Score jangka pendek, dan menghasilkan sinyal leveling ketika melewati skor Z-Score jangka panjang di bawah skor Z-Score jangka pendek. Strategi ini juga menyertakan kontrol interval sinyal dan filter berdasarkan volume dinamis untuk mengurangi noise trading.
Inti dari strategi ini adalah perhitungan dan penerapan Z-scoring. Z-scoring adalah sebuah statistik yang digunakan untuk mengukur seberapa jauh sebuah titik data dari rata-rata sampel, dalam satuan standar deviasi. Dalam strategi ini, rumus untuk menghitung Z-scoring adalah: Z = (harga close-out - SMA ((harga close-out, N)) / STDEV ((harga close-out, N)) N adalah siklus dasar yang didefinisikan pengguna.
Proses implementasi kebijakan adalah sebagai berikut:
Kondisi tambahan meliputi:
Solusi:
Strategi perdagangan statistik harga yang dioptimalkan secara dinamis berdasarkan crossover skor Z yang halus adalah sistem perdagangan sederhana yang didasarkan pada prinsip-prinsip statistik yang berfokus pada menangkap deviasi dan regresi harga terhadap rata-rata lokalnya. Strategi ini secara efektif mengurangi perdagangan noise dan meningkatkan kualitas sinyal melalui pemrosesan yang halus, kontrol interval sinyal, dan penyaringan dinamis. Strategi ini sangat cocok untuk produk keuangan dengan pasar bergoyang dan perilaku regresi rata-rata yang jelas.
Namun, ada juga beberapa keterbatasan dari strategi, seperti ketergantungan pada asumsi statistik, sensitivitas parameter, dan pengambilan keputusan faktor tunggal. Dengan menambahkan identifikasi tren, penyesuaian volatilitas, analisis multi-frame time frame, mekanisme stop loss, pengakuan volume transaksi, dan kombinasi faktor-faktor, langkah-langkah optimasi dapat secara signifikan meningkatkan kecurangan dan kinerja strategi.
Secara keseluruhan, ini adalah dasar teoritis yang kuat, yang memungkinkan kerangka strategi yang ringkas, mudah dipahami dan dapat diperluas, cocok sebagai komponen dasar sistem perdagangan atau alat pendidikan untuk membantu pedagang memahami aplikasi statistik dalam perdagangan.
/*backtest
start: 2024-06-03 00:00:00
end: 2025-06-02 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Price Statistical Strategy-Z Score V 1.01", overlay=true)
// === Enable / Disable Z-Score Strategy Block ===
enableZScore = input.bool(true, title="Enable Smoothed Z-Score Strategy", tooltip="When enabled, this block calculates a smoothed Z-Score of the closing price and generates entry/exit signals based on crossover behavior between short-term and long-term smoothed Z-Scores.\n\nRecommended for quick and classic detection of price deviation from mean.\nSensitive to outliers. Best suited for relatively normal-distributed market conditions.")
// === Z-Score Parameters ===
zBaseLength = input.int(3, minval=1, title="Z-Score Base Period")
shortSmooth = input.int(3, title="Short-Term Smoothing")
longSmooth = input.int(5, title="Long-Term Smoothing")
// === Z-Score Calculation Function ===
f_zscore(src, length) =>
mean = ta.sma(src, length)
std_dev = ta.stdev(src, length)
z = (src - mean) / std_dev
z
// === Z-Score Logic ===
zRaw = f_zscore(close, zBaseLength)
zShort = ta.sma(zRaw, shortSmooth)
zLong = ta.sma(zRaw, longSmooth)
// === Minimum gap between identical signals ===
gapBars = input.int(5, minval=1, title="Bars gap between identical signals", tooltip="Minimum number of bars required between two identical signals (entry or exit). Helps reduce signal noise.")
// === Candle-based momentum filters ===
bullish_3bars = close > close[1] and close[1] > close[2] and close[2] > close[3] and close[3] > close[4]
bearish_3bars = close < close[1] and close[1] < close[2] and close[2] < close[3] and close[3] < close[4]
// === Entry and Exit Logic with minimum signal gap and candle momentum filter ===
var int lastEntryBar = na
var int lastExitBar = na
if enableZScore
longCondition = (zShort > zLong)
exitCondition = (zShort < zLong)
if longCondition and (na(lastEntryBar) or bar_index - lastEntryBar > gapBars) and not bullish_3bars
strategy.entry("Z Score", strategy.long)
lastEntryBar := bar_index
if exitCondition and (na(lastExitBar) or bar_index - lastExitBar > gapBars) and not bearish_3bars
strategy.close("Z Score", comment="Z Score")
lastExitBar := bar_index
// === Real-time PnL Table for Last Open Position ===
var table positionTable = table.new(position.bottom_right, 2, 2, border_width=1)
// Header Labels
table.cell(positionTable, 0, 0, "Entry Price", text_color=color.white, bgcolor=color.gray)
table.cell(positionTable, 1, 0, "Unrealized PnL (%)", text_color=color.white, bgcolor=color.gray)
// Values (only when position is open)
isLong = strategy.position_size > 0
entryPrice = strategy.position_avg_price
unrealizedPnL = isLong ? (close - entryPrice) / entryPrice * 100 : na
// Define dynamic text color for PnL
pnlColor = unrealizedPnL > 0 ? color.green : unrealizedPnL < 0 ? color.red : color.gray
// Update Table Content
if isLong
table.cell(positionTable, 0, 1, str.tostring(entryPrice, "#.####"), text_color=color.gray, bgcolor=color.new(color.gray, 90))
table.cell(positionTable, 1, 1, str.tostring(unrealizedPnL, "#.##") + " %", text_color=pnlColor, bgcolor=color.new(pnlColor, 90))
else
table.cell(positionTable, 0, 1, "—", text_color=color.gray, bgcolor=color.new(color.gray, 90))
table.cell(positionTable, 1, 1, "—", text_color=color.gray, bgcolor=color.new(color.gray, 90))