Quantitatives Handelssystem basierend auf Multi-Faktor-Regression und dynamischer Preisbandstrategie

RSI ATR BETA SMA
Erstellungsdatum: 2025-01-17 15:57:53 zuletzt geändert: 2025-01-17 15:57:53
Kopie: 0 Klicks: 373
1
konzentrieren Sie sich auf
1617
Anhänger

Quantitatives Handelssystem basierend auf Multi-Faktor-Regression und dynamischer Preisbandstrategie

Überblick

Bei dieser Strategie handelt es sich um ein quantitatives Handelssystem, das auf einer Multifaktor-Regression und dynamischen Preisbändern basiert. Die Kernlogik besteht darin, Preistrends durch ein Multifaktor-Regressionsmodell vorherzusagen, indem mehrere Marktfaktoren wie BTC-Dominanz, Handelsvolumen und verzögerte Preise kombiniert werden, um obere und untere Preisbänder für die Signalgenerierung zu erstellen. Die Strategie integriert mehrere Risikomanagementmodule wie Ausreißerfilterung, dynamisches Positionsmanagement und gleitenden Stop-Loss. Es handelt sich um ein umfassendes und robustes Handelssystem.

Strategieprinzip

Die Strategie umfasst im Wesentlichen folgende Kernkomponenten:

  1. Regressionsvorhersagemodul: Verwenden Sie ein mehrfaktorielles lineares Regressionsmodell, um Preise vorherzusagen. Zu den Faktoren gehören BTC-Dominanz, Handelsvolumen, Preisverzögerungsbedingungen, Interaktionsbedingungen usw. Um die Auswirkung jedes Faktors auf den Preis zu messen, wird der Betakoeffizient jedes Faktors berechnet.
  2. Dynamische Preisbänder: Erstellen Sie obere und untere Preisbänder auf der Grundlage von prognostizierten Preisen und verbleibenden Standardabweichungen, um überkaufte und überverkaufte Preise zu ermitteln.
  3. Signalerzeugung: Ein Long-Signal wird erzeugt, wenn der Kurs das untere Band durchbricht und der RSI überverkauft ist; ein Short-Signal wird erzeugt, wenn der Kurs das obere Band durchbricht und der RSI überkauft ist.
  4. Risikomanagement: einschließlich Ausreißerfilterung (Z-Score-Methode), Stop-Loss und Take-Profit, ATR-Moving-Stop-Loss und weiteren vielfältigen Schutzmechanismen.
  5. Dynamische Position: Passen Sie die Größe der Eröffnungsposition dynamisch basierend auf ATR und voreingestelltem Risikoverhältnis an.

Strategische Vorteile

  1. Multi-Faktor-Integration: Berücksichtigen Sie umfassend mehrere Marktfaktoren, um eine umfassende Marktperspektive zu bieten.
  2. Starke Anpassungsfähigkeit: Die Preisspanne wird dynamisch entsprechend den Marktschwankungen angepasst, um sich an unterschiedliche Marktumgebungen anzupassen.
  3. Perfekte Risikokontrolle: Ein mehrstufiges Risikomanagement gewährleistet die Sicherheit der Gelder.
  4. Flexibel und konfigurierbar: Zahlreiche Parameter sind anpassbar und lassen sich entsprechend unterschiedlicher Markteigenschaften leicht optimieren.
  5. Hohe Signalzuverlässigkeit: Mehrere Filtermechanismen verbessern die Signalqualität.

Strategisches Risiko

  1. Modellrisiko: Regressionsmodelle basieren auf historischen Daten und können bei drastischen Marktveränderungen versagen.
  2. Parametersensitivität: Viele Parameter müssen sorgfältig abgestimmt werden, und falsche Parametereinstellungen beeinträchtigen die Strategieleistung.
  3. Rechenkomplexität: Multifaktorielle Berechnungen sind komplexer und können die Echtzeitleistung beeinträchtigen.
  4. Abhängigkeit vom Marktumfeld: In volatilen Märkten kann die Performance besser sein als in Trendmärkten.

Richtung der Strategieoptimierung

  1. Optimierung der Faktorauswahl: Es können weitere Marktfaktoren eingeführt werden, wie etwa Marktstimmungsindikatoren, On-Chain-Daten usw.
  2. Dynamische Parameteranpassung: Entwickeln Sie adaptive Parameteranpassungsmechanismen, um die Strategieanpassungsfähigkeit zu verbessern.
  3. Verbesserung des maschinellen Lernens: Einführung von Methoden des maschinellen Lernens zur Optimierung des Vorhersagemodells.
  4. Verbesserung der Signalfilterung: Entwickeln Sie weitere Signalfilterbedingungen, um die Genauigkeit zu verbessern.
  5. Integration kombinierter Strategien: Verwendung in Kombination mit anderen Strategien zur Verbesserung der Stabilität.

Zusammenfassen

Diese Strategie ist ein quantitatives Handelssystem mit solider Theorie und perfektem Design. Sagen Sie Preise durch Multifaktor-Regressionsmodelle voraus, generieren Sie Handelssignale auf der Grundlage dynamischer Preisbänder und profitieren Sie von einem umfassenden Mechanismus zum Risikomanagement. Die Strategie ist äußerst anpassungsfähig und konfigurierbar und eignet sich für verschiedene Marktumgebungen. Durch kontinuierliche Optimierung und Verbesserung sollen mit dieser Strategie stabile Erträge im realen Handel erzielt werden.

Strategiequellcode
/*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")