Стратегия ценообразования по относительному объему

Автор:Чао ЧжанДата: 2023-12-28 17:54:44
Тэги:

img

Обзор

Стратегия относительного объема цены - это количественная стратегия торговли, основанная на ненормальном объеме торговли и волатильности цен. Эта стратегия сравнивает текущий объем торговли с историческим средним для определения ненормального объема торговли.

Принцип стратегии

Основная логика стратегии ценообразования относительного объема основана на двух показателях для оценки: относительном объеме торговли и диапазоне колебаний цен.

Сначала мы рассчитываем простую скользящую среднюю величину объема торгов за последние 20 периодов как исторический средний объем торгов. Затем мы устанавливаем множественный параметр (например, в 1,5 раза). Когда текущий объем торгов больше, чем в 1,5 раза средний объем торгов, мы считаем объем торгов ненормальным и относящимся к ситуации относительного объема.

Во-вторых, мы рассчитываем средний истинный диапазон (ATR) за последние 14 периодов как меру волатильности цен. В то же время мы рассчитываем стандартное отклонение средней волатильности. Если текущая истинная волатильность находится между средним плюс или минус одно стандартное отклонение, мы считаем, что колебания цен находятся в относительно стабильном диапазоне.

При одновременном выполнении двух вышеперечисленных условий выпускается длинный сигнал для открытия длинной позиции.

Анализ преимуществ

Самым большим преимуществом стратегии ценовых показателей относительного объема является то, что она отслеживает ценовые тенденции, вызванные аномальным объемом торговли. Когда объем торговли увеличивается, это представляет собой изменение отношения участников рынка, что часто сигнализирует о ценовых прорывах и формировании новых тенденций. Сравнивая взаимосвязь между объемом торговли и историческими средними, стратегия может эффективно определить сроки аномального объема торговли.

С другой стороны, стратегия также учитывает уровень волатильности, так что сигналы происходят в относительно стабильные периоды цены. Это избегает огромного риска потери, вызванного преследованием максимумов во время сильных колебаний. Это также увеличивает возможности получения прибыли, потому что тенденции обычно начинают прорываться после относительной стабильности.

Анализ рисков

Наибольший риск этой стратегии заключается в том, что индикатор объема торговли не может быть на 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)


Больше