লিনিয়ার রিগ্রেশন মুভিং এভারেজ ট্রেডিং কৌশল

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

img

সারসংক্ষেপ

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

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

কৌশলটি প্রথমে একটি এন-দিনের লিনিয়ার রিগ্রেশন লাইন এবং স্টক মূল্যের এম-দিনের চলমান গড় গণনা করে। রিগ্রেশন লাইন দীর্ঘমেয়াদী পরিসংখ্যানগত প্রবণতা ক্যাপচার করে যখন চলমান গড় স্বল্পমেয়াদী গতি প্রতিফলিত করে।

যখন চলমান গড় রেগ্রেশন লাইনের উপরে অতিক্রম করে, এটি আপসাইড গতি বাড়ানোর সংকেত দেয় এবং একটি ক্রয় সংকেত তৈরি করে। যখন চলমান গড় নীচে অতিক্রম করে, এটি দুর্বল আপসাইড সংকেত দেয় এবং একটি বিক্রয় সংকেত তৈরি করে।

বিশেষ করে, কৌশলটি ট্রেড সংকেত নির্ধারণের জন্য নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করেঃ

  1. মূল্যের n-দিনের লিনিয়ার রিগ্রেশন লাইন গণনা করুন lrLine

  2. lrLine নামক lrMA এর এম-দিনের সহজ চলমান গড় গণনা করুন

  3. এম-দিনের এক্সপোনেন্সিয়াল মুভিং মিডিয়ার হিসাব করুন

  4. যখন ইএমএ আইআরএমএ এর উপরে অতিক্রম করে, তখন লং এন্ট্রি কিনুন সংকেত তৈরি করুন

  5. যখন ইএমএ আইআরএমএ এর নিচে অতিক্রম করে, তখন বিক্রয় সংকেত তৈরি করুন

  6. কেবলমাত্র বাজার উত্তোলনের সময় কিনতে সংকেত বিবেচনা করুন

  7. সিগন্যালের উপর ভিত্তি করে ট্রেড সম্পাদন করুন

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

সুবিধা

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

ঝুঁকি

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

চলমান গড় এবং রিগ্রেশন লাইন সময়কাল বৃদ্ধি এবং বাণিজ্য ফ্রিকোয়েন্সি হ্রাস করার জন্য পরামিতিগুলি সামঞ্জস্য করা উচিত। ঝুঁকি নিয়ন্ত্রণের জন্য যুক্তিসঙ্গত স্টপ লস বাস্তবায়ন করা উচিত। নির্ভুলতা উন্নত করতে বাজার ফিল্টারগুলি উন্নত করা যেতে পারে।

উন্নতি

কৌশলটি বেশ কয়েকটি দিক থেকে অপ্টিমাইজ করা যেতে পারেঃ

  1. বিভিন্ন ধরনের এমএ পরীক্ষার মাধ্যমে চলমান গড় অপ্টিমাইজেশান

  2. গণনার সময়কাল সামঞ্জস্য করে রিগ্রেশন লাইন অপ্টিমাইজেশন

  3. বিভিন্ন সূচক পরীক্ষা করে বাজার ফিল্টার অপ্টিমাইজেশন

  4. কঠোর ব্যাকটেস্টিংয়ের মাধ্যমে প্যারামিটার অপ্টিমাইজেশন

  5. বিভিন্ন স্টপ লস লজিক পরীক্ষা করে স্টপ লস অপ্টিমাইজেশন

  6. ব্যয়ের উপর ভিত্তি করে বাণিজ্যের ফ্রিকোয়েন্সি সামঞ্জস্য করে ব্যয় অপ্টিমাইজেশন

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

সিদ্ধান্ত

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


/*backtest
start: 2022-10-18 00:00:00
end: 2023-10-24 00:00:00
period: 1d
basePeriod: 1h
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/
// © lazy_capitalist

//@version=5
strategy('Linear Regression MA', overlay=true, initial_capital=10000)
datesGroup = "Date Info"
startMonth = input.int(defval = 1,    title = "Start Month",  minval = 1, maxval = 12,  group=datesGroup)
startDay   = input.int(defval = 1,    title = "Start Day",    minval = 1, maxval = 31,  group=datesGroup)
startYear  = input.int(defval = 2022, title = "Start Year",   minval = 1970,            group=datesGroup)

averagesGroup = "Averages"
lrLineInput     = input.int(title="Linear Regression Line",   defval=55, minval = 1, group=averagesGroup)
lrMAInput       = input.int(title="Linear Regression MA",     defval=55, minval = 1, group=averagesGroup)
emaInput        = input.int(title="EMA Length",               defval=55, minval = 1, group=averagesGroup)


tradesGroup = "Execute Trades"
executeLongInput    = input.bool(title="Execute Long Trades",       defval=true)
executeShortInput   = input.bool(title="Execute Short Trades",      defval=true)
executeStopLoss     = input.bool(title="Execute Stop Loss",         defval=true)

fourHrSMAExpr       = ta.sma(close, 200)
fourHrMA            = request.security(symbol=syminfo.tickerid, timeframe="240", expression=fourHrSMAExpr)

bullish             = close > fourHrMA ? true : false


maxProfitInput              = input.float(  title="Max Profit (%)",         defval=10.0,    minval=0.0)   * 0.01
stopLossPercentageInput     = input.float(  title="Stop Loss (%)",          defval=1.75,    minval=0.0)   * 0.01

start       = timestamp(startYear, startMonth, startDay, 00, 00)            // backtest start  window
window()    => time >= start ? true : false                              // create function "within window of time"
showDate    = input(defval = true, title = "Show Date Range")

lrLine = ta.linreg(close, lrLineInput, 0)
lrMA   = ta.sma(lrLine, lrMAInput)
ema     = ta.ema(close, emaInput)

longEntry   = ema   < lrMA
longExit    = lrMA  < ema

shortEntry  = lrMA  < ema
shortExit   = ema   < lrMA


maxProfitLong   = strategy.opentrades.entry_price(0) * (1 + maxProfitInput)
maxProfitShort  = strategy.opentrades.entry_price(0) * (1 - maxProfitInput)

stopLossPriceShort  = strategy.position_avg_price * (1 + stopLossPercentageInput)
stopLossPriceLong   = strategy.position_avg_price * (1 - stopLossPercentageInput)

if(executeLongInput and bullish)
    strategy.entry( id="long_entry", direction=strategy.long,   when=longEntry and window(),    qty=10,  comment="long_entry")
    strategy.close( id="long_entry", when=longExit,     comment="long_exit")
    // strategy.close( id="long_entry", when=maxProfitLong <= close, comment="long_exit_mp")
    
if(executeShortInput and not bullish)
    strategy.entry( id="short_entry", direction=strategy.short,   when=shortEntry and window(),    qty=10,  comment="short_entry")
    strategy.close( id="short_entry", when=shortExit,     comment="short_exit")
    // strategy.close( id="short_entry", when=maxProfitShort <= close, comment="short_exit_mp")

if(strategy.position_size > 0 and executeStopLoss)
    strategy.exit(  id="long_entry",        stop=stopLossPriceLong,             comment="exit_long_SL")
    strategy.exit(  id="short_entry",       stop=stopLossPriceShort,            comment="exit_short_SL")
    
// plot(series=lrLine,     color=color.green)
plot(series=lrMA,       color=color.red)
plot(series=ema,        color=color.blue)


আরো