다기간 비정상 반전 양적 거래 전략

RSI MACD ADX SMA EMA ATR SL TP CCI ROC
생성 날짜: 2025-05-16 10:01:32 마지막으로 수정됨: 2025-05-16 10:01:32
복사: 2 클릭수: 433
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

다기간 비정상 반전 양적 거래 전략 다기간 비정상 반전 양적 거래 전략

개요

다주기 이상 역전량화 전략은 평균 회귀 원리에 기반한 거래 시스템으로, 시장에서 단기간에 나타나는 이상적인 가격 변동을 식별하고 이러한 이상적인 행동 후에 역전 거래 작업을 수행하기 위해 특별히 설계되었다. 이 전략은 비율 변화 지수를 사용하여 특정 기간 내의 가격 변동의 폭을 모니터링한다. 변동이 미리 설정된 값을 초과할 때, 시스템은 자동으로 역전 거래 칸에 들어갑니다. 즉, 가격이 비정상적으로 상승할 때 공백을 만들고, 가격이 비정상적으로 떨어질 때 더 많이한다. 이 전략은 완전한 리스크 모듈 관리, 수수료 시뮬레이션 및 슬라이드 포인트 계산을 포함하며, 여러 가지 시장 환경 및 주기 시간대에 적합하다.

전략 원칙

이 전략의 핵심 논리는 시장이 종종 단기간에 “ 과반응 “하고 평균으로 돌아가는 현상을 기반으로 합니다. 구체적인 구현 방법은 다음과 같습니다:

  1. 비정상 탐지 메커니즘: N 분 동안의 가격의 퍼센트 변화를 계산하고 사용자 정의 된 스릴과 비교합니다. 전략은 request.security 함수를 사용하여 이전 N 분의 가격 데이터를 가져오고 시간 정확성을 보장합니다.

  2. 거래 신호 생성

    • 가격 상승이 설정된 시간 동안 절감 비율을 초과하면, 시스템은 “상승 이상”으로 인식하여 하락 신호를 유발합니다.
    • 가격 하락이 설정된 시간 동안 하락의 비율을 초과하면, 시스템은 “하락 비정상”으로 인식하고, 다중 신호를 유발합니다.
  3. 유연한 포지션 관리: 전략은 공석에서 직접 다수 포지션이나 공석 포지션에 진입할 수 있으며, 기존 포지션에서 직접 역전하는 것도 지원한다. 중간 공석 포지션 단계가 필요하지 않다.

  4. 위험 제어 장치: 각 거래에는 고정된 점수의 스톱로즈와 스톱 스이 설정되어 있으며, strategy.exit 함수를 사용하여 엄격하게 위험 통제를 수행한다.

  5. 디스크 모의 변수이 전략에는 수수료 계산 (설정값은 0.05%), 슬라이드 시뮬레이션 (점 2) 및 계정 지분 비율에 기반한 포지션 크기의 계산이 내장되어 있습니다.

  6. 임시 실행 논리: process_orders_on_close=true 설정을 통해, 신호가 K선 종료 시 즉시 실행되도록 하고, 지연을 줄인다.

전략적 이점

이 전략의 코드 구현을 심층적으로 분석한 결과, 우리는 다음과 같은 중요한 장점을 요약할 수 있습니다:

  1. 시장의 적응력이 전략은 거래의 종류와 기간에 따라 적용될 수 있으며, 사용자는 다양한 종류의 변동성에 따라 비율 절감과 회귀 시간을 조정할 수 있습니다.

  2. 정밀한 비정상적인 식별: 1분 정밀도의 데이터를 사용하여 가격 변화를 계산하여, 더 긴 시간 주기에도 예외 검출의 정확성을 유지할 수 있습니다.

  3. 자동화된 거래 논리이 시스템은 자동으로 변칙을 인식하고 거래를 실행할 수 있으며, 감정적 인 요소의 영향을 줄일 수 있습니다.

  4. 전체적인 위험 통제: 내장된 중지 및 중지 메커니즘, 각 거래에 대해 미리 설정된 위험 범위가 있으며, 단일 거래로 인한 과도한 손실을 방지합니다.

  5. 시각 보조 기능: 구성 가능한 차트 표기 ((삼각형의 거래 신호와 배경의 고조각) 을 통해, 거래자는 비정상적인 기간을 직관적으로 식별하여 분석 효율을 높일 수 있습니다.

  6. 실제 시장 비용 모형: 수수료, 슬라이드 포인트 및 포지션 크기를 고려하여 재검토 결과를 실제 디스크의 성과에 더 가깝게 만듭니다.

  7. 포지션 관리의 유연성: 공백→多/空,多仓→空,空→多仓의 직접 전환을 지원하고, 중간 단계가 필요하지 않아, 변동하는 시장에서 전략의 반응 속도를 높인다.

전략적 위험

이 전략은 포괄적으로 설계되었지만 몇 가지 잠재적 위험과 도전이 있습니다.

  1. 트렌드 시장의 위험: 강한 트렌드 시장에서 가격은 빠르게 돌아가지 않을 수 있으며, 오히려 같은 방향으로 계속 움직이며, 역거래로 인해 지속적인 손실을 입습니다. 해결책은 트렌드 필터를 추가하여 강력한 트렌드를 식별 할 때 전략 실행을 중지하는 것입니다.

  2. 매개변수 민감도전략 성능은 퍼센트 하락과 회귀 시간 설정에 크게 의존한다. 다양한 시장 환경에서 최적의 매개 변수가 크게 달라진다. 전체적인 매개 변수 최적화 및 회귀가 권장되며 정기적으로 재평가된다.

  3. 비정상적인 시장 위험: 중요한 뉴스 또는 블랙 스 사건이 발생했을 때 가격이 급등하거나 극단적으로 변동할 수 있으며, 정지는 예상된 가격으로 실행되지 않을 수 있습니다. 변동율 필터를 늘리고, 비정상적으로 높은 변동이 있을 때 포지션을 줄이거나 거래를 중지하는 것을 고려할 수 있습니다.

  4. 유동성 고려: 유동성이 낮은 시장에서, 많은 주문은 슬라이드 포인트가 증가하여 전략의 성과에 영향을 미칠 수 있습니다. 유동성이 풍부한 시장에서 이 전략을 적용하거나 유동성 판단 조건을 증가시키는 것이 좋습니다.

  5. 고정 손실의 제한: 전략은 고정 점수를 사용하는 중지 및 중지, 시장의 변동성을 고려하지 않습니다. ATR 또는 변동성에 기반한 동적 중지 설정을 사용하는 것을 고려할 수 있습니다.

전략 최적화 방향

코드의 심층적인 분석을 바탕으로 다음과 같은 몇 가지 가능한 최적화 방향이 있습니다.

  1. 트렌드 필터 추가: 트렌드 지표를 추가하여 (예를 들어, 이동 평균, ADX 등) 강한 추세에서 역전 거래를 피하십시오. 이것은 가짜 신호를 크게 줄이고 승률을 높일 수 있습니다. 예를 들어, ADX가 특정 하위 값 (예: 명백한 추세가 없다는 것을 나타내는) 보다 낮은 경우에만 반전 거래를 허용하십시오.

  2. 동적 변수 조정: 시장의 변동에 따라 자동으로 백분율 하락과 중지 손실을 조정한다. ATR 지표는 시장의 변동성을 측정하기 위해 ATR 지표를 사용할 수 있으며, 높은 변동성 동안 하락을 높이고 낮은 변동성 동안 하락을 줄일 수 있습니다.

  3. 다중 시간 주기 확인다중 시간 주기의 분석을 추가하여, 여러 시간 주기가 모두 비정상적인 경우만 거래하여 신호 품질을 향상시킬 수 있습니다.

  4. 거래 시간 필터를 추가합니다.: 특정 시장은 특정 시간대에 평균값 회귀 현상이 더 쉽게 발생한다. 거래 시간을 제한함으로써 불리한 시장 시간을 피할 수 있다.

  5. 포지션 관리를 최적화현재 전략은 고정 비율의 자금 관리를 사용한다. 신호 강도 또는 현재 시장의 변동성에 따라 포지션 크기를 조정하고, 더 확실한 거래에서 포지션을 증가시키는 것을 고려할 수 있다.

  6. 이윤 추적 중지: 거래가 수익 영역에 들어간 후, 손실 추적 장치를 도입하여 수익의 일부를 잠금하고 수익을 계속 증가시킬 수 있습니다.

  7. 볼륨 증가 확인: 비정상적인 가격 이동은 일반적으로 거래량에 큰 변화를 동반한다. 거래량 필터 조건을 추가함으로써 신호의 신뢰성을 높일 수 있다.

요약하다

다주기 이상 역전량화 전략은 시장의 단기 이상 변동을 정확하게 식별하고 역전 거래를함으로써 가격 역전 기회를 잡을 수 있도록 잘 설계된 평균 역전 거래 시스템입니다. 이 전략은 이상 탐지, 위험 관리 및 실장 시뮬레이션과 같은 여러 기능을 결합하여 여러 가지 거래 품종과 기간에 적합합니다.

전략의 주요 장점은 자동화된 비정상 인식 메커니즘, 정교한 위험 제어 및 유연한 위치 관리로 인해 변동성있는 시장에서 역전 기회를 잡을 수 있습니다. 그러나 강한 추세 시장에서 도전을 받을 수 있으며 추세 필터를 추가하는 등의 방법으로 최적화가 필요합니다.

이 전략에는 다중 시기를 확인하고, 동적 파라미터를 조정하고, 포지션 관리를 최적화하는 등의 방법을 추가함으로써, 개선할 여지가 많습니다. 양자 거래자에게는, 이것은 추가 개발 및 사용자 정의 할 수 있는 가치있는 전략 프레임워크이며, 특히 과도한 반응이 자주 발생하는 시장 환경에 적합합니다.

전략 소스 코드
/*backtest
start: 2024-05-16 00:00:00
end: 2025-05-14 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy(title="Anomaly Counter-Trend Strategy",
         shorttitle="ACTS",
         overlay=true,
         initial_capital=10000,
         default_qty_type=strategy.percent_of_equity, // Trade size as a percentage of equity
         default_qty_value=1,                         // Default to 1% of equity per trade
         commission_type=strategy.commission.percent, // Commission as a percentage of trade value
         commission_value=0.05,                       // 0.05% commission per trade
         slippage=2,                                  // 2 ticks of slippage
         process_orders_on_close=true,                // Process orders on bar close for more immediate fills
         margin_long=100,                             // Pine v6 default: 100% margin for long
         margin_short=100)                            // Pine v6 default: 100% margin for short

// Inputs for Anomaly Detection
//-----------------------------------------------------------------------------
var GRP_ANOMALY = "Anomaly Detection Parameters"
inpPercentageThreshold = input.float(1, title="Percentage Threshold (%)", minval=0.01, step=0.01, group=GRP_ANOMALY, tooltip="Minimum percentage change (e.g., 2 for 2%) over the lookback period to detect an anomaly. Positive value used for both up/down moves.")
inpLookbackMinutes = input.int(30, title="Lookback Period (Minutes)", minval=1, group=GRP_ANOMALY, tooltip="The period in minutes to look back for calculating the price change. E.g., for a 15-minute period, enter 15.")

// Inputs for Risk Management
//-----------------------------------------------------------------------------
var GRP_RISK = "Risk Management"
inpStopLossTicks = input.int(100, title="Stop Loss (Ticks)", minval=1, group=GRP_RISK, tooltip="Stop-loss distance from entry price in ticks. Adjust based on instrument volatility.")
inpTakeProfitTicks = input.int(200, title="Take Profit (Ticks)", minval=1, group=GRP_RISK, tooltip="Take-profit distance from entry price in ticks. Adjust based on instrument volatility.")

// Inputs for Visual Settings
//-----------------------------------------------------------------------------
var GRP_VISUAL = "Visual Settings"
inpPlotShapes = input.bool(true, title="Plot Trade Signal Shapes", group=GRP_VISUAL, tooltip="If true, plots shapes (triangles) on the chart for buy/sell signals.")
inpBgColor = input.bool(true, title="Highlight Anomaly Background", group=GRP_VISUAL, tooltip="If true, changes the chart background color during detected anomaly periods.")

// Fetch Historical Price Data
//-----------------------------------------------------------------------------
// Fetch the closing price from 'inpLookbackMinutes' ago using 1-minute data for precision.
// The index is inpLookbackMinutes - 1 because array/series indexing is 0-based.
// e.g., for 15 minutes ago, we need the 14th previous 1-minute bar's close.
// A check for inpLookbackMinutes > 0 is included to prevent negative index if input is 0 or 1.
priceNMinutesAgo = request.security(syminfo.tickerid, "1", close[inpLookbackMinutes > 0? inpLookbackMinutes - 1 : 0], gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)

// Calculate Percentage Change
//-----------------------------------------------------------------------------
percentageChange = 0.0 // Initialize with a default value
if not na(priceNMinutesAgo) and priceNMinutesAgo!= 0.0
    // Standard percentage change formula: ((current - past) / past) * 100
    percentageChange := ((close - priceNMinutesAgo) / priceNMinutesAgo) * 100.0

// Define Anomaly Conditions
//-----------------------------------------------------------------------------
// A price rise anomaly occurs if the positive percentage change meets or exceeds the threshold.
isPriceRiseAnomaly = percentageChange >= inpPercentageThreshold and inpPercentageThreshold > 0

// A price fall anomaly occurs if the negative percentage change meets or exceeds the (negative) threshold.
isPriceFallAnomaly = percentageChange <= -inpPercentageThreshold and inpPercentageThreshold > 0

// Define Trade Conditions
//-----------------------------------------------------------------------------
// Sell (short) if a price rise anomaly occurs and we are not already short (i.e., flat or long).
// This allows for position reversal if currently long.
sellCondition = isPriceRiseAnomaly and strategy.position_size >= 0

// Buy (long) if a price fall anomaly occurs and we are not already long (i.e., flat or short).
// This allows for position reversal if currently short.
buyCondition = isPriceFallAnomaly and strategy.position_size <= 0

// Execute Trades
//-----------------------------------------------------------------------------
// Entry for Sell (Short)
if sellCondition
    strategy.entry("SellAnomaly", strategy.short, comment="Sell on Rise Anomaly")

// Entry for Buy (Long)
if buyCondition
    strategy.entry("BuyAnomaly", strategy.long, comment="Buy on Fall Anomaly")

// Risk Management: Stop Loss and Take Profit
//-----------------------------------------------------------------------------
// Apply stop-loss and take-profit if in a long position
if strategy.position_size > 0
    strategy.exit(id="Exit Long", from_entry="BuyAnomaly", loss=inpStopLossTicks, profit=inpTakeProfitTicks, comment_profit="TP Long", comment_loss="SL Long")

// Apply stop-loss and take-profit if in a short position
if strategy.position_size < 0
    strategy.exit(id="Exit Short", from_entry="SellAnomaly", loss=inpStopLossTicks, profit=inpTakeProfitTicks, comment_profit="TP Short", comment_loss="SL Short")

// Visual Indicators
//-----------------------------------------------------------------------------
// Plot shapes for buy/sell signals if enabled

plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.new(color.green, 0), style=shape.triangleup, size=size.normal, text="BUY")
plotshape(series=sellCondition, title="Sell Signal", location=location.abovebar, color=color.new(color.red, 0), style=shape.triangledown, size=size.normal, text="SELL")

// Change background color during anomaly periods if enabled
anomalyDetectedColor = isPriceRiseAnomaly? color.new(color.red, 85) : isPriceFallAnomaly? color.new(color.green, 85) : na
bgcolor(anomalyDetectedColor, title="Anomaly Period Highlight")