پیاده سازی اندیکاتور مکدی MACD در پایتون — راهنمای گام به گام
میانگینهای متحرک (Moving Average یا MA) بهتنهایی ابزارهایی ساده و بسیار کاربردی هستند که در اغلب ابزارهای «تحلیل تکنیکال» (Technical Analysis) ردپایی از آنها دیده میشود. یکی از این ابزارها، اندیکاتور همگرایی-واگرایی میانگین متحرک (MACD یا Moving Average Convergence-Divergence) یا مکدی است. در این آموزش از «مجله فرادرس»، به پیاده سازی اندیکاتور مکدی MACD در پایتون میپردازیم.
آشنایی با اندیکاتور مکدی (MACD)
در این اندیکاتور ابتدا با تعیین و دو میانگین متحرک نمایی (Exponential Moving Average یا EMA) با طول پنجره متفاوت بر روی قیمت محاسبه میشود:
توجه داشته باشید که همواره باید کوچکتر از باشد. سپس اختلاف بین این دو میانگین متحرک به شکل زیر محاسبه میشود و مقدار حاصل MACD نامیده میشود:
به این ترتیب، مقدار MACD فاصله و موقعیت این دو میانگین متحرک نسبت به هم را نشان خواهد داد. تا به اینجا ابزار ایجادشده میتواند کاربردی باشد، اما یک بخش جدید نیز به آن اضافه میشود تا سیگنالهای بهتری تولید کند.
در این مرحله با تعیین یک که طول میانگین متحرک سیگنال است، از خط MACD یک میانگین متحرک نمایی گرفته میشود:
بنابراین، میتوانیم حدس بزنیم که حرکت خط Signal کندتر از MACD خواهد بود. اختلاف این دو خط را نیز به عنوان معیار جدیدی به نام هیستوگرام (Histogram) نشان میدهیم:
به این ترتیب، در خروجی سه خط با نامهای MACD و Signal و Histogram خواهیم داشت.
برای و و معمولاً، بهترتیب، از اعداد ۱۲ و ۲۶ و ۹ استفاده میشود که تنظیمات مشهوری بوده و نتایج خوبی را ایجاد میکند.
اندیکاتور MACD سیگنالهای متنوعی میتواند ایجاد کند که هرکدام در شرایطی از اعتبار بالایی برخوردار هستند. برای آشنایی بیشتر با اندیکاتور MACD میتوانید به مطلب «اندیکاتور MACD چیست؟ آموزش تصویری و به زبان ساده» مراجعه کنید.
دریافت و رسم مجموعه داده
حال وارد محیط برنامهنویسی میشویم و کتابخانههای مورد نیاز را فراخوانی میکنیم:
1import numpy as np
2import pandas as pd
3import yfinance as yf
4import matplotlib.pyplot as plt
این 4 کتابخانه به ترتیب برای موارد زیر کاربرد دارند:
- کار با آرایه (Array) و محاسبات برداری (Vectorized Computation)
- کار با دیتافریمها (Data Frame)
- دریافت داده از طریق API مربوط به Yahoo Finance
- رسم نمودار قیمت و اندیکاتور
حال تنظیمات زیر را برای نمودارها اعمال میکنیم تا ظاهر نمودارها مناسب باشد:
1plt.style.use('ggplot')
حال میتوانیم مجموعه داده مربوط به شاخص بورس نزدک یا NASDAQ را دریافت کنیم. به این منظور از تابع yfinance.download استفاده میکنیم:
1DF = yf.download('^IXIC', start='2018-01-01', end='2022-01-01')
نماد مربوط به شاخص نزدک در Yahoo Finance به شکل IXIC^ است که برای یافتن آنها میتوان به سایت Yahoo Finance مراجعه کرد. حال برای بررسی مجموعه داده دریافتی، میتوانیم از دو متد head و tail استفاده کنیم:
1print(DF.head())
2
3print(DF.tail())
که در خروجی خواهیم داشت:
Open High Low Close Adj Close Volume Date 2018-01-02 6937.649902 7006.910156 6924.080078 7006.899902 7006.899902 1914930000 2018-01-03 7017.069824 7069.149902 7016.700195 7065.529785 7065.529785 2166780000 2018-01-04 7089.500000 7098.049805 7072.379883 7077.910156 7077.910156 2098890000 2018-01-05 7105.740234 7137.040039 7097.080078 7136.560059 7136.560059 2020900000 2018-01-08 7135.379883 7161.350098 7124.089844 7157.390137 7157.390137 2051430000 Open High Low Close Adj Close Volume Date 2021-12-27 15696.830078 15871.400391 15696.830078 15871.259766 15871.259766 3730120000 2021-12-28 15895.200195 15901.469727 15757.070312 15781.719727 15781.719727 3623600000 2021-12-29 15794.919922 15821.809570 15679.849609 15766.219727 15766.219727 3694500000 2021-12-30 15758.980469 15868.089844 15729.160156 15741.559570 15741.559570 3732730000 2021-12-31 15722.910156 15777.429688 15643.940430 15644.969727 15644.969727 3379850000
به این ترتیب، میتوان تا حدود زیادی از درستی مجموعه داده اطمینان یافت. حال میتوانیم نمودار مربوط به ستون Close را نیز رسم و از روند شاخص مطلع شویم. برای این منظور، میتوان هر دو روش زیر را در پیش گرفت و به نمودار رسید:
- رسم ستون مربوط به Close با استفاده از تاریخ
- رسم ستون مربوط به Close پس از تبدیل به آرایه با استفاده از شماره داده
برای مورد اول، میتوانیم به شکل زیر عمل کنیم:
1plt.semilogy(DF['Close'], ls='-', lw=0.9, c='k')
2plt.title('NASDAQ Composite')
3plt.xlabel('Date')
4plt.ylabel('Value')
5plt.show()
در این شرایط مجموعه داده را به آرایه Numpy تبدیل نمیکنیم و مقادیر محور افقی نیز تاریخ روزها است. در خروجی نمودار زیر حاصل میشود.
به این ترتیب، نمودار مورد نظر حاصل میشود. حال برای حالت دوم از رسم نمودار، ابتدا مقادیر ستون Close را به شکل آرایه Numpy دریافت میکنیم:
1C = DF['Close'].to_numpy()
حال یک آرایه دیگر بهعنوان شماره روزها ایجاد میکنیم. بدین منظور، تابع numpy.arange مناسب است:
1T = np.arange(start=1, stop=C.size + 1, step=1)
حال میتوانیم رسم نمودار را دوباره تکرار کنیم:
1plt.semilogy(T, C, ls='-', lw=0.9, c='k')
2plt.title('NASDAQ Composite')
3plt.xlabel('Time (Day)')
4plt.ylabel('Value')
5plt.show()
در این حالت نیز نمودار بهشکل زیر حاصل خواهد شد.
در نهایت، مشاهده میکنیم که مقادیر محور عمودی ثابت هستند، اما در محور افقی، بهجای تاریخ شاهد شماره روزها هستیم.
بنابراین، روند کلی نماد و صحت مقادیر آن قابل مشاهده است. حال میتوانیم اندیکاتور MACD را پیادهسازی کنیم.
برای یادگیری برنامهنویسی با زبان پایتون، پیشنهاد میکنیم به مجموعه آموزشهای مقدماتی تا پیشرفته پایتون فرادرس مراجعه کنید که لینک آن در ادامه آورده شده است.
- برای مشاهده مجموعه آموزشهای برنامه نویسی پایتون (Python) — مقدماتی تا پیشرفته + اینجا کلیک کنید.
سلام
مطالبتون حرف نداره عالیه
جسارتا برای این مقاله هایی که منتشر کردید منبعی دارید یا خودتون پیاده سازی کردید؟؟
میخوام برای پروژه دانشگاهی از مطالبتون استفاده کنم و برای قبول کردن کارم ازم منبع معتبر میخوان
با تشکر
با سلام؛
منابع تمامی مطالب مجله فرادرس، اگر ترجمه باشند در انتهای متن و پیش از نام نویسنده آورده شدهاند. برای استفاده از مطالب مجله فرادرس میتوانید به شرایط استفاده در انتهای صفحه یا این لینک مراجعه کنید.
با تشکر از همراهی شما با مجله فرادرس
بی نهایت ممنون / اموزش تخصصی و جالب بود