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

এটি একটি পরীক্ষামূলক পরিমাণগত ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

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

কৌশলগত নীতি

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

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

সুবিধা

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

ঝুঁকি এবং হ্রাস

  • ভিডব্লিউএমএ লাইনগুলি বিলম্বিত হয়
  • এমএফআই এবং এডিএক্সের কিছুটা পিছিয়ে রয়েছে, যা বাজারের পরিস্থিতি ভুলভাবে বিচার করতে পারে
  • kNN অ্যালগরিদমের পরামিতিগুলি (যেমন k মান) ফলাফলের উপর উল্লেখযোগ্য প্রভাব ফেলতে পারে
  • লাইভ ট্রেডিংয়ে পরীক্ষামূলক কৌশল কম ফলপ্রসূ হতে পারে

হ্রাসঃ

  • বিলম্ব হ্রাস করার জন্য এমএ পরামিতিগুলি সামঞ্জস্য করুন
  • প্রবণতা আরও সঠিকভাবে বিচার করার জন্য সূচকগুলি উন্নত করুন
  • ফিটনেস উন্নত করতে কেএনএন পরামিতিগুলি অপ্টিমাইজ করুন
  • ব্যাকটেস্ট এবং পেপার ট্রেডিংয়ের মাধ্যমে কৌশল যাচাই করুন

অপ্টিমাইজেশান নির্দেশাবলী

এই কৌশলটি অপ্টিমাইজ করার জন্য অনেক জায়গা রয়েছেঃ

  • এমএ সংমিশ্রণ তৈরি করতে আরও এমএ সূচক যুক্ত করুন
  • MACD, KDJ ইত্যাদির মত বিভিন্ন সহায়ক সূচক চেষ্টা করুন
  • kNN অ্যালগরিদম উন্নত করুন যেমন বিভিন্ন দূরত্বের মেট্রিক ব্যবহার করে
  • অন্য মেশিন লার্নিং অ্যালগরিদম চেষ্টা করুন যেমন SVM, র্যান্ডম ফরেস্ট ইত্যাদি
  • সর্বোত্তম প্যারামিটার সেট খুঁজতে প্যারামিটার টিউনিং

আরও সূচক এবং মেশিন লার্নিং অ্যালগরিদম প্রবর্তন করে কৌশলটির স্থিতিশীলতা এবং লাভজনকতা আরও উন্নত হতে পারে।

সংক্ষিপ্তসার

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


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © lastguru

//@version=4
strategy(title="VWMA with kNN Machine Learning: MFI/ADX", shorttitle="VWMA + kNN: MFI/ADX", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

/////////
// kNN //
/////////

// Define storage arrays for: parameter 1, parameter 2, price, result (up = 1; down = -1)
var knn1 = array.new_float(1, 0)
var knn2 = array.new_float(1, 0)
var knnp = array.new_float(1, 0)
var knnr = array.new_float(1, 0)

// Store the previous trade; buffer the current one until results are in
_knnStore (p1, p2, src) =>
    var prevp1 = 0.0
    var prevp2 = 0.0
    var prevsrc = 0.0
    
    array.push(knn1, prevp1)
    array.push(knn2, prevp2)
    array.push(knnp, prevsrc)
    array.push(knnr, src >= prevsrc ? 1 : -1)
    
    prevp1 := p1
    prevp2 := p2
    prevsrc := src

// Sort two arrays (MUST be of the same size) based on the first.
// In other words, when an element in the first is moved, the element in the second moves as well.
_knnGet(arr1, arr2, k) =>
    sarr = array.copy(arr1)
    array.sort(sarr)
    ss = array.slice(sarr, 0, min(k, array.size(sarr)))
    m = array.max(ss)
    out = array.new_float(0)
    for i = 0 to array.size(arr1) - 1
        if (array.get(arr1, i) <= m)
            array.push(out, array.get(arr2, i))
    out

// Create a distance array from the two given parameters
_knnDistance(p1, p2) =>
    dist = array.new_float(0)
    n = array.size(knn1) - 1
    for i = 0 to n
        d = sqrt( pow(p1 - array.get(knn1, i), 2) + pow(p2 - array.get(knn2, i), 2) )
        array.push(dist, d)
    dist

// Make a prediction, finding k nearest neighbours
_knn(p1, p2, k) =>
    slice = _knnGet(_knnDistance(p1, p2), array.copy(knnr), k)
    knn = array.sum(slice)

////////////
// Inputs //
////////////

SRC = input(title="Source", type=input.source, defval=open)
FAST = input(title="Fast Length", type=input.integer, defval=13)
SLOW = input(title="Slow Length", type=input.integer, defval=19)
FILTER = input(title="Filter Length", type=input.integer, defval=13)
SMOOTH = input(title="Filter Smoothing", type=input.integer, defval=6)
KNN = input(title="kNN nearest neighbors (k)", type=input.integer, defval=23)
BACKGROUND = input(false,title = "Draw background")

////////
// MA //
////////
fastMA = vwma(SRC, FAST)
slowMA = vwma(SRC, SLOW)

/////////
// DMI //
/////////

// Wilder's Smoothing (Running Moving Average)
_rma(src, length) =>
    out = 0.0
    out := ((length - 1) * nz(out[1]) + src) / length

// DMI (Directional Movement Index)
_dmi (len, smooth) =>
    up = change(high)
    down = -change(low)
    plusDM = na(up) ? na : (up > down and up > 0 ? up : 0)
    minusDM = na(down) ? na : (down > up and down > 0 ? down : 0)
    trur = _rma(tr, len)
    plus = fixnan(100 * _rma(plusDM, len) / trur)
    minus = fixnan(100 * _rma(minusDM, len) / trur)
    sum = plus + minus
    adx = 100 * _rma(abs(plus - minus) / (sum == 0 ? 1 : sum), smooth)
    [plus, minus, adx]

[diplus, diminus, adx] = _dmi(FILTER, SMOOTH)

/////////
// MFI //
/////////

// common RSI function
_rsi(upper, lower) =>
    if lower == 0
        100
    if upper == 0
        0
	100.0 - (100.0 / (1.0 + upper / lower))

mfiUp = sum(volume * (change(ohlc4) <= 0 ? 0 : ohlc4), FILTER)
mfiDown = sum(volume * (change(ohlc4) >= 0 ? 0 : ohlc4), FILTER)
mfi = _rsi(mfiUp, mfiDown)

////////////
// Filter //
////////////

longCondition = crossover(fastMA, slowMA)
shortCondition = crossunder(fastMA, slowMA)

if (longCondition or shortCondition)
    _knnStore(adx, mfi, SRC)
filter = _knn(adx, mfi, KNN)

/////////////
// Actions //
/////////////

bgcolor(BACKGROUND ? filter >= 0 ? color.green : color.red : na)
plot(fastMA, color=color.red)
plot(slowMA, color=color.green)

if (longCondition and filter >= 0)
    strategy.entry("Long", strategy.long)
if (shortCondition and filter < 0)
    strategy.entry("Short", strategy.short)

আরো