রিসোর্স লোড হচ্ছে... লোডিং...

অ্যাডভান্সড প্ল্যাটফর্ম রিসার্চ পাইথন ডেটা বিশ্লেষণ ও কৌশল ব্যাকটেস্ট

লেখক:নিনাবাদাস, তৈরিঃ ২০২২-০৪-১৩ ০৯ঃ১২ঃ৪৭, আপডেটঃ ২০২২-০৪-২৮ ১১ঃ০৬ঃ১৩

অ্যাডভান্সড প্ল্যাটফর্ম রিসার্চ পাইথন ডেটা বিশ্লেষণ ও কৌশল ব্যাকটেস্ট.আইপিনবি

উন্নত প্ল্যাটফর্ম গবেষণা

এফএমজেডের একটি অন্তর্নির্মিত জুপিটার নোটবুক রয়েছে যা ব্যবহারকারীদের প্ল্যাটফর্ম এপিআইয়ের সাথে পরিচিত হতে এবং কৌশল গবেষণা পরিচালনা করতে সহায়তা করে এবং পাইথন 3 সি ++ 11/17 এবং জাভাস্ক্রিপ্টের শেখার পরিবেশগুলিকে সমর্থন করে। নোটবুক + পাইথন একটি খুব শক্তিশালী সরঞ্জাম, যা ডেটা বিশ্লেষণ এবং কৌশল গবেষণার জন্য প্রায় অপরিহার্য। যদিও এফএমজেড প্ল্যাটফর্মের সাথে আসা ব্যাকটেস্টটি খুব দরকারী, তবে এটি জটিল এবং বড় পরিমাণে ডেটা সহ কৌশলগুলির জন্য উপযুক্ত নয়। এই নিবন্ধটি জুপিটার নোটবুকের কিছু উন্নত ব্যবহারের দক্ষতা পরিচয় করিয়ে দেবে এবং এলোমেলো জোড়া ট্রেডিং এবং মাল্টি-জোড়া ট্রেডিং কৌশলগুলির ব্যাকটেস্টগুলি উপলব্ধি করবে।

জুপিটারের ব্যবহার

এফএমজেডের অভ্যন্তরে গবেষণা পরিবেশ ব্যবহার করা যেতে পারে, তবে নেটওয়ার্কিং অসুবিধাজনক। আপনার নিজের ডিভাইসে নোটবুক এবং গণিতের গণনার জন্য সাধারণভাবে ব্যবহৃত সম্পর্কিত লাইব্রেরি সহ আনাকন্ডা 3 ইনস্টল করার পরামর্শ দেওয়া হয়; এটি স্থানীয় নেটওয়ার্ক পরিবেশ ভাগ করতে পারে এবং আরও ভাল পারফরম্যান্স থাকতে পারে। গুগল কোল্যাব ব্যবহার করার পরামর্শ দেওয়া হয়। যদিও কিছু স্টোরেজ সীমাবদ্ধতা রয়েছে তবে এটি নিখরচায় এবং শক্তিশালী, রোবট অধ্যয়নের সাথে সম্পর্কিত গবেষণার জন্য উপযুক্ত।

টিউটোরিয়াল

নোটবুক এবং পাইথনের নির্দিষ্ট ব্যবহারের দক্ষতার জন্য অনেকগুলি অনলাইন টিউটোরিয়াল রয়েছে। আপনি পাইথন কোয়ান্টিফিকেশন এবং জুপিটার নোটবুক টিউটোরিয়ালের মতো কীওয়ার্ড অনুসন্ধান করে প্রচুর তথ্য পেতে পারেন। আপনাকে ক্রলার, ডেটা প্রসেসিং, ব্যাকটেস্ট, কৌশল নকশা এবং প্লটিংয়ের মতো মৌলিকগুলির একটি সিরিজ শিখতে এবং আয়ত্ত করতে হবে।

তথ্য সংগ্রহ

প্ল্যাটফর্মগুলি সাধারণত ইতিহাসের ডেটা সহ কে-লাইনগুলি পাওয়ার জন্য এপিআই সরবরাহ করে এবং কিছু বাণিজ্য দ্বারা কার্যকর ব্যবসায়ের ডেটাও সরবরাহ করে। আমাদের ডেটা পেতে এবং সংরক্ষণ করতে ক্রলারটি ব্যবহার করতে হবে। আপনি সরাসরি প্ল্যাটফর্ম দ্বারা চাপানো ডেটা গ্রহণ করতে এবং নিজের দ্বারা একটি স্থানীয় ডাটাবেস স্টোরেজ তৈরি করতে পারেন।

এরপরে, আমরা দেখাব কিভাবে বাইনারেন্সের চিরস্থায়ী চুক্তির কে-লাইন ডেটা সংগ্রহ এবং সংরক্ষণ করা যায়।

প্রথমে, বাইনারেন্স পারপেক্টুয়াল সোয়াপের ডকুমেন্টেশন খুঁজুন:https://binance-docs.github.io/apidocs/futures/cn/#c59e471e81. আপনি প্রয়োজনীয় পরামিতি এবং ফিরে আসা ডেটা ফর্ম্যাটগুলি দেখতে পারেন। সাধারণত, এপিআই দ্বারা অর্জিত কে-লাইনগুলির সংখ্যা সীমিত, এবং বিন্যান্সে সর্বাধিক 1000 রয়েছে, তাই এটি লুপ পুনরাবৃত্তির মাধ্যমে অর্জনের প্রয়োজন। অন্যান্য প্ল্যাটফর্মের পরিস্থিতি বিন্যান্সে অনুরূপ। মনে রাখবেন যে নেটওয়ার্কটি বিদেশী নেটওয়ার্কের সাথে সংযুক্ত হতে হবে (চীনের অভ্যন্তরীণ নেটওয়ার্কের তুলনায়) কে-লাইনগুলি ক্রল করতে।

বিন্যান্স যে সময়কালগুলি সমর্থন করেঃ 1m, 3m, 5m, 15m, 30m, 1h, 2h, 4h, 6h, 8h, 12h, 1d, 3d, 1w, 1M।

[২৪] এঃ আমদানি অনুরোধ # নেটওয়ার্ক অনুরোধ সাধারণ লাইব্রেরির জন্য তারিখ-সময় থেকে আমদানি তারিখ-সময় আমদানি সময় পিডি হিসাবে পান্ডা আমদানি করুন [১৬০] এঃ def GetKlines ((symbol=BTC,start=2020-8-10,end=2021-8-10,period=1h): ক্লিন্স = [] start_time = int(time.mktime(datetime.strptime(start, %Y-%m-%d).timetuple))) *1000 end_time = int(time.mktime(datetime.strptime(end, %Y-%m-%d).timetuple))) *1000 while start_time < end_time: যখন শুরু_সময় < শেষ_সময়ঃ res = requests.get ((https://fapi.binance.com/fapi/v1/klines?symbol=%sUSDT&interval=%s&startTime=%s&limit=1000% ((symbol,period,start_time)) res_list = res.json() ক্লাইনস += res_list #print ((datetime.utcfromtimestamp ((start_time/1000).strftime(%Y-%m-%d %H:%M:%S),len ((res_list)) start_time = res_list[-1][0] return pd.DataFrame ((Klines,columns=[time,open,high,low,close,amount,end_time,volume,count,buy_amount,buy_volume,null]).astype)) [৮৫] এঃ df = GetKlines ((symbol=BTC,start=2021-1-1,end=2021-8-10,period=1h)

ডাটা স্টোরেজ এবং পড়ার জন্য পান্ডা লাইব্রেরির ভিতরে ফাংশন ব্যবহার করা যেতে পারে। ফর্ম্যাটটি সিএসভি, যা সরাসরি এক্সেল সফ্টওয়্যার দিয়ে খোলা যেতে পারে।

সর্বোচ্চ মূল্য, সর্বনিম্ন মূল্য, খোলা মূল্য, বন্ধ মূল্য এবং সম্পাদিত ভলিউমের পাশাপাশি, বিন্যান্স দ্বারা ফিরে আসা কে-লাইন ডেটাতে মোট ট্রেডিং পরিমাণ, উদ্যোগ কেনার পরিমাণ, সম্পাদনের পরিমাণ ইত্যাদি অন্তর্ভুক্ত রয়েছে। এগুলি মূল্যবান তথ্য যা কৌশল তৈরি করতে ব্যবহার করা যেতে পারে।

[৮৬] এঃ df.to_csv ((btc_klines.csv) df = pd.read_csv ((btc_klines.csv,index_col=0) [৮৭] এঃ ডিএফ আউট[87]: ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, সময় খোলা উচ্চ নিম্ন বন্ধ পরিমাণ শেষ_সময় ভলিউম গণনা কিনুন_অমান কিনুন_ভলিউম শূন্য 0 1596988800000 11575.08 11642.00 11566.07 11591.37 6541.466 1596992399999 7.592336e+07 25724 3127.898 3.630633e+07 0 1 1596992400000 11591.39 11610.23 11526.90 11534.39 6969.252 1596995999999 8.057780e+07 27403 3390.424 3.920162e+07 0 2 1596996000000 11534.39 11656.69 11527.93 11641.07 6439.365 1596999599999 7.469135e+07 25403 3446.186 3.997906e+07 0 3 1596999600000 11641.06 11665.90 11624.20 11635.30 3911.582 1597003199999 4.555459e+07 17820 1842.413 2.145768e+07 0 4 1597003200000 11635.29 11684.00 11635.29 11673.81 3461.004 1597006799999 4.036804e+07 15513 1660.575 1.936981e+07 0 ..................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................... 8805 1628658000000 45627.72 45894.53 45540.00 45801.45 10296.202 1628661599999 4.710187e+08 112187 4988.565 2.282399e+08 0 8806 1628661600000 45801.46 46270.00 45800.01 46087.86 26409.962 1628665199999 1.215164e+09 247170 13696.301 6.302708e+08 0 8807 1628665200000 46087.87 46450.00 46087.87 46367.38 23969.309 1628668799999 8808 1628668800000 46367.37 46643.13 46002.01 46217.01 23472.769 1628672399999 1.086549e+09 229533 12334.292 5.711837e+08 0 8809 1628672400000 46217.01 46329.69 46046.54 46297.16 6579.477 1628675999999 3.039580e+08 78812 3313.055 1.530718e+08 0 , 8810 সারি × 12 কলাম

, [৮৮] এঃ df.index = pd.to_datetime ((df.time,unit=ms) # সূচকটিকে একটি তারিখে রূপান্তর করুন, যা প্লট করার জন্য সুবিধাজনক [89]: df.close.plot ((figsize=(15,6),grid = True); #close price আউট[৮৯]:img[৯২] এঃ (df.buy_amount.rolling(150).mean()/df.amount.rolling(150.mean()).plot ((figsize=(15,6),grid = True); #প্ল্যাট পরে, উদ্যোগের ক্রয়ের পরিমাণের অনুপাত # মূলধন ক্রয়ের পরিমাণ বাড়ার পরে মূলধন ক্রয়ের পরিমাণ বাড়ার পরিস্থিতি সাধারণত দাম বৃদ্ধির পরিস্থিতিতে সাড়া দেয়, তবে মূলধন ক্রয়ের পরিমাণের দীর্ঘমেয়াদী গড় 49% আউট[92]:img[৯৩]: (df[count].rolling(100.mean()).plot ((figsize=(15,6),grid = True); #ফ্ল্যাট পরে কার্যকর পরিমাণ,এবং বাজারের কোটগুলি কম অবস্থানে প্রস্তুত করা যেতে পারে আউট[93]:img

ব্যাকটেস্ট ইঞ্জিন

পূর্ববর্তী নিবন্ধে পাইথন ব্যাকটেস্ট ইঞ্জিনও দেওয়া হয়েছিল, তবে এখানে একটি অনুকূলিত সংস্করণ রয়েছে। ইউএসডিটি-মার্জিনযুক্ত (বা অন্যান্য কোট মুদ্রা-মার্জিনযুক্ত) চিরস্থায়ী চুক্তিগুলি স্পট চুক্তিগুলির সাথে খুব অনুরূপ। পার্থক্যটি হ'ল চিরস্থায়ী চুক্তিগুলি লিভারেজ করা যেতে পারে এবং নেতিবাচক পরিমাণ ধরে রাখতে পারে (স্বল্প করার সমতুল্য), এবং একটি ব্যাকটেস্ট ইঞ্জিন ভাগ করতে পারে। ক্রিপ্টো-মার্জিনযুক্ত বিতরণ চুক্তিগুলি বিশেষ, কারণ তারা মুদ্রায় নিষ্পত্তি হয় এবং নির্দিষ্ট ব্যাকটেস্টের প্রয়োজন হয়।

এখানে একটি সহজ উদাহরণ দেওয়া হয়েছে, যা মাল্টি-সিম্বল স্পট বা মাল্টি-সিম্বল চিরস্থায়ী ব্যাকটেস্টিং বাস্তবায়ন করতে পারে। অনেকগুলি বিবরণ উপেক্ষা করা হয়ঃ যেমন ফিউচারগুলির লিভারেজ, মার্জিন দখল, তহবিলের হার, তরলীকরণ প্রক্রিয়া, বাজার তৈরি এবং অর্ডার গ্রহণকারী লেনদেনের পাশাপাশি অর্ডার রক্ষণাবেক্ষণ, তবে এটি সাধারণত স্বাভাবিক ব্যাকটেস্ট ফলাফলকে প্রভাবিত করে না। এবং মিলের দাম এবং পরিমাণ এবং অ্যাকাউন্ট আপডেটের সমস্ত বাহ্যিকভাবে আমদানি করা দরকার। পাঠকরা এটির উপর ভিত্তি করে এটি উন্নত করতে পারেন।

এক্সচেঞ্জ ক্লাসের ভূমিকা:

  • account:USDT বেস মুদ্রা নির্দেশ করে, যা প্রয়োজন হয় না; realised_profit: ইতিমধ্যে বাস্তবায়িত লাভ এবং ক্ষতি; unrealised_profit: লাভ এবং ক্ষতি এখনও বাস্তবায়িত হয়নি; মোটঃ মোট মূলধন; ফিঃ হ্যান্ডলিং ফি। অন্যান্য ট্রেডিং জোড়ার জন্য, পরিমাণ (যা শর্ট করার সময় নেতিবাচক সংখ্যা); hold_price: হোল্ডিং মূল্য; মানঃ হোল্ডিং মান; মূল্যঃ বর্তমান মূল্য।

  • trade_symbols: ট্রেডিং জোড়ার অ্যারে; আপনি একটি ট্রেডিং জোড়ায়ও পাস করতে পারেন; ডিফল্ট কোট মুদ্রা হল ইউএসডিটি, তবে আপনি ব্যাকটেস্টে অন্যান্য কোট মুদ্রা প্রতীকগুলিও ব্যবহার করতে পারেন।

  • ফিঃ হস্তান্তর ফি; সহজভাবে বলতে গেলে, প্রস্তুতকারক এবং গ্রহণকারীর মধ্যে পার্থক্য করবেন না।

  • initial_balance: প্রাথমিক সম্পদ; ডিফল্ট ট্রেডিং জোড়ার প্রাথমিক পরিমাণ ০।

  • ক্রয় ফাংশনঃ কিনতে, যা একটি মিলে যাওয়া প্রক্রিয়া ছাড়া চিরস্থায়ী চুক্তি দীর্ঘ এবং বন্ধ সংক্ষিপ্ত করতে অনুরূপ।

  • বিক্রয় ফাংশনঃ বিক্রয়।

  • আপডেট ফাংশনঃ অ্যাকাউন্টের তথ্য আপডেট করতে, যা সমস্ত ট্রেডিং জোড়ার মূল্য অভিধানে পাস করতে হবে। [98]: ক্লাস এক্সচেঞ্জঃ

    def সূচনা(self, trade_symbols, fee=0.0004, initial_balance=10000): self.initial_balance = initial_balance #প্রাথমিক ভারসাম্য self.fee = ফি self.trade_symbols = trade_symbols self.account = {USDT:{realised_profit:0, unrealised_profit:0, total:initial_balance, fee:0}} trade_symbols-এ প্রতীকের জন্যঃ self.account[symbol] = {amount:0, hold_price:0, value:0, price:0, realised_profit:0,unrealised_profit:0,fee:0}

    trade ((self, symbol, direction, price, amount):

      cover_amount = 0 if direction*self.account[symbol]['amount'] >=0 else min(abs(self.account[symbol]['amount']), amount)
      open_amount = amount - cover_amount
      self.account['USDT']['realised_profit'] -= price*amount*self.fee #take out the fee 
      self.account['USDT']['fee'] += price*amount*self.fee
      self.account[symbol]['fee'] += price*amount*self.fee
    
      if cover_amount > 0: #close first 
          self.account['USDT']['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount  #profit 
          self.account[symbol]['realised_profit'] += -direction*(price - self.account[symbol]['hold_price'])*cover_amount
          
          self.account[symbol]['amount'] -= -direction*cover_amount
          self.account[symbol]['hold_price'] = 0 if self.account[symbol]['amount'] == 0 else self.account[symbol]['hold_price']
          
      if open_amount > 0:
          total_cost = self.account[symbol]['hold_price']*direction*self.account[symbol]['amount'] + price*open_amount
          total_amount = direction*self.account[symbol]['amount']+open_amount
          
          self.account[symbol]['hold_price'] = total_cost/total_amount
          self.account[symbol]['amount'] += direction*open_amount
    

    def কিনুন ((স্বয়ং, প্রতীক, মূল্য, পরিমাণ):self.Trade(প্রতীক, 1, মূল্য, পরিমাণ)

    def বিক্রি ((স্বয়ং, প্রতীক, মূল্য, পরিমাণ):self.Trade(প্রতীক, -১, মূল্য, পরিমাণ)

    def Update ((self, close_price): #সম্পদের আপডেট করুন self.account[USDT][unrealised_profit] = 0 self.trade_symbols-এ প্রতীকের জন্যঃ self.account[symbol][unrealised_profit] = (close_price[symbol] - self.account[symbol][hold_price]) *self.account[symbol][amount] self.account[প্রতীক][price] = close_price[প্রতীক] self.account[symbol][value] = abs(self.account[symbol][amount]) *close_price[symbol] self.account[USDT][unrealised_profit] += self.account[symbol][unrealised_profit] self.account[USDT][total] = round(self.account[USDT][realised_profit] + self.initial_balance + self.account[USDT][unrealised_profit],6) [১১৭] এঃ #টেস্টে, আপনি দেখতে পাচ্ছেন যে প্ল্যাটফর্মটি ইউএসডিটি-মার্জিনযুক্ত বা স্পট কিনা তা কোনও জোর দেয় না। আসলে, ফলাফল একই, যা কোনও পার্থক্যের কারণ নয়। e = Exchange([BTC], fee=0.0004, initial_balance=10000) #একটি Exchange অবজেক্ট তৈরি করুন, এবং শুধুমাত্র একটি BTC ট্রেডিং জোড়া e.BTC ,40000, 0.1) কিনুন#০.১ বিটিসি ৪০,০০০ এর দামে কিনুন e.Vend ((BTC,41000, 0.1) #sell 0.1 BTC at the price of 41,000 e.Update (({BTC:41000}) #updtae অ্যাকাউন্টের তথ্য প্রিন্ট ((ই-অ্যাকাউন্ট) #অন্তিম অ্যাকাউন্টের তথ্য print (('লাভঃ ', বৃত্তাকার ((e.account[USDT][total]-e.initial_balance,2)) আউট[117]:{USDT: {realised_profit: 96.76, unrealised_profit: 0.0, total: 10096.76, fee: 3.24}, BTC: {amount: 0.0, hold_price: 0, value: 0.0, price: 000, 41 realised_profit: 100.0, unrealised_profit: 0.0, fee: 3.24}} লাভঃ ৯৬.৭৬

গ্রিড কৌশল ব্যাকটেস্ট

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

Live এর শীর্ষে, একটি অফিসিয়াল বট রয়েছে, যা 4 এপ্রিল, 2021 থেকে শুরু হয়েছে; অবস্থান মান 150, গ্রিড স্পেসিং 0.01, এবং বর্তমান লাভ 3600USDT। একই পরামিতি এবং ব্যাকটেস্টের জন্য 5 মিনিট কে-লাইন ব্যবহার করে, লাভ 3937USDT। যেহেতু বটের শুরুতে অবস্থান মান 150 USDT এর চেয়ে কম, ফলাফলটি বেশ সঠিক। আপনি যদি গ্রিড স্পেসিং 0.005 এ পরিবর্তন করেন তবে লাভ হবে 5226U। 0.005 এর গ্রিড স্পেসিং অবশ্যই 0.01 এর চেয়ে ভাল পরামিতি, যা খুঁজে বের করার জন্য ব্যাকটেস্ট করা দরকার।

কে-লাইন পিরিয়ড যত ছোট, সংশ্লিষ্ট ব্যাকটেস্টের ফলাফল তত সঠিক এবং প্রয়োজনীয় ডেটার পরিমাণ তত বেশি। পাঠকরা তারা ব্যাকটেস্ট করতে চান এমন ট্রেডিং জুটিতে প্রতীক পরামিতি পরিবর্তন করার চেষ্টা করতে পারেন।

[২৪১] এঃ প্রতীক = TRX df = GetKlines ((symbol=symbol,start=2021-4-4,end=2021-8-11,period=5m) [২৮৬] এঃ মান = ১৫০ pct = ০.০১

e = Exchange (([প্রতীক], ফি=0.0002, initial_balance=10000) init_price = df.loc[0,close] res_list = [] #মধ্যবর্তী ফলাফল সংরক্ষণ করতে ব্যবহৃত df.iterrows-এ রঙের জন্যঃ kline = row[1] #যা শুধুমাত্র একটি K-line পরীক্ষা করবে এবং শুধুমাত্র একটি কিনুন অর্ডার বা একটি বিক্রয় অর্ডার পাবে, যা খুব সঠিক নয় buy_price = (value / pct - value) / ((value / pct) / init_price + e.account[symbol][amount]) #sell order price, কারণ এটি একটি নির্মাতার কার্যকরকরণ, এটি চূড়ান্ত ম্যাচিং মূল্যও sell_price = (value / pct + value) / ((value / pct) / init_price + e.account[symbol][amount])

if kline.low < buy_price: #the lowest price of K-line is less than the current maker price; the buy order is executed 
    e.Buy(symbol,buy_price,value/buy_price)
if kline.high > sell_price:
    e.Sell(symbol,sell_price,value/sell_price)
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount'], e.account['USDT']['total']-e.initial_balance])

res = pd.DataFrame ((data=res_list, columns=[time,price,amount,profit]) res.index = pd.to_datetime ((res.time,unit=ms) [২৮৭] এঃ ই.অ্যাকাউন্ট আউট[287]:{USDT: {realised_profit: 3866.633149565143, অবাস্তব লাভ: ৭০.৫৪৬২২২৮১৯৯৩৬৬৬, মোট : ১৩৯৩৭.১৭৯৩৭২, ফি : ১৭৭.৫১০০০০০০০৫৯৬}, TRX: {অর্থ: 36497.43208747655, হোল্ড_প্রাইস: 0.08203709078461048, মূল্য : ৩০৬৪.৬৮৯৩৭২৩৮৫৪০৬ মূল্য : ০.০৮৩৯৭, প্রাপ্ত_লাভ: 4044.143149565462, অবাস্তব লাভ: ৭০.৫৪৬২২২৮১৯৯৩৬৬৬, ফি: ১৭৭.৫১০০০০০০০৫৯৬}} [২৮৮] এঃ res.profit.plot ((figsize=(15,6),grid = True); আউট[288]:img[১৭০] এঃ res.price.plot ((figsize=(15,6),grid = True); #close price আউট[170]:img

স্পট ইকুইলেন্ডারি স্ট্র্যাটেজি ব্যাকটেস্ট

এই ধরণের কৌশলটিও তুলনামূলকভাবে জনপ্রিয়, তবে এফএমজেড প্ল্যাটফর্মটি মাল্টি-সিম্বল কৌশলগুলি ব্যাকটেস্টিংয়ে খুব ভাল নয়, কেবল চেষ্টা করার জন্য এই ব্যাকটেস্ট ইঞ্জিনটি ব্যবহার করুন। আমরা চারটি মূলধারার মুদ্রা প্রতীক, বিটিসি, ইটিএইচ, এলটিসি এবং এক্সআরপি নির্বাচন করি এবং যথাক্রমে বাজারের মূল্যের 25% কনফিগার করি এবং প্রতিটি 1% বিচ্যুতি ভারসাম্য করি।

প্রথমত, গত বছরের চারটি প্রতীকের বন্ধের দাম পান। দেখা যায় যে ETH এর সর্বাধিক বৃদ্ধি রয়েছে এবং অন্য তিনটিতে অনুরূপ বৃদ্ধি রয়েছে। আপনি যদি এই চারটি প্রতীক গড় ধরে রাখেন তবে চূড়ান্ত নেট মূল্য 4.5। ব্যাকটেস্টের পরে, ভারসাম্য কৌশলটির চূড়ান্ত নেট মূল্য 5.3 রয়েছে, যা সামান্য উন্নত।

[২৯০] এঃ চিহ্ন = [BTC,ETH,LTC,XRP] তথ্য = {} চিহ্নের মধ্যে চিহ্নের জন্যঃ df = GetKlines ((symbol=symbol,start=2020-8-11,end=2021-8-11,period=1h) ডেটা[প্রতীক] = df.close [২৯১] এঃ df = pd.DataFrame (([data[symbol].value for symbol in symbols],index=symbols).T [৩০২] এঃ e = এক্সচেঞ্জ ((সিম্বল, ফি=0.0004, প্রাথমিক_বালান্স=10000) res_list = [] df.iterrows-এ রঙের জন্যঃ দাম = সারি [1] মোট = ই.অ্যাকাউন্ট[USDT][মোট] e. আপডেট ((মূল্য) চিহ্নের মধ্যে চিহ্নের জন্যঃ pct = e.account[symbol][value]/total যদি pct > 0.26 হয়ঃ e.Sell ((symbol,prices[symbol],(point-0.25)*total/prices[symbol]) যদি pct < ০.২৪ হয়ঃ e.Buy ((symbol,prices[symbol],(0.25-percent) *total/prices[symbol]) res_list.append (([e.account[symbol][value] symbols in symbols] + [e.account[USDT][total]]) res = pd.DataFrame ((data=res_list, columns=symbols+[total]) [৩০৩] এঃ (df/df.iloc[0,:]).plot(figsize=(15,6),grid = True); #নরমালাইজেশনের মাধ্যমে ট্র্যান্ডটি প্লট করুন আউট[303]:img[৩০৪] এঃ (res.total/10000-(df/df.iloc[0,:]).mean(axis=1)).plot(figsize=(15,6),grid = True); #enheance the effect আউট[304]:img

কচ্ছপের কৌশল

টার্টল কৌশল একটি ক্লাসিক ট্রেন্ড কৌশল, যার মধ্যে অবস্থান যোগ করার জন্য সম্পূর্ণ স্টপ-লস লজিক অন্তর্ভুক্ত রয়েছে। বিস্তারিত জানার জন্য, দয়া করে পড়ুনঃhttps://zhuanlan.zhihu.com/p/27987938আমরা ব্যাকটেস্টের জন্য এখানে একটি সহজ সংস্করণ বাস্তবায়ন করব।

টর্টল কৌশল সময়কাল কৌশল উপর একটি বড় প্রভাব আছে, এবং এটি একটি সময়কাল যে খুব সংক্ষিপ্ত পছন্দ করা অযাচিত। এখানে, আমরা 6h চয়ন। Donchian চ্যানেল সময়কাল 5 হিসাবে নির্বাচন করা হয়, এবং অবস্থান অনুপাত ব্যাকটেস্ট অনুযায়ী 0.003 হিসাবে নির্বাচন করা হয়। যখন মূল্য 1 ইউনিট দীর্ঘ অবস্থান খুলতে চ্যানেলের আপব্যান্ড মাধ্যমে বিরতি, এবং মূল্য 0.3 দ্বারা অস্থিরতা বৃদ্ধি অব্যাহত অবস্থান খোলার পরে, 1 ইউনিট যোগ করা চালিয়ে যান, এবং মূল্য 2.5 এর নিচে পড়ে হার বন্ধ করতে সর্বশেষ খোলা মূল্যের অস্থিরতা। সংক্ষিপ্ত অর্ডার নীতি একই। ETH এর বড় ষাঁড় বাজার কারণে, টর্টল কৌশল প্রধান প্রবণতা ক্যাপচার করেছে এবং অবশেষে 27 বার মুনাফা অর্জন করেছে, সময়ের মধ্যে 4 বার সর্বোচ্চ লিভারেজ সহ।

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

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

[৪২৪] এঃ প্রতীক = ETH df = GetKlines ((symbol=symbol,start=2019-8-11,end=2021-8-11,period=6h) [425] এঃ df.index = pd.to_datetime ((df.time,unit=ms) [৫৬৮] এঃ M = 5 # ডনচিয়ান চ্যানেলের সময়কালের আয়তন pct = 0.003 # যোগ করা পজিশনের মোট পজিশনের অনুপাত df[up] = df[high].rolling ((M).max().shift(1) #upBand of Donchian channel, used to make long and judge to break through t df[down] = df[low].rolling(M).max().shift(1) df[middle] = (df[up]+df[down])/2 df[true_range] = pd.concat([df[high]-df[low],df[high]-df[close].shift(1),df[close].shift(1)-df[low],axis=1).max (axis=1) df[N] = df[true_range].rolling(50).mean() #N সাম্প্রতিক অস্থিরতার সমান, যা কিনতে এবং স্টপ লস বিচার করতে ব্যবহৃত হয় [৫৭২] এঃ open_times = 0.3 #পজিশন খোলার সিদ্ধান্ত স্টপ_টাইম = ২.৫ #স্টপ লস e = এক্সচেঞ্জ (([প্রতীক], ফি=0.0004, initial_balance=10000) #টেকারকে 0.0004 এ সেট করুন res_list = [] last_price = 0 #শেষ খোলা পজিশনের মূল্য df.iterrows-এ রঙের জন্যঃ ক্লাইন = সারি [1] if kline.isnull().sum() > 0: #ডেটা ছাড়াই বিভাগটি এড়িয়ে যান চালিয়ে যান ইউনিট = ই.অ্যাকাউন্ট[USDT][মোট]*pct/kline.N #open position unit amount

if kline.high >  kline.up and e.account[symbol]['amount'] == 0: #first time to open long position 
    e.Buy(symbol,kline.up,unit) #notice the trading price here
    last_price = kline.up
if e.account[symbol]['amount'] > 0 and kline.high > last_price + open_times*kline.N: #long position, buy in 
    e.Buy(symbol,last_price + open_times*kline.N,unit)
    last_price = last_price + open_times*kline.N
if e.account[symbol]['amount'] > 0 and kline.low < last_price - stop_times*kline.N: #long position, stop loss
    e.Sell(symbol,last_price - stop_times*kline.N,e.account[symbol]['amount'])
    
if kline.low <  kline.down and e.account[symbol]['amount'] == 0: #open short
    e.Sell(symbol,kline.down,unit)
    last_price = kline.down
if e.account[symbol]['amount'] < 0 and kline.low < last_price - open_times*kline.N: #short position, buy in 
    e.Sell(symbol,last_price - open_times*kline.N,unit)
    last_price = last_price - open_times*kline.N
if e.account[symbol]['amount'] < 0 and kline.high > last_price + stop_times*kline.N: #short position, stop loss
    e.Buy(symbol,last_price + stop_times*kline.N,-e.account[symbol]['amount'])
    
e.Update({symbol:kline.close})
res_list.append([kline.time, kline.close, e.account[symbol]['amount']*kline.close, e.account['USDT']['total']])

res = pd.DataFrame ((data=res_list, columns=[time,price,value,total]) res.index = pd.to_datetime ((res.time,unit=ms) print ((সর্বশেষ বাজারমূল্যঃ,res[total][-1]) আউট[572]:সর্বশেষ বাজার মূল্যঃ 280760.566996 [৫৭৩] এঃ res.total.plot ((figsize=(15,6), গ্রিড = সত্য); আউট[573]:img[571]-এঃ (res.value/res.total).plot ((figsize=(15,6),grid = True); আউট[571]:img

সিদ্ধান্ত

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

ডেটা বিশ্লেষণ করতে পাইথন ব্যবহার করুনঃhttps://wizardforcel.gitbooks.io/pyda-2e/content/

পাইথন পরিমাণগত টিউটোরিয়ালঃhttps://wizardforcel.gitbooks.io/python-quant-uqer/content/

[ ] এঃ


আরো