Stratégie de prix par volume relatif

Auteur:ChaoZhang est là., Date: 2023-12-28 17:54:44 Je suis désolé
Les étiquettes:

img

Résumé

La stratégie de prix du volume relatif est une stratégie de trading quantitative basée sur le volume de trading anormal et la volatilité des prix. Cette stratégie compare le volume de trading actuel avec la moyenne historique pour déterminer si le volume de trading est anormal. Elle combine également l'intervalle de plage moyenne vraie pour déterminer si le prix est relativement stable.

Principe de stratégie

La logique de base de la stratégie relative des prix par volume repose sur deux indicateurs de jugement: le volume relatif des transactions et la fourchette de fluctuation des prix.

Tout d'abord, nous calculons la moyenne mobile simple du volume des transactions au cours des 20 périodes les plus récentes en tant que volume moyen historique des transactions. Ensuite, nous définissons un paramètre multiple (comme 1,5 fois). Lorsque le volume des transactions actuel est supérieur à 1,5 fois le volume des transactions moyen, nous considérons que le volume des transactions est anormal et appartient à une situation de volume relatif.

Deuxièmement, nous calculons la fourchette moyenne réelle (ATR) sur les 14 périodes les plus récentes comme mesure de la volatilité des prix. En même temps, nous calculons l'écart type de la volatilité moyenne. Si la volatilité réelle actuelle est entre la moyenne plus ou moins un écart type, nous considérons que la fluctuation des prix est dans une fourchette relativement stable.

Lorsque les deux conditions ci-dessus sont remplies en même temps, un signal long est émis pour ouvrir une position longue. Pendant la période de détention, deux fois l'ATR est utilisé comme niveau de stop loss, et le prix le plus élevé moins deux fois l'ATR est utilisé comme niveau de prise de profit.

Analyse des avantages

L'avantage le plus important de la stratégie de prix du volume relatif est qu'elle capte les tendances des prix provoquées par un volume de négociation anormal. Lorsque le volume de négociation augmente, cela représente un changement d'attitude des participants au marché, ce qui indique souvent des écarts de prix et la formation de nouvelles tendances. En comparant la relation entre le volume de négociation et les moyennes historiques, la stratégie peut déterminer efficacement le moment du volume de négociation anormal.

D'autre part, la stratégie prend également en compte le taux de volatilité, de sorte que les signaux se produisent pendant des périodes de prix relativement stables. Cela évite l'énorme risque de perte causé par la poursuite de sommets lors de fluctuations violentes. Il augmente également les opportunités de profit car les tendances commencent généralement à se détériorer après une stabilité relative.

Analyse des risques

Le plus grand risque de cette stratégie est que l'indicateur de volume de négociation ne peut pas être sûr à 100% des nouvelles tendances.

Pour réduire les pertes, ajuster de manière appropriée les paramètres du "volume relatif" et fixer des critères plus stricts pour juger du volume anormal des transactions ou ajouter d'autres indicateurs de jugement, tels que l'analyse de l'augmentation du volume des transactions pour voir si elle correspond à l'augmentation du chiffre d'affaires.

Directions d'optimisation

La stratégie peut être optimisée dans les aspects suivants:

  1. Ajouter d'autres indicateurs de jugement, tels que le taux de variation, le chiffre d'affaires, etc., pour rendre les signaux de volume de négociation anormaux plus fiables.

  2. Le paramètre ATR peut être optimisé pour différents stocks afin de déterminer plus précisément la fourchette de prix stable.

  3. Ajoutez des algorithmes d'apprentissage automatique pour juger activement le volume de trading anormal, pas seulement une simple comparaison avec les moyennes historiques.

  4. Utilisez des modèles d'apprentissage profond pour prédire la volatilité des prix, pas seulement basé sur l'ATR historique.

Conclusion

La stratégie de prix de volume relatif capture le volume de négociation anormal comme un signal caractéristique et combine le jugement de stabilité des prix pour émettre des signaux de négociation.


/*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)


Plus de