Sistem perdagangan kuantitatif berdasarkan regresi berbilang faktor dan strategi jalur harga dinamik

RSI ATR BETA SMA
Tarikh penciptaan: 2025-01-17 15:57:53 Akhirnya diubah suai: 2025-01-17 15:57:53
Salin: 0 Bilangan klik: 373
1
fokus pada
1617
Pengikut

Sistem perdagangan kuantitatif berdasarkan regresi berbilang faktor dan strategi jalur harga dinamik

Gambaran keseluruhan

Strategi ini ialah sistem perdagangan kuantitatif berdasarkan regresi berbilang faktor dan jalur harga dinamik. Logik teras adalah untuk meramalkan arah aliran harga melalui model regresi berbilang faktor, menggabungkan berbilang faktor pasaran seperti penguasaan BTC, volum dagangan dan harga ketinggalan untuk membina jalur harga atas dan bawah untuk penjanaan isyarat. Strategi ini menyepadukan berbilang modul pengurusan risiko seperti penapisan terpencil, pengurusan kedudukan dinamik, dan stop loss bergerak Ia adalah sistem perdagangan yang komprehensif dan teguh.

Prinsip Strategi

Strategi ini terutamanya merangkumi komponen teras berikut:

  1. Modul ramalan regresi: Gunakan model regresi linear berbilang faktor untuk meramalkan harga. Faktor termasuk penguasaan BTC, volum dagangan, syarat ketinggalan harga, istilah interaksi, dsb. Pekali beta bagi setiap faktor dikira untuk mengukur kesannya terhadap harga.
  2. Jalur harga dinamik: Bina jalur harga atas dan bawah berdasarkan harga ramalan dan sisihan piawai sisa untuk mengenal pasti harga terlebih beli dan terlebih jual.
  3. Penjanaan isyarat: Isyarat panjang dijana apabila harga menembusi jalur bawah dan RSI terlebih jual; isyarat pendek dihasilkan apabila harga menembusi jalur atas dan RSI terlebih beli.
  4. Pengurusan risiko: termasuk penapisan terpencil (kaedah skor Z), hentikan rugi dan ambil untung, henti rugi bergerak ATR dan mekanisme perlindungan berbilang yang lain.
  5. Kedudukan dinamik: Laraskan saiz kedudukan pembukaan secara dinamik berdasarkan nisbah risiko ATR dan pratetap.

Kelebihan Strategik

  1. Penyepaduan berbilang faktor: Pertimbangkan secara menyeluruh pelbagai faktor pasaran untuk menyediakan perspektif pasaran yang komprehensif.
  2. Kebolehsuaian yang kukuh: Jalur harga akan dilaraskan secara dinamik mengikut turun naik pasaran untuk menyesuaikan diri dengan persekitaran pasaran yang berbeza.
  3. Kawalan risiko yang sempurna: Pengurusan risiko pelbagai peringkat memastikan keselamatan dana.
  4. Fleksibel dan boleh dikonfigurasikan: Sebilangan besar parameter boleh laras, mudah dioptimumkan mengikut ciri pasaran yang berbeza.
  5. Kebolehpercayaan isyarat tinggi: Mekanisme penapisan berbilang meningkatkan kualiti isyarat.

Risiko Strategik

  1. Risiko model: Model regresi bergantung pada data sejarah dan mungkin gagal apabila pasaran berubah secara drastik.
  2. Kepekaan parameter: Banyak parameter perlu ditala dengan teliti dan tetapan parameter yang tidak betul akan menjejaskan prestasi strategi.
  3. Kerumitan pengiraan: Pengiraan berbilang faktor adalah lebih kompleks dan boleh menjejaskan prestasi masa nyata.
  4. Kebergantungan persekitaran pasaran: Mungkin mengatasi prestasi dalam pasaran yang tidak menentu berbanding dalam pasaran arah aliran.

Arah pengoptimuman strategi

  1. Pengoptimuman pemilihan faktor: Lebih banyak faktor pasaran boleh diperkenalkan, seperti penunjuk sentimen pasaran, data dalam rantaian, dsb.
  2. Pelarasan parameter dinamik: Membangunkan mekanisme pelarasan parameter penyesuaian untuk meningkatkan kebolehsuaian strategi.
  3. Peningkatan pembelajaran mesin: Memperkenalkan kaedah pembelajaran mesin untuk mengoptimumkan model ramalan.
  4. Peningkatan penapisan isyarat: Kembangkan lebih banyak keadaan penapisan isyarat untuk meningkatkan ketepatan.
  5. Penyepaduan strategi gabungan: Gunakan dalam kombinasi dengan strategi lain untuk meningkatkan kestabilan.

ringkaskan

Strategi ini adalah sistem perdagangan kuantitatif dengan teori yang kukuh dan reka bentuk yang sempurna. Ramalkan harga melalui model regresi berbilang faktor, jana isyarat dagangan berdasarkan jalur harga dinamik, dan dilengkapi dengan mekanisme pengurusan risiko yang komprehensif. Strategi ini sangat boleh disesuaikan dan boleh dikonfigurasikan serta sesuai untuk pelbagai persekitaran pasaran. Melalui pengoptimuman dan penambahbaikan berterusan, strategi ini dijangka mencapai pulangan yang stabil dalam dagangan sebenar.

Kod sumber strategi
/*backtest
start: 2024-12-17 00:00:00
end: 2025-01-16 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/

//@version=5
strategy(  title           = "CorrAlgoX", overlay         = true,pyramiding      = 1, initial_capital = 10000, default_qty_type= strategy.percent_of_equity, default_qty_value=200)

//====================================================================
//=========================== GİRİŞLER ================================
//====================================================================

// --- (1) REGRESYON VE OUTLIER AYARLARI
int   lengthReg         = input.int(300, "Regression Window",   minval=50)
bool  useOutlierFilter  = input.bool(false, "Z-skoru ile Outlier Filtrele")

// --- (2) FİYAT GECİKMELERİ
bool  usePriceLag2      = input.bool(false, "2 Bar Gecikmeli Fiyatı Kullan")

// --- (3) STOP-LOSS & TAKE-PROFIT
float stopLossPerc      = input.float(3.0,  "Stop Loss (%)",   step=0.1)
float takeProfitPerc    = input.float(5.0,  "Take Profit (%)", step=0.1)

// --- (4) REZİDÜEL STD BANTI
int   lengthForStd      = input.int(50, "StdDev Length (residual)", minval=2)
float stdevFactor       = input.float(2.0, "Stdev Factor", step=0.1)

// --- (5) RSI FİLTRESİ
bool  useRsiFilter      = input.bool(true, "RSI Filtresi Kullan")
int   rsiLen            = input.int(14, "RSI Length",   minval=1)
float rsiOB             = input.float(70, "RSI Overbought", step=1)
float rsiOS             = input.float(30, "RSI Oversold",   step=1)

// --- (6) TRAILING STOP
bool  useTrailingStop   = input.bool(false, "ATR Tabanlı Trailing Stop")
int   atrLen            = input.int(14, "ATR Length",   minval=1)
float trailMult         = input.float(1.0, "ATR multiplier", step=0.1)

// --- (7) DİNAMİK POZİSYON BÜYÜKLÜĞÜ (ATR tabanlı)
bool  useDynamicPos     = input.bool(false, "Dinamik Pozisyon Büyüklüğü Kullan")
float capitalRiskedPerc = input.float(1.0, "Sermaye Risk Yüzdesi", step=0.1, tooltip="Her işlemde risk alınacak sermaye yüzdesi")

// --- (8) ETKİLEŞİM VE LOG(HACİM) KULLANIMI
bool  useSynergyTerm    = input.bool(true, "BTC.D * Hacim Etkileşim Terimi")
bool  useLogVolume      = input.bool(true, "Hacmi Logaritmik Kullan")

//====================================================================
//======================= VERİLERİ AL & HAZIRLA =======================
//====================================================================

// Mevcut enstrüman fiyatı
float realClose = close

// BTC Dominance (aynı TF)
float btcDom    = request.security("SWAP", timeframe.period, close)

// Hacim
float vol       = volume

// Gecikmeli fiyatlar
float priceLag1 = close[1]
float priceLag2 = close[2]  // (isteğe bağlı)

//----------------- Outlier Filtrelemesi (Z-Skoru) ------------------//
float priceMean  = ta.sma(realClose, lengthReg)
float priceStdev = ta.stdev(realClose, lengthReg)

float zScore     = (priceStdev != 0) ? (realClose - priceMean) / priceStdev : 0
bool  isOutlier  = math.abs(zScore) > 3.0

float filteredClose = (useOutlierFilter and isOutlier) ? na : realClose

// Fiyatın stdev'i (filtrelenmiş)
float fCloseStdev = ta.stdev(filteredClose, lengthReg)

//====================================================================
//=============== ORTALAMA, STDEV, KORELASYON HESAPLARI ==============
//====================================================================

// BTC.D
float btcDomMean    = ta.sma(btcDom, lengthReg)
float btcDomStdev   = ta.stdev(btcDom, lengthReg)
float corrBtcDom    = ta.correlation(btcDom, filteredClose, lengthReg)

// Hacim
float volMean       = ta.sma(vol, lengthReg)
float volStdev      = ta.stdev(vol, lengthReg)
float corrVol       = ta.correlation(vol, filteredClose, lengthReg)

// Fiyat Lag1
float plag1Mean     = ta.sma(priceLag1, lengthReg)
float plag1Stdev    = ta.stdev(priceLag1, lengthReg)
float corrPLag1     = ta.correlation(priceLag1, filteredClose, lengthReg)

// Fiyat Lag2 (isteğe bağlı)
float plag2Mean     = ta.sma(priceLag2, lengthReg)
float plag2Stdev    = ta.stdev(priceLag2, lengthReg)
float corrPLag2     = ta.correlation(priceLag2, filteredClose, lengthReg)

// BTC.D * Hacim (synergyTerm)
float synergyTerm   = btcDom * vol
float synergyMean   = ta.sma(synergyTerm, lengthReg)
float synergyStdev  = ta.stdev(synergyTerm, lengthReg)
float corrSynergy   = ta.correlation(synergyTerm, filteredClose, lengthReg)

// Log(Hacim)
float logVolume     = math.log(vol + 1.0)
float logVolMean    = ta.sma(logVolume, lengthReg)
float logVolStdev   = ta.stdev(logVolume, lengthReg)
float corrLogVol    = ta.correlation(logVolume, filteredClose, lengthReg)

//====================================================================
//===================== FONKSIYON: BETA HESAPLAMA =====================
//====================================================================
// Pine Script'te fonksiyonlar şöyle tanımlanır (tip bildirmeyiz):
getBeta(corrVal, stdevX) =>
    (stdevX != 0 and not na(corrVal) and fCloseStdev != 0)? corrVal * (fCloseStdev / stdevX)  : 0.0

//====================================================================
//======================== BETA KATSAYILARI ===========================
//====================================================================

// BTC Dominance
float betaBtcDom  = getBeta(corrBtcDom,  btcDomStdev)
// Hacim
float betaVol     = getBeta(corrVol,     volStdev)
// Fiyat Lag1
float betaPLag1   = getBeta(corrPLag1,   plag1Stdev)
// Fiyat Lag2
float betaPLag2   = getBeta(corrPLag2,   plag2Stdev)
// synergy
float betaSynergy = getBeta(corrSynergy, synergyStdev)
// logVol
float betaLogVol  = getBeta(corrLogVol,  logVolStdev)

//====================================================================
//===================== TAHMİNİ FİYAT OLUŞTURMA ======================
//====================================================================

float alpha  = priceMean
bool canCalc = not na(filteredClose) and not na(priceMean)

float predictedPrice = na
if canCalc
    // Farklar
    float dBtcDom   = (btcDom - btcDomMean)
    float dVol      = (vol    - volMean)
    float dPLag1    = (priceLag1 - plag1Mean)
    float dPLag2    = (priceLag2 - plag2Mean)
    float dSynergy  = (synergyTerm - synergyMean)
    float dLogVol   = (logVolume   - logVolMean)

    float sumBeta   = 0.0
    sumBeta += betaBtcDom  * dBtcDom
    sumBeta += betaVol     * dVol
    sumBeta += betaPLag1   * dPLag1

    if usePriceLag2
        sumBeta += betaPLag2 * dPLag2

    if useSynergyTerm
        sumBeta += betaSynergy * dSynergy

    if useLogVolume
        sumBeta += betaLogVol * dLogVol

    predictedPrice := alpha + sumBeta

//====================================================================
//======================= REZİDÜEL & BANT ============================
//====================================================================

float residual   = filteredClose - predictedPrice
float residStdev = ta.stdev(residual, lengthForStd)

float upperBand  = predictedPrice + stdevFactor * residStdev
float lowerBand  = predictedPrice - stdevFactor * residStdev

//====================================================================
//========================= SİNYAL ÜRETİMİ ===========================
//====================================================================

bool longSignal  = (realClose < lowerBand)
bool shortSignal = (realClose > upperBand)

//------------------ RSI Filtresi (opsiyonel) -----------------------//
float rsiVal       = ta.rsi(realClose, rsiLen)
bool rsiOversold   = (rsiVal < rsiOS)
bool rsiOverbought = (rsiVal > rsiOB)

if useRsiFilter
    longSignal  := longSignal  and rsiOversold
    shortSignal := shortSignal and rsiOverbought

//====================================================================
//=============== DİNAMİK POZİSYON & GİRİŞ/ÇIKIŞ EMİRLERİ ============
//====================================================================

float myAtr      = ta.atr(atrLen)
float positionSize = na

if useDynamicPos
    float capitalRisked   = strategy.equity * (capitalRiskedPerc / 100.0)
    float riskPerUnit     = (stopLossPerc/100.0) * myAtr
    positionSize          := (riskPerUnit != 0.0) ? (capitalRisked / riskPerUnit) : na

// Long
if longSignal
    if useDynamicPos and not na(positionSize)
        strategy.entry("Long", strategy.long, qty=positionSize)
    else
        strategy.entry("Long", strategy.long)

// Short
if shortSignal
    if useDynamicPos and not na(positionSize)
        strategy.entry("Short", strategy.short, qty=positionSize)
    else
        strategy.entry("Short", strategy.short)

// Stop-Loss & Take-Profit
if strategy.position_size > 0
    strategy.exit( "Long Exit", "Long",stop  = strategy.position_avg_price * (1 - stopLossPerc/100),  limit = strategy.position_avg_price * (1 + takeProfitPerc/100))

if strategy.position_size < 0
    strategy.exit("Short Exit", "Short", stop  = strategy.position_avg_price * (1 + stopLossPerc/100),limit = strategy.position_avg_price * (1 - takeProfitPerc/100))

//------------------ TRAILING STOP (opsiyonel) ----------------------//
if useTrailingStop
    if strategy.position_size > 0
        strategy.exit(  "Long Exit TS", "Long",  trail_points = myAtr * trailMult,  trail_offset = myAtr * trailMult )
    if strategy.position_size < 0
        strategy.exit( "Short Exit TS", "Short", trail_points = myAtr * trailMult, trail_offset = myAtr * trailMult)

//====================================================================
//======================== GRAFİK ÇİZİMLER ===========================
//====================================================================
plot(realClose,      color=color.white,  linewidth=1, title="Fiyat")
plot(predictedPrice, color=color.yellow, linewidth=2, title="PredictedPrice")
plot(upperBand,      color=color.red,    linewidth=1, title="Üst Band")
plot(lowerBand,      color=color.lime,   linewidth=1, title="Alt Band")

plotshape( useOutlierFilter and isOutlier, style=shape.circle, color=color.red, size=size.tiny, location=location.abovebar, title="Outlier", text="Outlier")