বিটকয়েন ডলার ব্যয়ের গড় বেম ব্যান্ডের ভিত্তিতে

লেখক:চাওঝাং, তারিখঃ ২০২৪-০২-১৮ ১৫ঃ৪০ঃ৪২
ট্যাগঃ

img

সারসংক্ষেপ

এই কৌশলটি বেন কাউয়েনের ঝুঁকি স্তরের তত্ত্বের উপর ভিত্তি করে এবং বিইএএম ব্যান্ড স্তর ব্যবহার করে অনুরূপ পদ্ধতি বাস্তবায়ন করার লক্ষ্যে। উপরের বিইএএম স্তরটি লগারিদম গ্রহণের পরে 200-সপ্তাহের চলমান গড় এবং নিম্ন স্তরটি 200-সপ্তাহের চলমান গড়। এটি আমাদের 0 থেকে 1 এর মধ্যে একটি পরিসীমা দেয়। যখন দাম 0.5 স্তরের ব্যান্ডের নীচে থাকে তখন ক্রয় অর্ডার জারি করা হয় এবং বিক্রয় অর্ডার জারি করা হয় যখন উপরে থাকে।

কৌশলগত যুক্তি

কৌশলটি মূলত বেন কাউয়েনের প্রস্তাবিত বিইএএম ব্যান্ড তত্ত্বের উপর নির্ভর করে। বিটিসি এর দামের পরিবর্তন অনুসারে, দামটি 0 থেকে 1 এর মধ্যে 10 টি অঞ্চলে বিভক্ত করা যেতে পারে, যা ঝুঁকির 10 টি বিভিন্ন স্তরের প্রতিনিধিত্ব করে। স্তর 0 200-সপ্তাহের চলমান গড়ের কাছাকাছি দামের সাথে সর্বনিম্ন ঝুঁকির প্রতিনিধিত্ব করে। স্তর 5 মধ্যম-ঝুঁকিপূর্ণ মানের অঞ্চলকে উপস্থাপন করে। স্তর 10 উপরের রেলের কাছাকাছি দামের সাথে সর্বোচ্চ ঝুঁকি উপস্থাপন করে।

যখন দাম সর্বনিম্ন হয়, তখন কৌশলটি ধীরে ধীরে লং পজিশন বাড়িয়ে তুলবে। বিশেষত, যদি দাম 0 এবং 0.5 ব্যান্ডের মধ্যে থাকে, তবে প্রতি মাসে একটি নির্দিষ্ট দিনে ক্রয় অর্ডার জারি করা হবে। ব্যান্ডের সংখ্যা হ্রাস পাওয়ার সাথে সাথে ক্রয় পরিমাণ ধীরে ধীরে বৃদ্ধি পাবে। উদাহরণস্বরূপ, ব্যান্ড 5 এর সাথে ক্রয় পরিমাণ মাসিক ডিসিএ মোটের 20%। ব্যান্ড 1 এর সাথে, ক্রয় পরিমাণ মাসিক ডিসিএ মোটের 100% পর্যন্ত বৃদ্ধি পায়।

যখন দাম সর্বোচ্চ হয়, তখন কৌশলটি ধীরে ধীরে তার অবস্থান হ্রাস করবে। বিশেষত, যদি দামটি ব্যাণ্ড 0.5 অতিক্রম করে, বিক্রয় আদেশগুলি আনুপাতিকভাবে জারি করা হবে। ব্যান্ডের সংখ্যা বাড়ার সাথে সাথে বিক্রয় অবস্থান ধীরে ধীরে বৃদ্ধি পাবে। উদাহরণস্বরূপ, ব্যান্ড 6 এর সাথে 6.67% বিক্রি হবে। ব্যান্ড 10 এর সাথে, সমস্ত অবস্থান বিক্রি হবে।

সুবিধা বিশ্লেষণ

এই বিইএএম ব্যান্ড ডিসিএ কৌশলটির সবচেয়ে বড় সুবিধা হ'ল এটি যখন দামগুলি তাদের সর্বনিম্নে পড়ে এবং যখন দামগুলি তাদের শীর্ষে উঠে যায় তখন মুনাফা গ্রহণ করে বিটিসি ট্রেডিংয়ের অস্থিরতার বৈশিষ্ট্যগুলি পুরোপুরি ব্যবহার করে। এই পদ্ধতিটি কোনও কেনা বা বিক্রয় সুযোগ মিস করবে না। নির্দিষ্ট সুবিধাগুলি নিম্নরূপ সংক্ষিপ্ত করা যেতে পারেঃ

  1. বিইএএম তত্ত্ব ব্যবহার করে সম্পদের অবমূল্যায়ন বিচার করা এবং বৈজ্ঞানিকভাবে ঝুঁকি এড়ানো।
  2. বিটিসির অস্থিরতার বৈশিষ্ট্যগুলি সর্বোত্তম ক্রয় এবং বিক্রয় সুযোগগুলি ধরার জন্য সম্পূর্ণরূপে ব্যবহার করুন;
  3. বিনিয়োগের খরচ কার্যকরভাবে নিয়ন্ত্রণ এবং দীর্ঘমেয়াদী স্থিতিশীল আয় অর্জনের জন্য ব্যয় গড় পদ্ধতি গ্রহণ করা।
  4. অপারেশনাল ঝুঁকি কমাতে ম্যানুয়াল হস্তক্ষেপ ছাড়াই ক্রয় ও বিক্রয় লেনদেন স্বয়ংক্রিয়ভাবে সম্পাদন করা।
  5. কাস্টমাইজযোগ্য প্যারামিটারগুলি বাজারের পরিবর্তনের সাথে মানিয়ে নিতে কৌশলগুলির নমনীয় সমন্বয়কে অনুমতি দেয়;

সংক্ষেপে, এটি একটি পরিশীলিত প্যারামিটার টিউনিং কৌশল যা বিটিসি বাজারের পরিবর্তনশীল অবস্থার মধ্যে দীর্ঘমেয়াদী স্থিতিশীল রিটার্ন তৈরি করতে পারে।

ঝুঁকি বিশ্লেষণ

যদিও BEAM ব্যান্ড DCA কৌশলটির অনেক সুবিধা রয়েছে, তবুও কিছু সম্ভাব্য ঝুঁকি সম্পর্কে সচেতন হতে হবে। প্রধান ঝুঁকি পয়েন্টগুলি নিম্নরূপ সংক্ষিপ্ত করা যেতে পারেঃ

  1. বিইএএম তত্ত্ব এবং পরামিতি সেটিংগুলি স্বতন্ত্র বিচারের উপর নির্ভর করে, যা ভুল বিচারের কিছু সম্ভাবনা রয়েছে;
  2. বিটিসির প্রবণতা ভবিষ্যদ্বাণী করা কঠিন এবং ক্ষতির ঝুঁকি রয়েছে;
  3. স্বয়ংক্রিয় ট্রেডিং সিস্টেমের ব্যর্থতা এবং প্যারামিটার হ্যাকিং দ্বারা প্রতিকূল প্রভাবিত হতে পারে;
  4. অত্যধিক ওঠানামা ক্ষতির দিকে পরিচালিত করতে পারে।

ঝুঁকি কমাতে, নিম্নলিখিত ব্যবস্থা গ্রহণ করা যেতে পারেঃ

  1. বিইএএম তত্ত্বের বিচারের নির্ভুলতা উন্নত করার জন্য পরামিতি সেটিংগুলি অপ্টিমাইজ করুন;
  2. একক ক্ষতির পরিমাণ কমাতে পজিশনের আকার যথাযথভাবে কমাতে হবে;
  3. স্বয়ংক্রিয় ট্রেডিংয়ের জন্য অপারেশনাল ঝুঁকি কমাতে পুনঃব্যবহারযোগ্যতা এবং ত্রুটি সহনশীলতার ক্ষমতা বৃদ্ধি করা।
  4. অতিরিক্ত বড় একক ক্ষতি এড়াতে স্টপ লস পয়েন্ট সেট করুন।

অপ্টিমাইজেশন

উপরোক্ত ঝুঁকিগুলি বিবেচনা করে, এই কৌশলটির অপ্টিমাইজেশান নিম্নলিখিত বিষয়গুলির উপর দৃষ্টি নিবদ্ধ করতে পারেঃ

  1. BEAM তত্ত্বের পরামিতিগুলি অপ্টিমাইজ করুনঃ মডেলের নির্ভুলতা উন্নত করতে লগ পরামিতি, ব্যাকটেস্ট চক্র ইত্যাদি সামঞ্জস্য করুন;
  2. পজিশন কন্ট্রোলের অপ্টিমাইজেশনঃ একক ক্ষতির পরিমাণ নিয়ন্ত্রণের জন্য মাসিক ডিসিএ পরিমাণ, ক্রয় / বিক্রয় অনুপাতগুলি সামঞ্জস্য করুন;
  3. স্বয়ংক্রিয় ট্রেডিং নিরাপত্তা বৃদ্ধিঃ ত্রুটি সহনশীলতা উন্নত করতে অতিরিক্ত সার্ভার, স্থানীয় প্রসেসিং ইত্যাদি সেট করুন;
  4. স্টপ লস মডিউল যোগ করুনঃ ক্ষতি কার্যকরভাবে নিয়ন্ত্রণ করার জন্য ঐতিহাসিক অস্থিরতার ভিত্তিতে যুক্তিসঙ্গত স্টপ লস পয়েন্ট সেট করুন।

এই পদক্ষেপের মাধ্যমে কৌশলটির স্থিতিশীলতা এবং নিরাপত্তা ব্যাপকভাবে উন্নত করা সম্ভব।

সিদ্ধান্ত

বিইএএম ব্যান্ড ডিসিএ গড় ব্যয়ের কৌশল একটি অত্যন্ত ব্যবহারিক পরিমাণগত ট্রেডিং কৌশল। এটি সফলভাবে বিইএএম তত্ত্বকে ট্রেডিং সিদ্ধান্তগুলি গাইড করার জন্য ব্যবহার করে, ক্রয় ব্যয় নিয়ন্ত্রণের জন্য একটি ব্যয় গড় মডেল দ্বারা পরিপূরক করে। একই সাথে, এটি ক্ষতির সম্প্রসারণ রোধ করতে স্টপ লস পয়েন্ট সেট করে ঝুঁকি ব্যবস্থাপনার দিকে মনোযোগ দেয়। পরামিতি অপ্টিমাইজেশন এবং মডুলার সংযোজনগুলির সাথে, এই কৌশলটি বিটিসি বাজার থেকে দীর্ঘমেয়াদী স্থিতিশীল রিটার্ন অর্জনের জন্য পরিমাণগত ট্রেডিংয়ের জন্য একটি গুরুত্বপূর্ণ সরঞ্জাম হয়ে উঠতে পারে। এটি পরিমাণগত ট্রেডিং অনুশীলনকারীদের দ্বারা আরও গবেষণা এবং প্রয়োগের যোগ্য।


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

আরো