यह एक प्रयोगात्मक मात्रात्मक व्यापारिक रणनीति है

लेखक:चाओझांग, दिनांक: 2023-12-22 14:13:27
टैगः

img

अवलोकन

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

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

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

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

लाभ

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

जोखिम और न्यूनीकरण

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

शमन उपाय:

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

अनुकूलन दिशाएँ

इस रणनीति को अनुकूलित करने के लिए बहुत जगह हैः

  • एमए संयोजन बनाने के लिए अधिक एमए संकेतक जोड़ें
  • MACD, KDJ आदि जैसे विभिन्न सहायक संकेतकों का प्रयास करें
  • 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)

अधिक