Chiến lược lọc biến động thích ứng theo động lượng đa giai đoạn

momentum volatility SMA ATR stdev SPX
Ngày tạo: 2025-02-24 09:38:10 sửa đổi lần cuối: 2025-02-24 09:38:10
sao chép: 0 Số nhấp chuột: 345
2
tập trung vào
319
Người theo dõi

Chiến lược lọc biến động thích ứng theo động lượng đa giai đoạn Chiến lược lọc biến động thích ứng theo động lượng đa giai đoạn

Tổng quan

Chiến lược này là một hệ thống giao dịch cao cấp dựa trên các chỉ số động lực đa chu kỳ và lọc tỷ lệ biến động. Nó xây dựng một hệ thống xếp hạng động lực tổng hợp bằng cách tính toán động lực giá trong bốn chu kỳ thời gian là 3 tháng, 6 tháng, 9 tháng và 12 tháng.

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

Lập luận cốt lõi của chiến lược bao gồm các yếu tố then chốt sau:

  1. Tính năng tính toán: Sử dụng phương pháp ((giá hiện tại / giá lịch sử -1)) tính toán các chỉ số động lực cho 4 chu kỳ thời gian.
  2. Bộ lọc tỷ lệ biến động: tính toán chênh lệch tiêu chuẩn của lợi nhuận hàng ngày và xử lý theo năm, bằng cách so sánh nó với ngưỡng dự kiến ((0.5) để lọc trong thời gian có tỷ lệ biến động cao.
  3. Tạo tín hiệu: tạo tín hiệu đa khi chỉ số động lượng tổng hợp chuyển đổi từ tiêu cực sang chính xác và dao động thấp hơn so với giá trị giảm; khi chỉ số động lượng chuyển đổi sang tiêu cực thì yên.
  4. Quản lý rủi ro: Sử dụng 1% dừng lỗ và 50% dừng để kiểm soát rủi ro của một giao dịch.

Lợi thế chiến lược

  1. Phân tích động lực đa chiều: Có thể đánh giá toàn diện hơn về cường độ và tính bền vững của xu hướng giá bằng cách xem xét động lực trong nhiều chu kỳ thời gian.
  2. Bộ lọc tỷ lệ dao động thích ứng: Bằng cách tính toán động và lọc tỷ lệ dao động, hiệu quả tránh tín hiệu giả trong thời gian dao động cao.
  3. Kiểm soát rủi ro tốt: Thiết lập mức dừng lỗ và mức dừng lỗ, có thể kiểm soát hiệu quả rủi ro của một giao dịch.
  4. Quyết định có hệ thống: Chiến lược hoàn toàn có hệ thống, tránh được sự can thiệp của phán đoán chủ quan.

Rủi ro chiến lược

  1. Rủi ro đảo ngược xu hướng: Có thể chịu tổn thất lớn hơn nếu xu hướng mạnh đột ngột đảo ngược.
  2. Tính nhạy cảm của tham số: hiệu quả của chiến lược nhạy cảm với các thiết lập tham số như chu kỳ động lượng, giá trị giảm dao động.
  3. Tùy thuộc vào môi trường thị trường: có thể tạo ra các tín hiệu sai lệch thường xuyên trong thị trường biến động.
  4. Tác động của điểm trượt: Có thể phải đối mặt với chi phí giao dịch cao hơn khi thị trường thiếu thanh khoản.

Hướng tối ưu hóa chiến lược

  1. Tối ưu hóa tham số động: có thể giới thiệu cơ chế điều chỉnh tham số thích ứng, điều chỉnh chu kỳ động lực và giá trị giảm dao động theo trạng thái thị trường động.
  2. Phân loại trạng thái thị trường: thêm mô-đun nhận dạng trạng thái thị trường, sử dụng các thiết lập tham số khác nhau trong các môi trường thị trường khác nhau.
  3. Cơ chế xác nhận tín hiệu: giới thiệu các chỉ số kỹ thuật bổ sung để xác nhận tín hiệu giao dịch, tăng sự ổn định của chiến lược.
  4. Tối ưu hóa quản lý tiền: có thể điều chỉnh kích thước nắm giữ theo động lực của cường độ tín hiệu, để đạt được hiệu quả sử dụng tiền tốt hơn.

Tóm tắt

Chiến lược này kết hợp phân tích động lực đa chu kỳ và lọc tỷ lệ biến động để xây dựng một hệ thống giao dịch theo dõi xu hướng hoàn chỉnh. Điểm mạnh cốt lõi của nó là quá trình ra quyết định có hệ thống và cơ chế kiểm soát rủi ro tốt. Mặc dù có một số rủi ro vốn có, chiến lược vẫn có nhiều chỗ cải thiện thông qua hướng tối ưu hóa được đề xuất.

Mã nguồn chiến lược
/*backtest
start: 2024-02-25 00:00:00
end: 2025-02-22 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/

//@version=5
strategy("GOATED Long-Only", overlay=true, initial_capital=1000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Strategy parameters
var float VOLATILITY_THRESHOLD = input.float(0.5, "Volatility Threshold", minval=0.1, maxval=1.0, step=0.1)
var int TRADING_DAYS_PER_YEAR = 252
var float SQRT_TRADING_DAYS = math.sqrt(TRADING_DAYS_PER_YEAR)

// Trade parameters
var float STOP_LOSS = input.float(0.05, "Stop Loss %", minval=0.01, maxval=0.20, step=0.01)
var float TAKE_PROFIT = input.float(0.15, "Take Profit %", minval=0.05, maxval=0.50, step=0.01)

// Momentum periods (in trading days)
var int MOMENTUM_3M = input.int(63, "3-Month Momentum Period", minval=20)
var int MOMENTUM_6M = input.int(126, "6-Month Momentum Period", minval=40)
var int MOMENTUM_9M = input.int(189, "9-Month Momentum Period", minval=60)
var int MOMENTUM_12M = input.int(252, "12-Month Momentum Period", minval=80)

// Function to calculate momentum for a specific period
momentum(period) =>
    close / close[period] - 1

// Function to calculate annualized volatility
calcVolatility() =>
    returns = ta.change(close) / close[1]
    stdDev = ta.stdev(returns, TRADING_DAYS_PER_YEAR)
    annualizedVol = stdDev * SQRT_TRADING_DAYS
    annualizedVol

// Calculate individual momentum scores
float mom3m = momentum(MOMENTUM_3M)
float mom6m = momentum(MOMENTUM_6M)
float mom9m = momentum(MOMENTUM_9M)
float mom12m = momentum(MOMENTUM_12M)

// Calculate average momentum score
var int validPeriods = 0
var float totalMomentum = 0.0

validPeriods := 0
totalMomentum := 0.0

if not na(mom3m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom3m

if not na(mom6m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom6m

if not na(mom9m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom9m

if not na(mom12m)
    validPeriods := validPeriods + 1
    totalMomentum := totalMomentum + mom12m

float compositeMomentum = validPeriods > 0 ? totalMomentum / validPeriods : na

// Calculate volatility
float annualizedVolatility = calcVolatility()

// Generate trading signals
var float MOMENTUM_THRESHOLD = input.float(0.0, "Momentum Threshold", minval=-1.0, maxval=1.0, step=0.01)
bool validVolatility = not na(annualizedVolatility) and annualizedVolatility <= VOLATILITY_THRESHOLD
bool validMomentum = not na(compositeMomentum) and compositeMomentum > MOMENTUM_THRESHOLD

// Store previous momentum state
bool prevValidMomentum = nz(validMomentum[1])

// Entry and exit conditions
bool longCondition = validVolatility and validMomentum and not prevValidMomentum
bool exitLongCondition = validVolatility and (not validMomentum) and prevValidMomentum

// Plot signals
plotshape(longCondition, title="Long Entry", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(exitLongCondition, title="Long Exit", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot momentum and volatility indicators
plot(compositeMomentum, "Composite Momentum", color=color.blue, linewidth=2)
hline(MOMENTUM_THRESHOLD, "Momentum Threshold", color=color.gray, linestyle=hline.style_dashed)

plot(annualizedVolatility, "Annualized Volatility", color=color.purple, linewidth=1)
hline(VOLATILITY_THRESHOLD, "Volatility Threshold", color=color.gray, linestyle=hline.style_dashed)

// Strategy execution - Long positions
if (longCondition)
    strategy.entry("Long", strategy.long)
    
if (strategy.position_size > 0)
    float longStopLoss = strategy.position_avg_price * (1 - STOP_LOSS)
    float longTakeProfit = strategy.position_avg_price * (1 + TAKE_PROFIT)
    strategy.exit("Exit Long", "Long", stop=longStopLoss, limit=longTakeProfit)
    if (exitLongCondition)
        strategy.close("Long", comment="Signal Exit")