Coût moyen en dollars Bitcoin basé sur les bandes BEAM

Auteur:ChaoZhang est là., Date: 2024-02-18 15:40:42 Je vous en prie.
Les étiquettes:

img

Résumé

Cette stratégie est basée sur la théorie du niveau de risque de Ben Cowen et vise à mettre en œuvre une approche similaire en utilisant les niveaux de bande BEAM. Le niveau supérieur de BEAM est la moyenne mobile de 200 semaines après avoir pris le logarithme, et le niveau inférieur est la moyenne mobile de 200 semaines elle-même. Cela nous donne une plage de 0 à 1. Les ordres d'achat sont émis lorsque le prix est inférieur aux bandes de niveau 0,5, et les ordres de vente sont émis lorsqu'il est supérieur.

La logique de la stratégie

La stratégie repose principalement sur la théorie de la bande BEAM proposée par Ben Cowen. Selon les variations de prix de BTC, le prix peut être divisé en 10 zones comprises entre 0 et 1, représentant 10 niveaux de risque différents. Le niveau 0 représente le risque le plus bas avec un prix proche de la moyenne mobile de 200 semaines. Le niveau 5 représente la zone de valeur de risque moyen. Le niveau 10 représente le risque le plus élevé avec un prix approchant le rail supérieur.

Lorsque le prix tombe aux plus bas, la stratégie augmentera progressivement la position longue. Plus précisément, si le prix se situe entre les bandes 0 et 0,5, des ordres d'achat seront émis un jour fixe chaque mois. Le montant d'achat augmentera progressivement à mesure que le nombre de bandes diminuera. Par exemple, avec la bande 5, le montant d'achat est de 20% du total mensuel de DCA. Avec la bande 1, le montant d'achat augmente à 100% du total mensuel de DCA.

Lorsque les prix atteignent des sommets, la stratégie réduit progressivement sa position. Plus précisément, si le prix dépasse la bande 0,5, des ordres de vente seront émis proportionnellement. La position de vente augmentera progressivement à mesure que le nombre de bandes augmente. Par exemple, avec la bande 6, 6, 67% seront vendus. Avec la bande 10, toutes les positions seront vendues.

Analyse des avantages

Le plus grand avantage de cette stratégie BEAM Band DCA est qu'elle utilise pleinement les caractéristiques de volatilité du trading de BTC en pêchant au fond lorsque les prix tombent à leur plus bas et en tirant profit lorsque les prix atteignent leurs sommets.

  1. Utiliser la théorie BEAM pour juger de la sous-estimation des actifs et éviter scientifiquement les risques;
  2. Utiliser pleinement les caractéristiques de volatilité des BTC pour saisir les meilleures opportunités d'achat et de vente;
  3. Adopter la méthode de la moyenne des coûts pour contrôler efficacement les coûts d'investissement et obtenir des rendements stables à long terme;
  4. Exécuter automatiquement les transactions d'achat et de vente sans intervention manuelle afin de réduire les risques opérationnels;
  5. Les paramètres personnalisables permettent une adaptation flexible des stratégies pour s'adapter aux changements du marché;

En résumé, il s'agit d'une stratégie de réglage de paramètres sophistiquée qui peut générer des rendements stables à long terme dans des conditions de marché de BTC fluctuantes.

Analyse des risques

Bien que la stratégie DCA de la bande BEAM présente de nombreux avantages, certains risques potentiels doivent encore être pris en compte.

  1. La théorie et les paramètres du BEAM reposent sur des jugements subjectifs, qui présentent une certaine probabilité d'erreur de jugement;
  2. Les tendances des BTC sont difficiles à prévoir et il existe un risque de pertes;
  3. Le trading automatique peut être affecté par des pannes du système et le piratage de paramètres;
  4. Des fluctuations excessives peuvent entraîner des pertes accrues.

Pour atténuer les risques, les mesures suivantes peuvent être prises:

  1. Optimiser les paramètres afin d'améliorer la précision des jugements de la théorie du BEAM;
  2. Réduire de manière appropriée la taille de la position afin de réduire le montant de la perte unique;
  3. Améliorer les capacités de redondance et de tolérance aux pannes afin de réduire les risques opérationnels liés au trading automatisé;
  4. Définir des points d'arrêt des pertes pour éviter des pertes uniques trop importantes.

Optimisation

Compte tenu des risques susmentionnés, l'optimisation de cette stratégie peut se concentrer sur:

  1. Optimiser les paramètres de la théorie BEAM: ajuster les paramètres de log, le cycle de backtest, etc. pour améliorer la précision du modèle;
  2. Optimiser le contrôle des positions: ajuster le montant mensuel des DCA, les ratios achat/vente pour contrôler le montant des pertes uniques;
  3. Améliorer la sécurité des transactions automatisées: mettre en place des serveurs redondants, un traitement local, etc. pour améliorer la tolérance aux erreurs;
  4. Ajouter un module stop loss: définir des points de stop loss raisonnables basés sur la volatilité historique pour contrôler efficacement les pertes.

Ces mesures permettront d'améliorer considérablement la stabilité et la sécurité de la stratégie.

Conclusion

La stratégie de coût moyen de la bande BEAM DCA est une stratégie de trading quantitative très pratique. Elle exploite avec succès la théorie BEAM pour guider les décisions de trading, complétée par un modèle de moyenne de coût pour contrôler les coûts d'achat. En même temps, elle accorde une attention à la gestion des risques en définissant des points de stop loss pour empêcher l'expansion des pertes. Avec l'optimisation des paramètres et des ajouts modulaires, cette stratégie peut devenir un outil important pour le trading quantitatif afin d'obtenir des rendements stables à long terme du marché BTC.


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

Plus de