Stratégie de moyenne des coûts du BTCdollar basée sur la bande BEAM


Date de création: 2024-02-18 15:40:42 Dernière modification: 2024-02-18 15:40:42
Copier: 4 Nombre de clics: 670
1
Suivre
1617
Abonnés

Stratégie de moyenne des coûts du BTCdollar basée sur la bande BEAM

Aperçu

Cette stratégie, basée sur la théorie des niveaux de risque de Ben Cowen, vise à utiliser les niveaux de la bande BEAM pour réaliser une approche similaire. La limite supérieure de la bande BEAM est la moyenne mobile à 200 semaines après la prise de l’analogie, et la limite inférieure est la moyenne mobile à 200 semaines elle-même. Cela nous donne une portée de 0 à 1.

Principe de stratégie

La stratégie s’appuie principalement sur la théorie des bandes BEAM de Ben Cowen. Selon les variations de prix de la BTC, le prix peut être divisé en 10 zones comprises entre 0 et 1, qui représentent 10 niveaux de risque différents. Le niveau 0 représente le prix proche de la moyenne mobile sur 200 semaines, le moins risqué; le niveau 5 représente le prix dans la zone moyenne; le niveau 10 représente le prix proche de la trajectoire, le plus risqué.

La stratégie augmente progressivement la position d’achat lorsque le prix descend à un niveau bas. Plus précisément, si le prix se trouve dans la plage 0 à 0,5, un ordre d’achat est émis un jour du mois spécifié par la stratégie, et le montant de l’achat augmente progressivement avec la diminution du nombre de la plage. Par exemple, pour la vague 5, l’achat est de 20% du total des DCA du mois; pour la vague 1, l’achat est augmenté à 100% du total des DCA du mois.

Cette stratégie consiste à réduire progressivement la position lorsque le prix atteint un niveau élevé. En particulier, si le prix dépasse 0,5 bandes, un ordre de vente proportionnel est émis, et la position vendue augmente progressivement avec l’augmentation du nombre de bandes. Par exemple, lorsque la bande 6 est vendue à 6,67%; lorsque la bande 10 est vendue, toutes les positions sont vendues.

Analyse des avantages

Le plus grand avantage de cette stratégie de coût moyen de la DCA sur les ondes BEAM est qu’elle exploite pleinement les caractéristiques des transactions sur la volatilité de la BTC, en déposant des fonds lorsque le prix de la BTC tombe à des basses et en tirant des bénéfices lorsque le prix grimpe à des sommets. Cette pratique ne manque aucune opportunité d’achat ou de vente. Les avantages spécifiques peuvent être résumés comme suit:

  1. L’utilisation de la théorie BEAM pour évaluer les sous-évaluations des actifs et éviter les risques scientifiques;
  2. L’objectif est d’utiliser les caractéristiques de volatilité de la BTC pour saisir les meilleures opportunités d’achat et de vente avec une précision inégalée.
  3. L’adoption d’une approche de la moyenne des coûts permettant de contrôler efficacement les coûts d’investissement et d’obtenir des rendements stables à long terme;
  4. L’exécution automatique des transactions de vente et d’achat, sans intervention humaine, réduit le risque opérationnel;
  5. Paramètres personnalisables, stratégie d’adaptation flexible pour s’adapter aux changements du marché.

Dans l’ensemble, il s’agit d’une stratégie de régulation de paramètres sophistiquée qui permet d’obtenir des gains stables à long terme dans des conditions de volatilité de la BTC.

Analyse des risques

Bien que la stratégie BEAM Band DCA présente de nombreux avantages, il existe des risques potentiels à surveiller. Les principaux risques peuvent être résumés comme suit:

  1. La théorie et les paramètres de BEAM reposent sur des jugements subjectifs, avec une probabilité d’erreur;
  2. La tendance de la BTC est difficile à prédire et il y a un risque de pertes et de pertes.
  3. Les transactions automatisées sont vulnérables aux défaillances du système et au piratage de paramètres.
  4. Une fluctuation excessive peut entraîner des pertes importantes.

Les mesures suivantes peuvent être prises pour réduire le risque:

  1. Optimiser la définition des paramètres pour améliorer la précision des jugements théoriques BEAM;
  2. réduire de manière appropriée la taille des positions et le montant des pertes ponctuelles;
  3. Augmentation de la redondance et de la tolérance aux erreurs et réduction des risques liés aux opérations automatisées;
  4. Il est important de définir un point de rupture pour éviter des pertes monétaires excessives.

Direction d’optimisation

Compte tenu de ces points de risque, la stratégie peut être optimisée principalement dans les domaines suivants:

  1. Optimiser les paramètres de la théorie BEAM: ajuster les paramètres de la méthode log, les cycles de rétroaction, etc., pour améliorer l’exactitude des jugements du modèle;
  2. Optimisation du contrôle des positions: ajustement du montant total des DCA mensuels, du pourcentage d’achat et de vente, etc., afin de maîtriser le risque de perte unique;
  3. L’ajout d’un module de sécurité pour les transactions automatisées: mise en place de serveurs redondants, traitement local, etc. pour améliorer la tolérance aux erreurs;
  4. Module de stop-loss supplémentaire: paramétrez un point de stop-loss raisonnable en fonction des fluctuations historiques pour contrôler efficacement les pertes.

Ces moyens permettent d’améliorer considérablement la stabilité et la sécurité de la stratégie.

Résumer

La stratégie de coût moyen DCA de la bande BEAM est une stratégie de quantification qui a une grande valeur de combat. Elle utilise avec succès la théorie BEAM pour guider les décisions de négociation et est complétée par un modèle de coût moyen pour contrôler les coûts d’achat. En même temps, elle fait attention à la gestion des risques et à la mise en place de points de rupture pour éviter l’expansion des pertes.

Code source de la stratégie
/*backtest
start: 2023-02-11 00:00:00
end: 2024-02-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// © gjfsdrtytru - BEAM DCA Strategy {
// Based on Ben Cowen's risk level strategy, this aims to copy that method but with BEAM band levels.
// Upper BEAM level is derived from ln(price/200W MA)/2.5, while the 200W MA is the floor price. This is our 0-1 range. 
// Buy limit orders are set at the < 0.5 levels and sell orders are set at the > 0.5 level.
//@version=5
strategy(
  title                 = "BEAM DCA Strategy Monthly", 
  shorttitle            = "BEAM DCA M",
  overlay               = true,
  pyramiding            = 500,
  default_qty_type      = strategy.percent_of_equity,
  default_qty_value     = 0,
  initial_capital       = 0) //}

// Inputs { ————————————————————————————————————————————————————————————————————
T_ceiling   = input.string("Off", "Diminishing Returns", ["Off","Linear","Parabolic"], "Account for diminishing returns as time increases")
day         = input.int(1, "DCA Day of Month",1,28,1,"Select day of month for buy orders.")
DCAamount   = input.int(1000,"DCA Amount",400,tooltip="Enter the maximum amount you'd be willing to DCA for any given month.")
T_buy       = input(true,"Buy Orders","Toggle buy orders.")
T_sell      = input(true,"Sell Orders","Toggle sell orders.")

// Time period
testStartYear   = input.int(2018,   title="Backtest Start Year",    minval=2010,maxval=2100,group="Backtest Period")
testStartMonth  = input.int(1,      title="Backtest Start Month",   minval=1,   maxval=12,  group="Backtest Period")
testStartDay    = input.int(1,      title="Backtest Start Day",     minval=1,   maxval=31,  group="Backtest Period")
testPeriodLen   = input.int(9999,   title="Backtest Period (days)", minval=1,               group="Backtest Period",tooltip="Days until strategy ends") * 86400000 // convert days into UNIX time
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testPeriodStop  = testPeriodStart + testPeriodLen
testPeriod() => true
// ——————————————————————————————————————————————————————————————————————————— }
// Diminishing Returns { ———————————————————————————————————————————————————————
x = bar_index + 1
assetDivisor= 2.5
switch
    T_ceiling == "Linear"   => assetDivisor:= 3.50542 - 0.000277696 * x
    T_ceiling == "Parabolic"=> assetDivisor:= -0.0000001058992338 * math.pow(x,2) + 0.000120729 * x + 3.1982
// ——————————————————————————————————————————————————————————————————————————— }
// Risk Levels { ———————————————————————————————————————————————————————————————
cycleLen = 1400
getMaLen() =>
    if bar_index < cycleLen
        bar_index + 1
    else
        cycleLen

// Define Risk Bands
price       = close
riskLow     = ta.sma(price,getMaLen())
risk1       = riskLow * math.exp((assetDivisor)*0.1)
risk2       = riskLow * math.exp((assetDivisor)*0.2)
risk3       = riskLow * math.exp((assetDivisor)*0.3)
risk4       = riskLow * math.exp((assetDivisor)*0.4)
risk5       = riskLow * math.exp((assetDivisor)*0.5)
risk6       = riskLow * math.exp((assetDivisor)*0.6)
risk7       = riskLow * math.exp((assetDivisor)*0.7)
risk8       = riskLow * math.exp((assetDivisor)*0.8)
risk9       = riskLow * math.exp((assetDivisor)*0.9)
riskHigh    = riskLow * math.exp((assetDivisor))

// Plot Risk Bands
p_low       = plot(riskLow,   "Beam Risk 0.0",color.new(#0042F0,50),3,editable=false)
p_band1     = plot(risk1,     "Beam Risk 0.1",color.new(#0090F5,20),1,editable=false)
p_band2     = plot(risk2,     "Beam Risk 0.2",color.new(#00C6DB,20),1,editable=false)
p_band3     = plot(risk3,     "Beam Risk 0.3",color.new(#00F5BD,20),1,editable=false)
p_band4     = plot(risk4,     "Beam Risk 0.4",color.new(#00F069,20),1,editable=false)
p_band5     = plot(risk5,     "Beam Risk 0.5",color.new(#00DB08,50),3,editable=false)
p_band6     = plot(risk6,     "Beam Risk 0.6",color.new(#E8D20C,20),1,editable=false)
p_band7     = plot(risk7,     "Beam Risk 0.7",color.new(#F2B40C,20),1,editable=false)
p_band8     = plot(risk8,     "Beam Risk 0.8",color.new(#DC7A00,20),1,editable=false)
p_band9     = plot(risk9,     "Beam Risk 0.9",color.new(#F2520C,20),1,editable=false)
p_band10    = plot(riskHigh,  "Beam Risk 1.0",color.new(#F01102,50),3,editable=false)
// ——————————————————————————————————————————————————————————————————————————— }
// Order Execution { ———————————————————————————————————————————————————————————
band5   = price<risk5 and price>risk4
band4   = price<risk4 and price>risk3
band3   = price<risk3 and price>risk2
band2   = price<risk2 and price>risk1
band1   = price<risk1

// DCA buy order weights
y       = DCAamount / 5
switch
    band5 => y:= y * 1
    band4 => y:= y * 2
    band3 => y:= y * 3
    band2 => y:= y * 4
    band1 => y:= y * 5

// Contracts per order
contracts =(y/price)

if testPeriod()
// Buy orders
    if T_buy == true
        if dayofmonth == day
            strategy.entry("Risk Band 5",strategy.long,qty=contracts,when=band5)
            strategy.entry("Risk Band 4",strategy.long,qty=contracts,when=band4)
            strategy.entry("Risk Band 3",strategy.long,qty=contracts,when=band3)
            strategy.entry("Risk Band 2",strategy.long,qty=contracts,when=band2)
            strategy.entry("Risk Band 1",strategy.long,qty=contracts,when=band1)
// Sell orders 
    if T_sell == true
        if strategy.opentrades > 5
            strategy.exit("Risk Band 6",qty_percent=6.67,limit=risk6) 
            strategy.exit("Risk Band 7",qty_percent=14.28,limit=risk7)
            strategy.exit("Risk Band 8",qty_percent=25.00,limit=risk8)
            strategy.exit("Risk Band 9",qty_percent=44.44,limit=risk9)
            strategy.exit("Risk Band 10",qty_percent=100,limit=riskHigh)
// ——————————————————————————————————————————————————————————————————————————— }
// Info { ——————————————————————————————————————————————————————————————————————

// Line plot of avg. entry price
plot(strategy.position_size > 0 ? strategy.position_avg_price : na,"Average Entry",color.red,trackprice=true,editable=false)

// Unrealised PNL
uPNL = price/strategy.position_avg_price

// Realised PNL
realPNL = 0.
for i = 0 to strategy.closedtrades-1
    realPNL += strategy.closedtrades.profit(i)

// Size of open position in ($)
openPosSize = 0.
for i = 0 to strategy.opentrades-1
    openPosSize += strategy.opentrades.size(i) * strategy.position_avg_price

// Size of closed position in ($)
closePosSize = 0.
if strategy.closedtrades > 0
    for i = 0 to strategy.closedtrades-1
        closePosSize += strategy.closedtrades.size(i) * strategy.closedtrades.entry_price(i)

invested    = openPosSize+closePosSize                              // Total capital ($) put into strategy
equity      = openPosSize+closePosSize+strategy.openprofit+realPNL  // Total current equity ($) in strategy (counting realised PNL)
ROI         = (equity-invested) / invested * 100                    // ROI of strategy (compare capital invested to excess return)

// // Info Table
// var table table1 = table.new(position.bottom_right,2,9,color.black,color.gray,1,color.gray,2)

// table.cell(table1,0,0,"Capital Invested",   text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,1,"Open Position",      text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,2,"Average Entry",      text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,3,"Last Price",         text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,4,"Open PNL (%)",       text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,5,"Open PNL ($)",       text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,6,"Realised PNL ($)",   text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,7,"Total Equity",       text_color=color.white,text_halign=text.align_right)
// table.cell(table1,0,8,"Strategy ROI",       text_color=color.white,text_halign=text.align_right)

// table.cell(table1,1,0,"$" + str.tostring(invested,                      "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,1,"$" + str.tostring(openPosSize,                   "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,2,"$" + str.tostring(strategy.position_avg_price,   "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,3,"$" + str.tostring(price,                         "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,4,      str.tostring((uPNL-1)*100,                  "#,###.00") + "%",text_halign=text.align_right,text_color = uPNL > 1 ? color.lime : color.red)
// table.cell(table1,1,5,"$" + str.tostring(strategy.openprofit,           "#,###.00"),      text_halign=text.align_right,text_color = uPNL > 1 ? color.lime : color.red)
// table.cell(table1,1,6,"$" + str.tostring(realPNL,                       "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,7,"$" + str.tostring(equity,                        "#,###.00"),      text_halign=text.align_right,text_color = color.white)
// table.cell(table1,1,8,      str.tostring(ROI,                           "#,###.00") + "%",text_halign=text.align_right,text_color = ROI > 1 ? color.lime : color.red)
// // ——————————————————————————————————————————————————————————————————————————— }