Средняя стоимость биткоина в долларах на основе диапазонов BEAM

Автор:Чао Чжан, Дата: 2024-02-18 15:40:42
Тэги:

img

Обзор

Эта стратегия основана на теории уровня риска Бена Коуэна и направлена на реализацию аналогичного подхода с использованием уровней диапазона BEAM. Верхний уровень BEAM представляет собой скользящую среднюю за 200 недель после принятия логарифма, а нижний уровень представляет собой саму скользящую среднюю за 200 недель. Это дает нам диапазон от 0 до 1.

Логика стратегии

Стратегия в основном основана на теории диапазона BEAM, предложенной Беном Коуэном. Согласно изменениям цены BTC, цена может быть разделена на 10 зон между 0 и 1, представляющих 10 различных уровней риска. Уровень 0 представляет собой самый низкий риск с ценой, близкой к 200-недельной скользящей средней. Уровень 5 представляет собой область среднего риска. Уровень 10 представляет собой самый высокий риск с ценой, приближающейся к верхней рельсе.

Когда цена падает до минимумов, стратегия будет постепенно увеличивать длинную позицию. В частности, если цена находится между диапазонами 0 и 0,5, заказы на покупку будут выдаваться в определенный день каждый месяц. Сумма покупки будет постепенно увеличиваться по мере снижения числа диапазонов. Например, с диапазоном 5 сумма покупки составляет 20% от общего месячного объема DCA. С диапазоном 1 сумма покупки увеличивается до 100% от общего месячного объема DCA.

Когда цены поднимаются до максимумов, стратегия постепенно уменьшает свою позицию. В частности, если цена превышает диапазон 0,5, ордера на продажу будут выдаваться пропорционально. Позиция продажи будет постепенно увеличиваться по мере увеличения числа диапазонов. Например, с диапазоном 6, будет продано 6,67%. С диапазоном 10 все позиции будут проданы.

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

Наибольшее преимущество этой стратегии DCA BEAM заключается в том, что она полностью использует характеристики волатильности торговли BTC путем рыбалки на дне, когда цены падают до самого низкого уровня, и получения прибыли, когда цены поднимаются до пиков.

  1. использовать теорию BEAM для оценки недооценки активов и научного избегания рисков;
  2. в полной мере использовать характеристики волатильности BTC для получения наилучших возможностей покупки и продажи;
  3. Принять метод средних затрат для эффективного контроля инвестиционных затрат и получения долгосрочной стабильной доходности;
  4. автоматическое выполнение сделок купли-продажи без ручного вмешательства для снижения операционных рисков;
  5. Настраиваемые параметры позволяют гибко адаптировать стратегии к изменениям на рынке;

Короче говоря, это сложная стратегия настройки параметров, которая может генерировать долгосрочную стабильную прибыль в условиях колебаний на рынке BTC.

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

Хотя стратегия DCA в диапазоне BEAM имеет много преимуществ, все же существуют некоторые потенциальные риски, о которых следует знать.

  1. Теория BEAM и параметры настройки основаны на субъективных суждениях, которые имеют некоторую вероятность ошибочного суждения;
  2. Тенденции BTC трудно предсказать и существует риск потерь;
  3. На автоматическую торговлю могут негативно повлиять сбои системы и взлом параметров;
  4. Чрезмерные колебания могут привести к увеличению потерь.

Для смягчения рисков могут быть приняты следующие меры:

  1. Оптимизировать параметры для улучшения точности теоретических суждений BEAM;
  2. Соответственно уменьшить размер позиции для уменьшения суммы единого убытка;
  3. Увеличение возможностей избыточности и отказоустойчивости для снижения операционных рисков для автоматизированной торговли;
  4. Установите точки остановки потери, чтобы избежать чрезмерно больших одиночных потерь.

Оптимизация

С учетом вышеуказанных рисков оптимизация этой стратегии может быть сосредоточена на:

  1. Оптимизация теоретических параметров BEAM: корректировка параметров логарифма, цикла обратных испытаний и т.д. для повышения точности модели;
  2. Оптимизировать контроль позиций: корректировать ежемесячную сумму DCA, коэффициенты покупки/продажи для контроля суммы единого убытка;
  3. Увеличить безопасность автоматизированной торговли: установить избыточные серверы, локальную обработку и т. д., чтобы улучшить отказоустойчивость;
  4. Добавить модуль стоп-лосса: установить разумные точки стоп-лосса на основе исторической волатильности для эффективного контроля потерь.

Благодаря этим мерам можно значительно улучшить стабильность и безопасность стратегии.

Заключение

Стратегия средних затрат BEAM-диапазона DCA является очень практичной количественной торговой стратегией. Она успешно использует теорию BEAM для руководства торговыми решениями, дополненную моделью средней стоимости для контроля за затратами на покупку. В то же время она уделяет внимание управлению рисками, устанавливая точки остановки потери, чтобы предотвратить расширение потерь. С оптимизацией параметров и модульными дополнениями эта стратегия может стать важным инструментом для количественной торговли для получения долгосрочной стабильной доходности с рынка 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)
// // ——————————————————————————————————————————————————————————————————————————— }

Больше