상대적 볼륨 가격 전략


생성 날짜: 2023-12-28 17:54:44 마지막으로 수정됨: 2023-12-28 17:54:44
복사: 0 클릭수: 623
avatar of ChaoZhang ChaoZhang
1
집중하다
1623
수행원

상대적 볼륨 가격 전략

개요

상대적 가격 전략은 거래량 이상과 가격 변동에 기반한 양적 거래 전략이다. 이 전략은 현재 거래량과 역사 평균 거래량과의 관계를 비교하여 거래량이 이상인지 판단하고, 평균 실제 파동 범위와 결합하여 가격이 상대적으로 안정적인 범위에 있는지 판단한다. 거래량이 비정상적으로 증가하고 가격이 상대적으로 안정되면 진입 신호로 간주한다.

전략 원칙

상대량 가격 전략의 핵심 논리는 두 가지 지표에 기초하여 판단합니다. 하나는 상대 거래량이며 하나는 가격 변동의 범주입니다.

먼저, 우리는 최근 20주기의 거래량의 간단한 이동 평균을 계산하여 역사적인 평균 거래량으로 니다. 그리고는 배수 파라미터를 설정합니다. (예: 1.5배) 현재 거래량이 평균 거래량의 1.5배에 달할 때, 우리는 거래량이 비정상적이라고 생각하고, 상대적인 거래량이 다고 생각합니다.

다음으로, 우리는 최근 14주기의 평균 실제 파도 (ATR) 를 가격 변동의 척도로 계산한다. 또한 평균 파도의 표준 차이를 계산한다. 현재 실제 파도는 평균값의 양과 음의 표준 차이 사이에 있다면, 우리는 가격 변동이 비교적 평평한 범위에 있다고 생각한다.

위 두 가지 조건이 동시에 충족되면, 즉, 더 많은 신호를 발산하고, 더 많은 위치를 열습니다. 포지션을 보유하는 과정에서, 최대 낮은 지점으로 ATR을 두 배로 줄인 후, 최대 지점으로 ATR을 두 배로 줄인 후,

우위 분석

상대량 전략의 가장 큰 장점은 비정상적인 거래량으로 인한 가격 추세를 포착하는 데 있습니다. 거래량이 급증하면 시장 참가자의 태도의 변화를 나타냅니다. 이는 종종 가격의 돌파구와 새로운 추세가 형성되는 것을 나타냅니다. 전략은 거래량과 역사적 평균의 관계를 비교하여 거래량이 비정상적인 시점을 효과적으로 판단 할 수 있습니다.

다른 한편으로, 전략은 가격의 변동성을 고려하여 신호가 상대적으로 평온한 시간에 발생하게합니다. 이것은 급격한 변동이있을 때 추격으로 인한 엄청난 손실 위험을 피합니다. 또한 수익을 창출 할 수있는 기회를 증가시킵니다.

위험 분석

이 전략의 가장 큰 위험은 거래량 지표가 새로운 트렌드를 100% 결정하지 못한다는 것입니다. 거래량이 급증하면 가짜 돌파구가 될 수 있으며, 가격이 빨리 뒤집힐 수 있습니다. 이 경우 전략은 큰 손실을 입습니다.

손실을 줄이기 위해, 거래량 비정상적인 판단에 대해 더 엄격한 기준을 설정하여 거래량에 대한 상대적 양의 파라미터를 적절히 조정할 수 있습니다. 또는 거래량 분석을 추가하여 거래량 증가와 거래 금액이 일치하는지 판단하는 것과 같은 다른 판단 지표를 추가 할 수 있습니다.

최적화 방향

이 전략은 다음과 같은 부분에서 최적화될 수 있습니다.

  1. 거래량 이상 신호를 더욱 신뢰할 수 있도록 다른 지표 판단을 추가합니다.

  2. ATR 파라미터는 다른 주식들에 대해 최적화되어 가격 안정성 범위를 더 정확하게 판단할 수 있다.

  3. 기계학습 알고리즘을 추가하여 거래량의 이상성을 적극적으로 판단하고, 단순히 역사적 평균과 비교하는 것이 아닙니다.

  4. 딥러닝 모델을 사용하여 가격 변동 예측을 결정하고, 단지 역사적인 ATR을 기반으로 하지 않는다.

요약하다

상대량 전략은 거래량 이상성을 특징 신호로 포착하여 가격 안정 판단과 결합하여 거래 신호를 발산한다. 전략은 간단하고 실용적이며 주식 비정상적인 거래량을 추적할 때 효과적이다. 그러나 특정 가짜 신호의 위험이 있으며, 판단 효과를 높이기 위해 지표를 더 최적화해야 한다.

전략 소스 코드
/*backtest
start: 2022-12-21 00:00:00
end: 2023-12-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © DojiEmoji (kevinhhl)

//@version=4
strategy("[KL] Relative Volume + ATR Strategy",overlay=true,pyramiding=1)
ENUM_LONG = "Long"

// Timeframe {
backtest_timeframe_start = input(defval = timestamp("01 Apr 2016 13:30 +0000"), title = "Backtest Start Time", type = input.time)
USE_ENDTIME = input(false,title="Define backtest end-time (If false, will test up to most recent candle)")
backtest_timeframe_end = input(defval = timestamp("01 May 2021 19:30 +0000"), title = "Backtest End Time (if checked above)", type = input.time)
within_timeframe = true
// }
len_volat = input(14,title="Length of ATR to determine volatility")
ATR_volat = atr(len_volat)
avg_ATR_volat  = sma(ATR_volat, len_volat)
std_ATR_volat = stdev(ATR_volat, len_volat)
// }

// Trailing stop loss {
ATR_X2_TSL = atr(input(14,title="Length of ATR for trailing stop loss")) * input(2.0,title="ATR Multiplier for trailing stop loss",type=input.float)
TSL_source = low
var stop_loss_price = float(0)
TSL_line_color = color.green, TSL_transp = 100
if strategy.position_size == 0 or not within_timeframe
    TSL_line_color := color.black
    stop_loss_price := TSL_source - ATR_X2_TSL 
else if strategy.position_size > 0
    stop_loss_price := max(stop_loss_price, TSL_source - ATR_X2_TSL)
    TSL_transp := 0
plot(stop_loss_price, color=color.new(TSL_line_color, TSL_transp))
// }

// Signals for entry {
_avg_vol = sma(volume,input(20, title="SMA(volume) length (for relative comparison)"))
_relative_vol = _avg_vol * input(1.5,title="Multiple of avg vol to consider relative volume as being high",type=input.float)
__lowerOfOpenClose = min(open,close)
_wickRatio_lower = (__lowerOfOpenClose - low) / (high - low)
entry_signal1 = volume > _relative_vol
entry_signal2 = ATR_volat < avg_ATR_volat + std_ATR_volat and ATR_volat > avg_ATR_volat - std_ATR_volat
// }


alert_per_bar(msg)=>
    prefix = "[" + syminfo.root + "] "
    suffix = "(P=" + tostring(close) + "; atr=" + tostring(ATR_volat) + ")"
    alert(tostring(prefix) + tostring(msg) + tostring(suffix), alert.freq_once_per_bar)

// MAIN:
if within_timeframe
    if strategy.position_size > 0 and strategy.position_size[1] > 0 and (stop_loss_price/stop_loss_price[1]-1) > 0.005
        alert_per_bar("TSL raised to " + tostring(stop_loss_price))

    // EXIT ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::    // placed before entry, will re-enter if stopped out
	exit_msg = close <= strategy.position_avg_price ? "stop loss" : "take profit"
	if strategy.position_size > 0 and TSL_source <= stop_loss_price
        strategy.close(ENUM_LONG, comment=exit_msg)

    // ENTRY :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
	if entry_signal1 and entry_signal2// and entry_signal3
		entry_msg = strategy.position_size > 0 ? "adding" : "initial"
		strategy.entry(ENUM_LONG, strategy.long, comment=entry_msg)

// CLEAN UP:
if strategy.position_size == 0
	stop_loss_price := float(0)