
대수평균 가격 회귀 동적 상쇄 전략은 수학적 원리에 기반한 정량 거래 전략으로, 주로 가격이 평균값의 변동성을 이용한 거래이다. 이 전략은 가격을 대수 형태로 변환한 다음, Z 스코어 (標準差倍數) 를 계산하여 가격의 평균값의 편차 정도를 측정한다. Z 스코어가 특정 하위치를 달성하면, 이 전략은 시장이 과매 또는 과매 현상이 발생했다고 생각하고, 예상된 가격 회귀 수치를 기반으로 거래한다. 이 전략의 독특한 점은 동적 상쇄 메커니즘으로, 이 메커니즘은 시장의 변동성에 따라 자동으로 상쇄 수준을 조정하여 위험 관리의 효율성을 높인다.
이 전략의 핵심 원리는 평균값 회귀 이론과 상수 가격의 통계적 특성에 기초한다. 구체적으로 구현하는 단계는 다음과 같다:
우선, 전략은 종결값을 대수형으로 변환합니다.log_price = math.log(close)), 이는 곱셈변화를 덧셈변화로 변환하여 가격변화를 정형분포에 더 잘 맞추는 데 도움이 된다.
다음으로, 설정된 스크롤 창을 기반으로 (기본 7주기), 쌍의 가격의 이동 평균을 계산합니다 (기본 7주기)rolling_mean rolling_std)。
이 통계를 사용하여 현재 대수값의 Z 점수를 계산합니다.rolling_z_score = (log_price - rolling_mean) / rolling_std, 이 값은 현재 가격의 평균값의 표준차의 배수를 나타냅니다.
입시 조건은 다음과 같습니다.
정지 목표값은 대수값의 이동 평균값의 지수 형태로 설정된다:take_profit_price = math.exp(rolling_mean)즉, 전략의 목표는 가격을 통계적 평균으로 되돌리는 것이다.
이 전략의 핵심 혁신은 동적 상쇄입니다.
이 논리는 다음과 같은 두 가지 상황을 포함합니다.
기본 통계이 전략은 견고한 통계학적 원리에 기초하여 Z 점수를 사용하여 가격 편차를 측정하여 객관적인 입출장 신호를 제공합니다.
수값 변환: 대수값이 아닌 원값을 사용하여 계산하여 가격변동이 정형 분포에 더 적합하게 만들고, 통계 지표의 유효성을 높였다.
동적 위험 관리이 전략의 가장 큰 특징은 동적 손실 메커니즘으로, 시장의 변동성에 따라 자동으로 손실 수준을 조정할 수 있으며, 자금을 보호하면서 충분한 거래 공간을 허용합니다.
양방향 거래이 전략은 다단계 거래와 공백 거래를 동시에 지원하며, 다양한 시장 환경에서 기회를 찾을 수 있습니다.
평균값을 목표로: 통계적 평균값을 정지목표로 사용하는 것은 평균값 회귀의 이론적 기초에 부합하며, 정지값의 합리성을 높인다.
변수는 조정할 수 있습니다이 전략은 롤링 창, 입점 Z 점수, 그리고 중지 Z 점수를 포함한 여러 조정 가능한 파라미터를 제공하여 거래자가 다른 시장과 개인 위험 선호도에 따라 조정할 수 있습니다.
평균값 회귀 가설 위험전략의 핵심 가정은 가격이 통계적 평균으로 돌아간다는 것이지만, 추세 시장이나 구조적 변화 시장에서 이 가정은 실패할 수 있으며, 장기적인 손실을 초래한다. 해결 방법: 추세 필터를 추가하여 강한 추세 시장에서 거래를 중지 할 수 있다.
과민한 Z 점수매우 낮은 변동성이있는 시장에서, 가격의 작은 변동조차도 큰 Z 점수 변화를 일으킬 수 있으며, 불필요한 거래 신호를 유발할 수 있습니다. 해결 방법: 최소 변동률 값을 설정하거나, 낮은 변동률 환경에서 입점 값을 조정하십시오.
창 길이 민감성: 전략 성능은 스크롤 창 길이 변수에 매우 민감하며, 잘못 선택하면 과다 거래 또는 기회를 놓치게 될 수 있다. 해결 방법: 다른 창 길이의 회귀를 통해 최적의 변수를 찾을 수 있거나, 또는 적응 창 길이를 사용할 수 있다.
데이터 손실의 위험거래 초기에, 충분한 역사적 데이터가 없기 때문에 이동 평균과 표준 차이는 계산되며, 이는 신호의 불안정을 초래할 수 있다. 해결 방법: 지표를 계산하기 전에 충분한 예기 기간이 있는지 확인한다.
손해배상 조정 전략 위험: 동적 중지 손해 메커니즘은 혁신적이지만, 변동성이 급격하게 변할 때 중지 손해 지점 과조정을 초래할 수 있다. 해결 방법: 중지 손해 조정의 최대 폭 제한을 설정하여 과조정을 방지할 수 있다.
창 길이를 조정합니다.: 현재 전략은 고정된 롤링 창 길이를 사용한다 (기본 7 주기) 계산 통계 지표. 시장의 주기적 변화에 따라 자동으로 창 크기를 조정하는 적응 창 길이를 구현하는 것이 고려 될 수 있습니다. 이것은 다양한 시간 단위의 평균 회귀 기회를 더 잘 포착하여 전략의 적응성을 향상시킬 수 있습니다.
트렌드 필터: 트렌드 판단 메커니즘을 추가하고, 강한 트렌드 시장에서 전략 매개 변수를 일시 중지하거나 조정하고, 수평선 또는 역전 시장에서만 평균값 회귀 전략을 적용한다. 이것은 장기 이동 평균 또는 ADX와 같은 트렌드 지표를 추가함으로써 이루어질 수 있으며, 일방적인 트렌드 시장에서 빈번한 손실을 피한다.
다중 시간 프레임 분석: 여러 시간 프레임의 Z 스코어 신호를 통합하여 더 포괄적인 입출장 결정을 형성한다. 예를 들어, 더 큰 시간 프레임에서 평균 반환 기회를 확인하고, 더 작은 시간 프레임에서 정확한 입출장을 찾아 승리율과 리스크 수익률을 높일 수 있다.
정지 최적화: 현재 전략은 간단한 평균을 중지 목표로 사용합니다. 동적 중지 장치를 적용하는 것은 시장 구조 또는 중단과 관련된 위험-수익 비율에 따라 중지 목표를 설정하는 것과 같이 고려 할 수 있습니다. 또는 가격이 유리한 방향으로 이동할 때 점진적으로 이익을 잠금하는 부분적인 중지 전략을 구현합니다.
변동률 가중치: Z 점수를 계산할 때 진동률 가중제 메커니즘을 포함시키는 것을 고려하여, 보다 안정적인 주기간의 데이터에 더 높은 무게를 부여하여, 이는 극단적인 진동이 신호 생성에 대한 간섭을 줄이고, 신호 품질을 향상시킬 수 있다.
기계학습 통합: 진출과 출전을 최적화하기 위해 기계 학습 알고리즘을 도입하는 것을 고려하십시오. 이 알고리즘은 역사 데이터 훈련 모델을 기반으로 최적의 Z 스코어 진입값과 동적 스톱 손실 파라미터를 예측하여 전략의 적응력과 전반적인 성능을 향상시킬 수 있습니다.
대수값 평균값 역동적 중지 전략은 통계학 원칙에 기반한 정량 거래 전략으로, 대수값의 Z 스코어를 계산하여 시장의 과매매와 과매매 상태를 식별하고, 가격이 평균값으로 돌아가는 것을 예상할 때 수익을 얻습니다. 이 전략의 핵심 혁신은 시장의 변동성에 따라 위험 매개 변수를 자동으로 조정할 수 있는 동적 중지 장치에 있습니다.
전략은 견고한 통계학적 기초에 기반을 두고 있지만, 평균값 회귀 가설이 실패할 수 있는 것, 변수 민감성, 시장 환경 적응성 등과 같은 과제를 직면하고 있다. 트렌드 필터를 추가하고, 자동으로 적응하는 창 길이, 다중 시간 프레임 분석 및 기계 학습 최적화 등과 같은 개선을 통해 전략은 다양한 시장 환경에서 더 안정적인 성능을 달성할 잠재력을 가지고 있다.
주목할 점은, 모든 양적 전략은 충분한 재검토와 전향 검증을 거쳐 특정 시장 특성과 개인 위험 선호에 따라 변수를 조정해야한다는 것입니다. 이 전략은 통계학 원리와 동적 위험 관리의 통합을 제공하는 프레임 워크를 제공하여 거래자가 추가적으로 사용자 정의하고 최적화 할 수 있습니다.
/*backtest
start: 2024-03-14 00:00:00
end: 2025-03-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("Mean Reversion Z-Score Strategy with Dynamic SL", overlay=true)
// Input parameters
window = input.int(7, "Rolling Window", minval=1)
z_entry_long = input.float(-1.825, "Z-Score Long Entry", step=0.025)
z_entry_short = input.float(1.825, "Z-Score Short Entry", step=0.025)
z_stop_loss_long = input.float(-2.125, "Z-Score Stop Loss Long", step=0.025)
z_stop_loss_short = input.float(2.125, "Z-Score Stop Loss Short", step=0.025)
// Calculate log price, rolling mean, and rolling standard deviation
log_price = math.log(close)
rolling_mean = ta.sma(log_price, window)
rolling_std = ta.stdev(log_price, window)
rolling_z_score = (log_price - rolling_mean) / rolling_std
// Persistent variables to store entry conditions
var float entry_price = 0.0
var float entry_log_price = 0.0
var float entry_mean = 0.0
var float entry_std = 0.0
var float stop_loss_price = 0.0
var string position = "none"
// Calculate dynamic take-profit
take_profit_price = math.exp(rolling_mean)
// Entry logic
if (rolling_z_score <= z_entry_long and position == "none")
entry_price := close
entry_log_price := log_price
entry_mean := rolling_mean
entry_std := rolling_std
stop_loss_price := math.exp(log_price + z_stop_loss_long * rolling_std)
position := "long"
strategy.entry("Long", strategy.long)
if (rolling_z_score >= z_entry_short and position == "none")
entry_price := close
entry_log_price := log_price
entry_mean := rolling_mean
entry_std := rolling_std
stop_loss_price := math.exp(log_price - z_stop_loss_short * rolling_std)
position := "short"
strategy.entry("Short", strategy.short)
// Exit logic with dynamic adjustments
if (position != "none")
// Calculate new stop-loss based on current volatility
float new_stop_loss = na
if (position == "long")
new_stop_loss := math.exp(log_price + z_stop_loss_long * rolling_std)
if (rolling_std > entry_std)
stop_loss_price := math.min(stop_loss_price, new_stop_loss)
else if (rolling_std < entry_std)
stop_loss_price := math.max(stop_loss_price, new_stop_loss)
if (close >= take_profit_price)
strategy.close("Long", comment="TP")
position := "none"
else if (close <= stop_loss_price)
strategy.close("Long", comment="SL")
position := "none"
else if (position == "short")
new_stop_loss := math.exp(log_price - z_stop_loss_short * rolling_std)
if (rolling_std > entry_std)
stop_loss_price := math.max(stop_loss_price, new_stop_loss)
else if (rolling_std < entry_std)
stop_loss_price := math.min(stop_loss_price, new_stop_loss)
if (close <= take_profit_price)
strategy.close("Short", comment="TP")
position := "none"
else if (close >= stop_loss_price)
strategy.close("Short", comment="SL")
position := "none"
// Plots
plot(rolling_z_score, title="Z-Score", color=color.blue, linewidth=1)
plot(z_entry_short, title="Z-Score-upper", color=color.rgb(33, 243, 103), linewidth=1)
plot(z_entry_long, title="Z-Score-lower", color=color.rgb(243, 33, 61), linewidth=1)