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

ANN-ভিত্তিক পরিমাণগত ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

এই কৌশলটি ভবিষ্যতের দামের পরিবর্তনগুলি পূর্বাভাস দেওয়ার জন্য একটি কৃত্রিম নিউরাল নেটওয়ার্ক (এএনএন) ব্যবহার করে এবং পূর্বাভাসের ভিত্তিতে ট্রেডিং সংকেত উত্পন্ন করে। এটি প্রবণতা অনুসরণকারী কৌশলটির অন্তর্গত। সুবিধাটি হ'ল এটি জটিল অ-রৈখিক প্রবণতা সনাক্ত করতে পারে এবং মাঝারি থেকে দীর্ঘমেয়াদী ব্যবসায়ের জন্য উপযুক্ত। তবে এটিতে ব্যাকটেস্ট ডেটাতে ওভারফিটিং এবং লাইভ ট্রেডিংয়ে দুর্বল পারফরম্যান্সের ঝুঁকিও রয়েছে।

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

কৌশলটি পরবর্তী ট্রেডিং দিনের শতাংশ পরিবর্তন পূর্বাভাস দিতে একটি ANN মডেল ব্যবহার করে।

ইনপুট স্তরে শুধুমাত্র একটি নোড রয়েছে, যা আগের দিনের শতাংশ পরিবর্তন।

লুকানো স্তরটিতে 2 টি স্তর রয়েছে, প্রথমটিতে 5 টি নোড রয়েছে এবং দ্বিতীয়টিতে 33 টি নোড রয়েছে। উভয়ই হাইপারবলিক টানজেন্ট (টানহ) সক্রিয়করণ ফাংশন হিসাবে ব্যবহার করে।

আউটপুট স্তরটিতে একটি নোড রয়েছে, যা চূড়ান্ত ভবিষ্যদ্বাণী তৈরির জন্য একটি রৈখিক সক্রিয়করণ ফাংশনের মধ্য দিয়ে যায়।

যদি পূর্বাভাসটি থ্রেশহোল্ড প্যারামিটারের চেয়ে বড় হয় তবে একটি দীর্ঘ সংকেত উত্পন্ন হয়। যদি থ্রেশহোল্ডের নেতিবাচক থেকে কম হয় তবে একটি সংক্ষিপ্ত সংকেত উত্পন্ন হয়।

সুবিধা

  • এএনএন ডেটাতে জটিল অ-রৈখিক সম্পর্ক মডেল করতে পারে
  • শুধুমাত্র পূর্ববর্তী দিনের তথ্য ইনপুট হিসাবে প্রয়োজন
  • দীর্ঘ সময়সীমার প্রবণতা চিহ্নিত করতে পারে
  • একাধিক লুকানো স্তর মডেলিং ক্ষমতা বৃদ্ধি
  • ভাল পারফরম্যান্সের জন্য অপ্টিমাইজড অ্যাক্টিভেশন ফাংশন এবং পরামিতি

ঝুঁকি

  • অতিরিক্ত ফিটিং ঝুঁকি - লাইভ পারফরম্যান্স ব্যাকটেস্ট থেকে পৃথক হতে পারে
  • প্রশিক্ষণের জন্য দীর্ঘতর ঐতিহাসিক তথ্য প্রয়োজন
  • পরামিতি এবং কাঠামোর অপ্টিমাইজেশান প্রয়োজন, ফলাফল পরিবর্তিত হতে পারে
  • শুধুমাত্র পরের দিন পূর্বাভাস দেয়, দীর্ঘমেয়াদী প্রবণতা নির্ধারণ করতে অক্ষম
  • বিভিন্ন বাজারে পারফরম্যান্সের অবনতি হতে পারে

উন্নতির দিকনির্দেশ

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

সিদ্ধান্ত

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


/*backtest
start: 2023-10-14 00:00:00
end: 2023-11-13 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=2
strategy("ANN Strategy v2")

threshold = input(title="Threshold", type=float, defval=0.0000, step=0.0001)
timeframe = input(title="Timeframe",  defval='1D' )

getDiff() =>
    yesterday=request.security(syminfo.tickerid, timeframe, ohlc4[1])
    today=ohlc4
    delta=today-yesterday
    percentage=delta/yesterday

PineActivationFunctionLinear(v) => v
PineActivationFunctionTanh(v) => (exp(v) - exp(-v))/(exp(v) + exp(-v))


l0_0 = PineActivationFunctionLinear(getDiff())

l1_0 = PineActivationFunctionTanh(l0_0*0.8446488687)
l1_1 = PineActivationFunctionTanh(l0_0*-0.5674069006)
l1_2 = PineActivationFunctionTanh(l0_0*0.8676766445)
l1_3 = PineActivationFunctionTanh(l0_0*0.5200611473)
l1_4 = PineActivationFunctionTanh(l0_0*-0.2215499554)

l2_0 = PineActivationFunctionTanh(l1_0*0.3341657935 + l1_1*-2.0060003664 + l1_2*0.8606354375 + l1_3*0.9184846912 + l1_4*-0.8531172267)
l2_1 = PineActivationFunctionTanh(l1_0*-0.0394076437 + l1_1*-0.4720374911 + l1_2*0.2900968524 + l1_3*1.0653326022 + l1_4*0.3000188806)
l2_2 = PineActivationFunctionTanh(l1_0*-0.559307785 + l1_1*-0.9353655177 + l1_2*1.2133832962 + l1_3*0.1952686024 + l1_4*0.8552068166)
l2_3 = PineActivationFunctionTanh(l1_0*-0.4293220754 + l1_1*0.8484259409 + l1_2*-0.7154087313 + l1_3*0.1102971055 + l1_4*0.2279392724)
l2_4 = PineActivationFunctionTanh(l1_0*0.9111779155 + l1_1*0.2801691115 + l1_2*0.0039982713 + l1_3*-0.5648257117 + l1_4*0.3281705155)
l2_5 = PineActivationFunctionTanh(l1_0*-0.2963954503 + l1_1*0.4046532178 + l1_2*0.2460580977 + l1_3*0.6608675819 + l1_4*-0.8732022547)
l2_6 = PineActivationFunctionTanh(l1_0*0.8810811932 + l1_1*0.6903706878 + l1_2*-0.5953059103 + l1_3*-0.3084040686 + l1_4*-0.4038498853)
l2_7 = PineActivationFunctionTanh(l1_0*-0.5687101164 + l1_1*0.2736758588 + l1_2*-0.2217360382 + l1_3*0.8742950972 + l1_4*0.2997583987)
l2_8 = PineActivationFunctionTanh(l1_0*0.0708459913 + l1_1*0.8221730616 + l1_2*-0.7213265567 + l1_3*-0.3810462836 + l1_4*0.0503867753)
l2_9 = PineActivationFunctionTanh(l1_0*0.4880140595 + l1_1*0.9466627196 + l1_2*1.0163097961 + l1_3*-0.9500386514 + l1_4*-0.6341709382)
l2_10 = PineActivationFunctionTanh(l1_0*1.3402207103 + l1_1*0.0013395288 + l1_2*3.4813009133 + l1_3*-0.8636814677 + l1_4*41.3171047132)
l2_11 = PineActivationFunctionTanh(l1_0*1.2388217292 + l1_1*-0.6520886912 + l1_2*0.3508321737 + l1_3*0.6640560714 + l1_4*1.5936220597)
l2_12 = PineActivationFunctionTanh(l1_0*-0.1800525171 + l1_1*-0.2620989752 + l1_2*0.056675277 + l1_3*-0.5045395315 + l1_4*0.2732553554)
l2_13 = PineActivationFunctionTanh(l1_0*-0.7776331454 + l1_1*0.1895231137 + l1_2*0.5384918862 + l1_3*0.093711904 + l1_4*-0.3725627758)
l2_14 = PineActivationFunctionTanh(l1_0*-0.3181583022 + l1_1*0.2467979854 + l1_2*0.4341718676 + l1_3*-0.7277619935 + l1_4*0.1799381758)
l2_15 = PineActivationFunctionTanh(l1_0*-0.5558227731 + l1_1*0.3666152536 + l1_2*0.1538243225 + l1_3*-0.8915928174 + l1_4*-0.7659355684)
l2_16 = PineActivationFunctionTanh(l1_0*0.6111516061 + l1_1*-0.5459495224 + l1_2*-0.5724238425 + l1_3*-0.8553500765 + l1_4*-0.8696190472)
l2_17 = PineActivationFunctionTanh(l1_0*0.6843667454 + l1_1*0.408652181 + l1_2*-0.8830470112 + l1_3*-0.8602324935 + l1_4*0.1135462621)
l2_18 = PineActivationFunctionTanh(l1_0*-0.1569048216 + l1_1*-1.4643247888 + l1_2*0.5557152813 + l1_3*1.0482791924 + l1_4*1.4523116833)
l2_19 = PineActivationFunctionTanh(l1_0*0.5207514017 + l1_1*-0.2734444192 + l1_2*-0.3328660936 + l1_3*-0.7941515963 + l1_4*-0.3536051491)
l2_20 = PineActivationFunctionTanh(l1_0*-0.4097807954 + l1_1*0.3198619826 + l1_2*0.461681627 + l1_3*-0.1135575498 + l1_4*0.7103339851)
l2_21 = PineActivationFunctionTanh(l1_0*-0.8725014237 + l1_1*-1.0312091401 + l1_2*0.2267643037 + l1_3*-0.6814258121 + l1_4*0.7524828703)
l2_22 = PineActivationFunctionTanh(l1_0*-0.3986855003 + l1_1*0.4962556631 + l1_2*-0.7330224516 + l1_3*0.7355772164 + l1_4*0.3180141739)
l2_23 = PineActivationFunctionTanh(l1_0*-1.083080442 + l1_1*1.8752543187 + l1_2*0.3623326265 + l1_3*-0.348145191 + l1_4*0.1977935038)
l2_24 = PineActivationFunctionTanh(l1_0*-0.0291290625 + l1_1*0.0612906199 + l1_2*0.1219696687 + l1_3*-1.0273685429 + l1_4*0.0872219768)
l2_25 = PineActivationFunctionTanh(l1_0*0.931791094 + l1_1*-0.313753684 + l1_2*-0.3028724837 + l1_3*0.7387076712 + l1_4*0.3806140391)
l2_26 = PineActivationFunctionTanh(l1_0*0.2630619402 + l1_1*-1.9827996702 + l1_2*-0.7741413496 + l1_3*0.1262957444 + l1_4*0.2248777886)
l2_27 = PineActivationFunctionTanh(l1_0*-0.2666322362 + l1_1*-1.124654664 + l1_2*0.7288282621 + l1_3*-0.1384289204 + l1_4*0.2395966188)
l2_28 = PineActivationFunctionTanh(l1_0*0.6611845175 + l1_1*0.0466048937 + l1_2*-0.1980999993 + l1_3*0.8152350927 + l1_4*0.0032723211)
l2_29 = PineActivationFunctionTanh(l1_0*-0.3150344751 + l1_1*0.1391754608 + l1_2*0.5462816249 + l1_3*-0.7952302364 + l1_4*-0.7520712378)
l2_30 = PineActivationFunctionTanh(l1_0*-0.0576916066 + l1_1*0.3678415302 + l1_2*0.6802537378 + l1_3*1.1437036331 + l1_4*-0.8637405666)
l2_31 = PineActivationFunctionTanh(l1_0*0.7016273068 + l1_1*0.3978601709 + l1_2*0.3157049654 + l1_3*-0.2528455662 + l1_4*-0.8614146703)
l2_32 = PineActivationFunctionTanh(l1_0*1.1741126834 + l1_1*-1.4046408959 + l1_2*1.2914477803 + l1_3*0.9904052964 + l1_4*-0.6980155826)

l3_0 = PineActivationFunctionTanh(l2_0*-0.1366382003 + l2_1*0.8161960822 + l2_2*-0.9458773183 + l2_3*0.4692969576 + l2_4*0.0126710629 + l2_5*-0.0403001012 + l2_6*-0.0116244898 + l2_7*-0.4874816289 + l2_8*-0.6392241448 + l2_9*-0.410338398 + l2_10*-0.1181027081 + l2_11*0.1075562037 + l2_12*-0.5948728252 + l2_13*0.5593677345 + l2_14*-0.3642935247 + l2_15*-0.2867603217 + l2_16*0.142250271 + l2_17*-0.0535698019 + l2_18*-0.034007685 + l2_19*-0.3594532426 + l2_20*0.2551095195 + l2_21*0.4214344983 + l2_22*0.8941621336 + l2_23*0.6283377368 + l2_24*-0.7138020667 + l2_25*-0.1426738249 + l2_26*0.172671223 + l2_27*0.0714824385 + l2_28*-0.3268182144 + l2_29*-0.0078989755 + l2_30*-0.2032828145 + l2_31*-0.0260631534 + l2_32*0.4918037012)

buying = l3_0 > 0 ? true : l3_0 < -0 ? false : buying[1]

hline(0, title="base line")
//bgcolor(l3_0 > 0.0014 ? green : l3_0 < -0.0014 ? red : gray, transp=20)
bgcolor(buying ? green : red, transp=20)
plot(l3_0, color=silver, style=area, transp=75)
plot(l3_0, color=aqua, title="prediction")

longCondition = buying
if (longCondition)
    strategy.entry("Long", strategy.long)

shortCondition = buying != true
if (shortCondition)
    strategy.entry("Short", strategy.short)

আরো