
다주기 이상 역전량화 전략은 평균 회귀 원리에 기반한 거래 시스템으로, 시장에서 단기간에 나타나는 이상적인 가격 변동을 식별하고 이러한 이상적인 행동 후에 역전 거래 작업을 수행하기 위해 특별히 설계되었다. 이 전략은 비율 변화 지수를 사용하여 특정 기간 내의 가격 변동의 폭을 모니터링한다. 변동이 미리 설정된 값을 초과할 때, 시스템은 자동으로 역전 거래 칸에 들어갑니다. 즉, 가격이 비정상적으로 상승할 때 공백을 만들고, 가격이 비정상적으로 떨어질 때 더 많이한다. 이 전략은 완전한 리스크 모듈 관리, 수수료 시뮬레이션 및 슬라이드 포인트 계산을 포함하며, 여러 가지 시장 환경 및 주기 시간대에 적합하다.
이 전략의 핵심 논리는 시장이 종종 단기간에 “ 과반응 “하고 평균으로 돌아가는 현상을 기반으로 합니다. 구체적인 구현 방법은 다음과 같습니다:
비정상 탐지 메커니즘: N 분 동안의 가격의 퍼센트 변화를 계산하고 사용자 정의 된 스릴과 비교합니다. 전략은 request.security 함수를 사용하여 이전 N 분의 가격 데이터를 가져오고 시간 정확성을 보장합니다.
거래 신호 생성:
유연한 포지션 관리: 전략은 공석에서 직접 다수 포지션이나 공석 포지션에 진입할 수 있으며, 기존 포지션에서 직접 역전하는 것도 지원한다. 중간 공석 포지션 단계가 필요하지 않다.
위험 제어 장치: 각 거래에는 고정된 점수의 스톱로즈와 스톱 스이 설정되어 있으며, strategy.exit 함수를 사용하여 엄격하게 위험 통제를 수행한다.
디스크 모의 변수이 전략에는 수수료 계산 (설정값은 0.05%), 슬라이드 시뮬레이션 (점 2) 및 계정 지분 비율에 기반한 포지션 크기의 계산이 내장되어 있습니다.
임시 실행 논리: process_orders_on_close=true 설정을 통해, 신호가 K선 종료 시 즉시 실행되도록 하고, 지연을 줄인다.
이 전략의 코드 구현을 심층적으로 분석한 결과, 우리는 다음과 같은 중요한 장점을 요약할 수 있습니다:
시장의 적응력이 전략은 거래의 종류와 기간에 따라 적용될 수 있으며, 사용자는 다양한 종류의 변동성에 따라 비율 절감과 회귀 시간을 조정할 수 있습니다.
정밀한 비정상적인 식별: 1분 정밀도의 데이터를 사용하여 가격 변화를 계산하여, 더 긴 시간 주기에도 예외 검출의 정확성을 유지할 수 있습니다.
자동화된 거래 논리이 시스템은 자동으로 변칙을 인식하고 거래를 실행할 수 있으며, 감정적 인 요소의 영향을 줄일 수 있습니다.
전체적인 위험 통제: 내장된 중지 및 중지 메커니즘, 각 거래에 대해 미리 설정된 위험 범위가 있으며, 단일 거래로 인한 과도한 손실을 방지합니다.
시각 보조 기능: 구성 가능한 차트 표기 ((삼각형의 거래 신호와 배경의 고조각) 을 통해, 거래자는 비정상적인 기간을 직관적으로 식별하여 분석 효율을 높일 수 있습니다.
실제 시장 비용 모형: 수수료, 슬라이드 포인트 및 포지션 크기를 고려하여 재검토 결과를 실제 디스크의 성과에 더 가깝게 만듭니다.
포지션 관리의 유연성: 공백→多/空,多仓→空,空→多仓의 직접 전환을 지원하고, 중간 단계가 필요하지 않아, 변동하는 시장에서 전략의 반응 속도를 높인다.
이 전략은 포괄적으로 설계되었지만 몇 가지 잠재적 위험과 도전이 있습니다.
트렌드 시장의 위험: 강한 트렌드 시장에서 가격은 빠르게 돌아가지 않을 수 있으며, 오히려 같은 방향으로 계속 움직이며, 역거래로 인해 지속적인 손실을 입습니다. 해결책은 트렌드 필터를 추가하여 강력한 트렌드를 식별 할 때 전략 실행을 중지하는 것입니다.
매개변수 민감도전략 성능은 퍼센트 하락과 회귀 시간 설정에 크게 의존한다. 다양한 시장 환경에서 최적의 매개 변수가 크게 달라진다. 전체적인 매개 변수 최적화 및 회귀가 권장되며 정기적으로 재평가된다.
비정상적인 시장 위험: 중요한 뉴스 또는 블랙 스 사건이 발생했을 때 가격이 급등하거나 극단적으로 변동할 수 있으며, 정지는 예상된 가격으로 실행되지 않을 수 있습니다. 변동율 필터를 늘리고, 비정상적으로 높은 변동이 있을 때 포지션을 줄이거나 거래를 중지하는 것을 고려할 수 있습니다.
유동성 고려: 유동성이 낮은 시장에서, 많은 주문은 슬라이드 포인트가 증가하여 전략의 성과에 영향을 미칠 수 있습니다. 유동성이 풍부한 시장에서 이 전략을 적용하거나 유동성 판단 조건을 증가시키는 것이 좋습니다.
고정 손실의 제한: 전략은 고정 점수를 사용하는 중지 및 중지, 시장의 변동성을 고려하지 않습니다. ATR 또는 변동성에 기반한 동적 중지 설정을 사용하는 것을 고려할 수 있습니다.
코드의 심층적인 분석을 바탕으로 다음과 같은 몇 가지 가능한 최적화 방향이 있습니다.
트렌드 필터 추가: 트렌드 지표를 추가하여 (예를 들어, 이동 평균, ADX 등) 강한 추세에서 역전 거래를 피하십시오. 이것은 가짜 신호를 크게 줄이고 승률을 높일 수 있습니다. 예를 들어, ADX가 특정 하위 값 (예: 명백한 추세가 없다는 것을 나타내는) 보다 낮은 경우에만 반전 거래를 허용하십시오.
동적 변수 조정: 시장의 변동에 따라 자동으로 백분율 하락과 중지 손실을 조정한다. ATR 지표는 시장의 변동성을 측정하기 위해 ATR 지표를 사용할 수 있으며, 높은 변동성 동안 하락을 높이고 낮은 변동성 동안 하락을 줄일 수 있습니다.
다중 시간 주기 확인다중 시간 주기의 분석을 추가하여, 여러 시간 주기가 모두 비정상적인 경우만 거래하여 신호 품질을 향상시킬 수 있습니다.
거래 시간 필터를 추가합니다.: 특정 시장은 특정 시간대에 평균값 회귀 현상이 더 쉽게 발생한다. 거래 시간을 제한함으로써 불리한 시장 시간을 피할 수 있다.
포지션 관리를 최적화현재 전략은 고정 비율의 자금 관리를 사용한다. 신호 강도 또는 현재 시장의 변동성에 따라 포지션 크기를 조정하고, 더 확실한 거래에서 포지션을 증가시키는 것을 고려할 수 있다.
이윤 추적 중지: 거래가 수익 영역에 들어간 후, 손실 추적 장치를 도입하여 수익의 일부를 잠금하고 수익을 계속 증가시킬 수 있습니다.
볼륨 증가 확인: 비정상적인 가격 이동은 일반적으로 거래량에 큰 변화를 동반한다. 거래량 필터 조건을 추가함으로써 신호의 신뢰성을 높일 수 있다.
다주기 이상 역전량화 전략은 시장의 단기 이상 변동을 정확하게 식별하고 역전 거래를함으로써 가격 역전 기회를 잡을 수 있도록 잘 설계된 평균 역전 거래 시스템입니다. 이 전략은 이상 탐지, 위험 관리 및 실장 시뮬레이션과 같은 여러 기능을 결합하여 여러 가지 거래 품종과 기간에 적합합니다.
전략의 주요 장점은 자동화된 비정상 인식 메커니즘, 정교한 위험 제어 및 유연한 위치 관리로 인해 변동성있는 시장에서 역전 기회를 잡을 수 있습니다. 그러나 강한 추세 시장에서 도전을 받을 수 있으며 추세 필터를 추가하는 등의 방법으로 최적화가 필요합니다.
이 전략에는 다중 시기를 확인하고, 동적 파라미터를 조정하고, 포지션 관리를 최적화하는 등의 방법을 추가함으로써, 개선할 여지가 많습니다. 양자 거래자에게는, 이것은 추가 개발 및 사용자 정의 할 수 있는 가치있는 전략 프레임워크이며, 특히 과도한 반응이 자주 발생하는 시장 환경에 적합합니다.
/*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")