یہ ایک تجرباتی مقداری تجارتی حکمت عملی ہے

مصنف:چاؤ ژانگ، تاریخ: 2023-12-22 14:13:27
ٹیگز:

img

جائزہ

یہ ایک تجرباتی مقداری تجارتی حکمت عملی ہے جو تجارتی سگنل پیدا کرنے کے لئے حرکت پذیر اوسط اشارے اور کے این این مشین لرننگ الگورتھم کو جوڑتی ہے۔ یہ رجحان کی سمت کا تعین کرنے کے لئے مختلف ادوار کے ساتھ دو وی ڈبلیو ایم اے لائنوں کے کراس اوورز کا استعمال کرتی ہے ، اور سگنلز کی وشوسنییتا کو بہتر بنانے کے لئے کے این این الگورتھم کے ذریعہ سگنلز کو فلٹر کرنے کے لئے ایم ایف آئی اور اے ڈی ایکس اشارے استعمال کرتی ہے۔

حکمت عملی کے اصول

اس حکمت عملی کے بنیادی اشارے دو VWMA لائنیں ہیں جن کے مختلف پیرامیٹرز ہیں ، یعنی فاسٹ لائن اور سست لائن۔ جب فاسٹ لائن سست لائن سے اوپر عبور کرتی ہے تو ، خرید کا اشارہ پیدا ہوتا ہے۔ جب فاسٹ لائن سست لائن سے نیچے عبور کرتی ہے تو ، فروخت کا اشارہ پیدا ہوتا ہے۔ اس کے علاوہ ، اس حکمت عملی میں دو معاون اشارے ، ایم ایف آئی اور اے ڈی ایکس متعارف کرایا گیا ہے ، تاکہ موجودہ مارکیٹ کے حالات میں موجودہ سگنل کی وشوسنییتا کا اندازہ کیا جاسکے۔

kNN الگورتھم کے پیچھے خیال یہ ہے کہ نئے اعداد و شمار کو تاریخی اعداد و شمار کے ساتھ موازنہ کیا جائے تاکہ k سب سے زیادہ مماثل تاریخی اعداد و شمار کے مطابق نتائج کا تعین کیا جاسکے ، اور ان k تاریخی نتائج کی اکثریت کی بنیاد پر درجہ بندی کی جاسکے۔ اس حکمت عملی میں MFI اور ADX کو kNN الگورتھم کے دو ان پٹ پیرامیٹرز کے طور پر استعمال کیا جاتا ہے تاکہ اشارے کے اس مجموعے کے تحت تاریخی قیمت کی نقل و حرکت (اعلی رجحان یا نیچے کا رجحان) کا تعین کیا جاسکے ، اس طرح سگنل کے معیار کو بہتر بنانے کے لئے موجودہ سگنل کو فلٹر کیا جاسکے۔

فوائد

  • وی ڈبلیو ایم اے کی رجحان کی پیروی کرنے کی صلاحیت کا استعمال کریں اور حرکت پذیر اوسط کراس اوورز کے ذریعے تجارتی سگنل تیار کریں
  • رجحان کی سمت کا تعین کرنے میں مدد کے لئے کثیر جہتی خصوصیت نکالنے کے لئے ایم ایف آئی اور اے ڈی ایکس اشارے کا اطلاق کریں
  • تجارتی سگنلز کو متحرک طور پر بہتر بنانے اور فلٹر کرنے کے لئے کے این این مشین لرننگ الگورتھم کا فائدہ اٹھائیں
  • زیادہ سے زیادہ ڈیٹا کی تصدیق اور اصلاح کے ذریعے بہتری کے لئے وسیع گنجائش کے ساتھ تجرباتی حکمت عملی

خطرات اور تخفیف

  • وی ڈبلیو ایم اے لائنز میں تاخیر ہوتی ہے
  • ایم ایف آئی اور اے ڈی ایکس میں کچھ تاخیر ہے ، جس سے مارکیٹ کے حالات کا غلط اندازہ لگایا جاسکتا ہے
  • kNN الگورتھم پیرامیٹرز (مثال کے طور پر k قدر) کے نتائج پر اہم اثر ہو سکتا ہے
  • تجرباتی حکمت عملی براہ راست تجارت میں کم کارکردگی کا مظاہرہ کر سکتی ہے

تخفیف:

  • تاخیر کو کم کرنے کے لئے ایم اے پیرامیٹرز کو ایڈجسٹ کریں
  • رجحانات کو زیادہ درست اندازہ کرنے کے لئے اشارے کو بہتر بنائیں
  • فٹنس کو بہتر بنانے کے لئے kNN پیرامیٹرز کو بہتر بنائیں
  • بیک ٹسٹ اور کاغذی تجارت کے ذریعے حکمت عملی کی تصدیق کریں

اصلاح کی ہدایات

اس حکمت عملی کو بہتر بنانے کے لیے کافی گنجائش موجود ہے:

  • ایم اے کے مجموعے کی تعمیر کے لئے مزید ایم اے اشارے شامل کریں
  • مختلف معاون اشارے جیسے MACD، KDJ وغیرہ کی کوشش کریں
  • مختلف فاصلے کی پیمائش کا استعمال کرتے ہوئے kNN الگورتھم کو بہتر بنائیں
  • دیگر مشین لرننگ الگورتھم کی کوشش کریں جیسے SVM، رینڈم جنگل وغیرہ
  • بہترین پیرامیٹر سیٹ تلاش کرنے کے لئے پیرامیٹر ٹیوننگ

مزید اشارے اور مشین لرننگ الگورتھم متعارف کرانے سے حکمت عملی کے استحکام اور منافع میں مزید بہتری آسکتی ہے۔

خلاصہ

یہ VWMA اشارے اور kNN مشین لرننگ الگورتھم پر مبنی ایک تجرباتی مقداری تجارتی حکمت عملی ہے۔ اس میں مشین لرننگ کے ذریعہ سگنلز کو فلٹر کرتے ہوئے مضبوط رجحان کی پیروی کرنے کی صلاحیت کا فائدہ ہے۔ بہتر نتائج کے ل more اس حکمت عملی میں مزید خصوصیات اور اصلاح کے الگورتھم متعارف کرانے سے توسیع کے لئے بہت زیادہ گنجائش ہے۔ لیکن ایک نئی حکمت عملی کے طور پر ایسے خطرات بھی ہیں جن کی مزید تصدیق اور بہتری کی ضرورت ہے۔ مجموعی طور پر اس حکمت عملی میں بڑی جدت طرازی کی صلاحیت ہے۔


/*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)

مزید