kNN मशीन लर्निंग मात्रात्मक ट्रेडिंग रणनीति VWMA और MFI/ADX पर आधारित है


निर्माण तिथि: 2023-12-22 14:13:27 अंत में संशोधित करें: 2023-12-22 14:13:27
कॉपी: 0 क्लिक्स: 762
1
ध्यान केंद्रित करना
1623
समर्थक

kNN मशीन लर्निंग मात्रात्मक ट्रेडिंग रणनीति VWMA और MFI/ADX पर आधारित है

अवलोकन

यह रणनीति एक प्रयोगात्मक मात्रात्मक ट्रेडिंग रणनीति है, जो ट्रेडिंग सिग्नल उत्पन्न करने के लिए चलती औसत संकेतक और मशीन सीखने के केएनएन एल्गोरिथ्म को जोड़ती है। यह रणनीति दो अलग-अलग अवधि के वीडब्ल्यूएमए औसत रेखाओं के क्रॉसिंग का उपयोग करती है ताकि रुझान की दिशा निर्धारित की जा सके, और एमएफआई और एडीएक्स दोनों संकेतक केएनएन एल्गोरिथ्म के माध्यम से संकेतों को फ़िल्टर करने के लिए जोड़े गए हैं ताकि संकेत की विश्वसनीयता में सुधार किया जा सके।

रणनीति सिद्धांत

इस रणनीति का मुख्य संकेत दो अलग-अलग मापदंडों के लिए वीडब्ल्यूएमए औसत रेखा है, जो क्रमशः तेज और धीमी रेखा है। जब तेज लाइन धीमी रेखा से गुजरती है तो एक खरीद संकेत उत्पन्न होता है और जब तेज लाइन धीमी रेखा से गुजरती है तो एक बेचने का संकेत उत्पन्न होता है। इसके अलावा, इस रणनीति में एमएफआई और एडीएक्स दो सहायक संकेतकों को पेश किया गया है, जो कि केएनएन वर्गीकरण एल्गोरिदम के माध्यम से वर्तमान बाजार की स्थिति में संकेत की विश्वसनीयता का न्याय करते हैं।

kNN एल्गोरिथ्म का विचार यह है कि नए डेटा की तुलना ऐतिहासिक डेटा से की जाए, यह निर्धारित करने के लिए कि निकटतम k ऐतिहासिक डेटा से क्या मेल खाता है, और इस k ऐतिहासिक परिणाम के आधार पर बहुमत के आधार पर वर्गीकृत किया जाता है। यह रणनीति MFI और ADX को kNN एल्गोरिथ्म के दो इनपुट पैरामीटर के रूप में उपयोग करती है, यह निर्धारित करने के लिए कि इन दोनों संकेतकों के संयोजन के दौरान ऐतिहासिक मूल्य आंदोलन क्या है (ऊपर या नीचे), ताकि वर्तमान सिग्नल को फ़िल्टर किया जा सके और सिग्नल की गुणवत्ता में सुधार हो सके।

रणनीतिक लाभ

  • वीडब्ल्यूएमए की प्रवृत्ति-अनुवर्ती क्षमता का उपयोग करके, खरीद-बिक्री बिंदुओं को उत्पन्न करने के लिए समानांतर क्रॉसिंग
  • एमएफआई और एडीएक्स संकेतकों का उपयोग बहु-आयामी विशेषता निष्कर्षण के लिए करें, जो रुझान की दिशा का आकलन करने में सहायता करता है
  • केएनएन मशीन लर्निंग एल्गोरिदम के साथ गतिशील रूप से अनुकूलित और फ़िल्टर किए गए ट्रेडिंग सिग्नल
  • प्रायोगिक रणनीति, विकास के लिए बड़ा स्थान, अधिक डेटा के माध्यम से सत्यापन और अनुकूलन के लिए

जोखिम और उपाय

  • वीडब्ल्यूएमए औसत रेखा के साथ समस्याएं
  • एमएफआई और एडीएक्स कुछ पिछड़े हैं और बाजार की स्थिति को गलत तरीके से देख सकते हैं
  • kNN एल्गोरिथ्म के पैरामीटर सेटिंग्स (जैसे कि k मान चयन) परिणामों पर बहुत प्रभाव डालते हैं
  • प्रायोगिक रणनीतियाँ जो वास्तविक दुनिया में काम नहीं कर सकती हैं

इसका क्या जवाब दें?

  • औसत पैरामीटर को समायोजित करें, कम विलंबता
  • प्रवृत्तियों को समझने के लिए सूचक एल्गोरिदम में सुधार
  • केएनएन एल्गोरिथ्म के पैरामीटर को अनुकूलित करें और मिलान में सुधार करें
  • रणनीति को सत्यापित करने के लिए फीडबैक और सिमुलेशन का उपयोग करना

अनुकूलन दिशा

इस रणनीति में अभी भी बहुत कुछ सुधार करने की संभावना है:

  • अधिक समान रेखा सूचकांक जोड़ें और समान रेखा पोर्टफोलियो बनाएं
  • MACD, KDJ, आदि जैसे विभिन्न सहायक मापों को आज़माएं
  • केएनएन एल्गोरिदम में सुधार, जैसे कि विभिन्न दूरी माप विधियों का उपयोग करना
  • एसवीएम, यादृच्छिक वन आदि जैसे अन्य मशीन सीखने के एल्गोरिदम का प्रयास करें
  • पैरामीटर का अनुकूलन करें, सबसे अच्छा पैरामीटर संयोजन खोजें

इस प्रकार, यह उम्मीद की जा रही है कि इस रणनीति की स्थिरता और लाभप्रदता में और वृद्धि होगी, क्योंकि इसमें अधिक संकेतक और मशीन लर्निंग एल्गोरिदम शामिल हैं।

संक्षेप

यह रणनीति एक प्रयोगात्मक मात्रात्मक ट्रेडिंग रणनीति है जो VWMA औसत रेखा सूचक और kNN मशीन लर्निंग एल्गोरिथ्म पर आधारित है। इसकी प्रवृत्ति का पालन करने की क्षमता मजबूत है, साथ ही मशीन लर्निंग द्वारा सिग्नल फ़िल्टरिंग की विशेषता है। इस रणनीति के लिए जगह व्यापक है और अधिक सुविधाओं और अनुकूलन एल्गोरिदम को पेश करके बेहतर प्रभाव पैदा करने की उम्मीद है। लेकिन एक नई रणनीति के रूप में कुछ जोखिम भी हैं, जिन्हें आगे सत्यापित और सुधार किया जाना है। कुल मिलाकर, इस रणनीति में बहुत बड़ी नवीनता की क्षमता है।

रणनीति स्रोत कोड
/*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)