Tài nguyên đang được tải lên... tải...

Hệ thống giao dịch định lượng với nhiều yếu tố hồi quy và dải giá động

Tác giả:ChaoZhang, Ngày: 2025-01-17 15:57:53
Tags:RSIATRBETASMA

 Multi-Factor Regression and Dynamic Price Band Quantitative Trading System

Tổng quan

Chiến lược này là một hệ thống giao dịch định lượng dựa trên hồi quy đa yếu tố và dải giá động. Lý thuyết cốt lõi là dự đoán các biến động giá thông qua mô hình hồi quy đa yếu tố, kết hợp nhiều yếu tố thị trường như sự thống trị của BTC, khối lượng giao dịch và giá tụt lại để xây dựng dải giá để tạo ra tín hiệu. Chiến lược tích hợp nhiều mô-đun quản lý rủi ro bao gồm lọc ngoại lệ, quản lý vị trí năng động và dừng lại, làm cho nó trở thành một hệ thống giao dịch toàn diện và mạnh mẽ.

Nguyên tắc chiến lược

Chiến lược bao gồm các thành phần cốt lõi sau: Mô-đun dự đoán hồi quy: Sử dụng hồi quy tuyến tính đa yếu tố để dự đoán giá. Các yếu tố bao gồm sự thống trị của BTC, khối lượng, độ trễ giá và các điều khoản tương tác. Các hệ số beta đo lường tác động của mỗi yếu tố lên giá. 2. Phạm vi giá động: Xây dựng các dải giá trên và dưới dựa trên giá dự đoán và độ lệch chuẩn còn lại để xác định các điều kiện mua quá mức / bán quá mức. 3. Sản xuất tín hiệu: Tạo tín hiệu dài khi giá phá vỡ dưới dải dưới với RSI quá bán; tín hiệu ngắn khi giá phá vỡ trên dải trên với RSI quá mua. Quản lý rủi ro: Nhiều cơ chế bảo vệ bao gồm lọc điểm ngoài (phương pháp điểm Z), dừng lỗ / lấy lợi nhuận và dừng kéo dài dựa trên ATR. 5. Định vị động: Điều chỉnh kích thước vị trí theo động dựa trên ATR và tỷ lệ rủi ro đã đặt trước.

Ưu điểm chiến lược

  1. Tích hợp nhiều yếu tố: Cung cấp viễn cảnh thị trường toàn diện bằng cách xem xét nhiều yếu tố thị trường.
  2. Khả năng thích nghi mạnh mẽ: Các dải giá điều chỉnh năng động theo biến động thị trường, thích nghi với các điều kiện thị trường khác nhau.
  3. Kiểm soát rủi ro toàn diện: Quản lý rủi ro nhiều tầng đảm bảo an toàn vốn.
  4. Cấu hình linh hoạt: Nhiều thông số điều chỉnh để tối ưu hóa trên các thị trường khác nhau.
  5. Độ tin cậy tín hiệu cao: Nhiều cơ chế lọc cải thiện chất lượng tín hiệu.

Rủi ro chiến lược

  1. Mẫu rủi ro: Mô hình hồi quy dựa trên dữ liệu lịch sử, có thể thất bại trong những thay đổi thị trường mạnh mẽ.
  2. Độ nhạy của các tham số: Nhiều tham số đòi hỏi phải điều chỉnh cẩn thận, cài đặt không phù hợp ảnh hưởng đến hiệu suất chiến lược.
  3. Sự phức tạp tính toán: Các tính toán đa yếu tố có thể ảnh hưởng đến hiệu suất thời gian thực.
  4. Sự phụ thuộc vào môi trường thị trường: Có thể hoạt động tốt hơn trong các thị trường khác nhau so với các thị trường xu hướng.

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa lựa chọn yếu tố: giới thiệu các yếu tố thị trường bổ sung như chỉ số tâm lý và dữ liệu trên chuỗi.
  2. Điều chỉnh tham số động: Phát triển các cơ chế điều chỉnh tham số thích nghi.
  3. Cải thiện học máy: Kết hợp các phương pháp học máy để tối ưu hóa mô hình dự đoán.
  4. Cải thiện bộ lọc tín hiệu: Phát triển các điều kiện lọc tín hiệu bổ sung để cải thiện độ chính xác.
  5. Tích hợp chiến lược: Kết hợp với các chiến lược khác để cải thiện sự ổn định.

Tóm lại

Chiến lược này là một hệ thống giao dịch định lượng lý thuyết và được thiết kế tốt. Nó dự đoán giá thông qua mô hình hồi quy đa yếu tố, tạo ra tín hiệu giao dịch bằng cách sử dụng các dải giá năng động và có các cơ chế quản lý rủi ro toàn diện. Chiến lược thể hiện khả năng thích nghi và cấu hình mạnh mẽ, phù hợp với các môi trường thị trường khác nhau. Thông qua tối ưu hóa và cải tiến liên tục, chiến lược này cho thấy hứa hẹn để đạt được lợi nhuận ổn định trong giao dịch trực tiếp.


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

Có liên quan

Thêm nữa