Стратегия усреднения стоимости BTCdollar на основе диапазона BEAM


Дата создания: 2024-02-18 15:40:42 Последнее изменение: 2024-02-18 15:40:42
Копировать: 4 Количество просмотров: 670
1
Подписаться
1617
Подписчики

Стратегия усреднения стоимости BTCdollar на основе диапазона BEAM

Обзор

Эта стратегия основана на теории уровней риска Бена Коуэна, целью которой является использование уровней 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, занижая позиции, когда цена BTC падает до низких уровней, и получая прибыль, когда цена поднимается до пиков. Такая практика не упускает никаких хороших возможностей для покупки или продажи. Конкретные преимущества можно обобщить следующим образом:

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

В целом, это тонкая стратегия регулирования параметров, которая позволяет получать долгосрочные стабильные доходы в условиях волатильности BTC.

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

Несмотря на все преимущества BEAM-диапазона DCA, существуют некоторые потенциальные риски, о которых следует быть начеку. Основные риски можно обобщить следующим образом:

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

Для снижения риска можно предпринять следующие меры:

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

Направление оптимизации

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

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

С помощью этих средств можно значительно повысить стабильность и безопасность стратегии.

Подвести итог

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

Исходный код стратегии
/*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)
// // ——————————————————————————————————————————————————————————————————————————— }