Promedio del costo del dólar de Bitcoin basado en bandas BEAM

El autor:¿ Qué pasa?, Fecha: 2024-02-18 15:40:42
Las etiquetas:

img

Resumen general

Esta estrategia se basa en la teoría del nivel de riesgo de Ben Cowen y tiene como objetivo implementar un enfoque similar utilizando los niveles de banda BEAM. El nivel superior de BEAM es el promedio móvil de 200 semanas después de tomar el logaritmo, y el nivel inferior es el promedio móvil de 200 semanas en sí. Esto nos da un rango de 0 a 1.

Estrategia lógica

La estrategia se basa principalmente en la teoría de la banda BEAM propuesta por Ben Cowen. De acuerdo con los cambios de precio de BTC, el precio se puede dividir en 10 áreas entre 0 y 1, que representan 10 niveles diferentes de riesgo. El nivel 0 representa el riesgo más bajo con el precio cercano al promedio móvil de 200 semanas. El nivel 5 representa el área de valor de riesgo medio. El nivel 10 representa el riesgo más alto con el precio acercándose al rieles superior.

Cuando el precio cae a los mínimos, la estrategia aumentará gradualmente la posición larga. Específicamente, si el precio está entre las bandas 0 y 0.5, se emitirán órdenes de compra en un día determinado cada mes. La cantidad de compra aumentará gradualmente a medida que el número de bandas disminuye. Por ejemplo, con la banda 5, la cantidad de compra es del 20% del total mensual de DCA. Con la banda 1, la cantidad de compra aumenta al 100% del total mensual de DCA.

Cuando los precios se elevan a máximos, la estrategia reducirá gradualmente su posición. Específicamente, si el precio excede la banda 0.5, se emitirán órdenes de venta proporcionalmente. La posición de venta aumentará gradualmente a medida que aumente el número de bandas. Por ejemplo, con la banda 6, se venderá el 6.67%. Con la banda 10, todas las posiciones se venderán.

Análisis de ventajas

La mayor ventaja de esta estrategia DCA de banda BEAM es que utiliza plenamente las características de volatilidad del comercio de BTC al pescar en el fondo cuando los precios caen a su nivel más bajo y obtener ganancias cuando los precios aumentan a sus picos.

  1. utilizar la teoría BEAM para juzgar la subestimación de los activos y evitar los riesgos científicamente;
  2. hacer pleno uso de las características de volatilidad del BTC para aprovechar las mejores oportunidades de compra y venta;
  3. Adoptar el método de mediación de costes para controlar eficazmente los costes de inversión y obtener rendimientos estables a largo plazo;
  4. Ejecutar automáticamente las operaciones de compra y venta sin intervención manual para reducir los riesgos operativos;
  5. Los parámetros personalizables permiten un ajuste flexible de las estrategias para adaptarse a los cambios del mercado;

En resumen, esta es una estrategia de ajuste de parámetros sofisticada que puede generar retornos constantes a largo plazo en condiciones fluctuantes del mercado de BTC.

Análisis de riesgos

Si bien la estrategia DCA de banda BEAM tiene muchas ventajas, todavía hay algunos riesgos potenciales que deben ser conocidos.

  1. La teoría del BEAM y la configuración de los parámetros se basan en juicios subjetivos, que tienen cierta probabilidad de error de juicio;
  2. Las tendencias del BTC son difíciles de predecir y existe el riesgo de pérdidas;
  3. La negociación automática puede verse afectada negativamente por fallos del sistema y piratería de parámetros;
  4. Las fluctuaciones excesivas pueden dar lugar a pérdidas ampliadas.

Para mitigar los riesgos, pueden adoptarse las siguientes medidas:

  1. Optimizar la configuración de los parámetros para mejorar la precisión de los juicios de la teoría BEAM;
  2. Reducir adecuadamente el tamaño de la posición para disminuir el importe de la pérdida única;
  3. Aumentar las capacidades de redundancia y tolerancia a fallos para reducir los riesgos operativos de la negociación automatizada;
  4. Establezca puntos de stop loss para evitar pérdidas individuales excesivamente grandes.

Optimización

Teniendo en cuenta los riesgos anteriores, la optimización de esta estrategia puede centrarse en:

  1. Optimizar los parámetros de la teoría BEAM: ajustar los parámetros de registro, el ciclo de pruebas de retroceso, etc., para mejorar la precisión del modelo;
  2. Optimizar el control de las posiciones: ajustar el importe mensual de DCA, las relaciones compra/venta para controlar el importe de la pérdida única;
  3. Aumentar la seguridad de las operaciones automatizadas: establecer servidores redundantes, procesamiento local, etc. para mejorar la tolerancia a fallos;
  4. Añadir un módulo de detención de pérdidas: establecer puntos de detención de pérdidas razonables basados en la volatilidad histórica para controlar eficazmente las pérdidas.

A través de estas medidas, la estabilidad y la seguridad de la estrategia pueden mejorarse considerablemente.

Conclusión

La estrategia de costo promedio DCA de la banda BEAM es una estrategia comercial cuantitativa muy práctica. Aprovecha con éxito la teoría BEAM para guiar las decisiones comerciales, complementada por un modelo de promedio de costos para controlar los costos de compra. Al mismo tiempo, presta atención a la gestión de riesgos estableciendo puntos de stop loss para evitar la expansión de las pérdidas. Con la optimización de parámetros y adiciones modulares, esta estrategia puede convertirse en una herramienta importante para el comercio cuantitativo para obtener rendimientos constantes a largo plazo del mercado BTC. Merece más investigación y aplicación por parte de los profesionales del comercio cuantitativo.


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

Más.