در این مقاله به‑طور جامع نحوه استفاده از کتابخانههای موجود برای تحلیل تکنیکال در پایتون، بهویژه کتابخانههای «ta» (که یکی از محبوبترین کتابخانههای تحلیل تکنیکال در پایتون است) و ابزارهای مصورسازی داده مانند matplotlib پرداخته میشود. در ادامه با استفاده از دادههای واقعی (مثلاً دادههای تاریخی یک سهم از طریق yfinance) و با بهرهگیری از توابع موجود در کتابخانه ta، چندین شاخص تکنیکال مختلف را محاسبه و به همراه نمودارهای مربوط به آنها رسم میکنیم.
فهرست مطالب
مقدمه
نصب و راهاندازی کتابخانهها
آمادهسازی دادههای نمونه
مثال 1: رسم نمودار قیمت بستهشدن
مثال 2: محاسبه و رسم میانگین متحرک ساده (SMA)
مثال 3: محاسبه و رسم میانگین متحرک نمایی (EMA)
مثال 4: محاسبه و رسم شاخص RSI
مثال 5: محاسبه و رسم MACD
مثال 6: محاسبه و رسم Bollinger Bands
مثال 7: محاسبه و رسم ATR
مثال 8: محاسبه و رسم Stochastic Oscillator
مثال 9: محاسبه و رسم Parabolic SAR
مثال 10: ترکیب چند اندیکاتور در یک نمودار
جمعبندی
مقدمه
تحلیل تکنیکال یکی از رویکردهای محبوب برای تحلیل حرکت قیمت و روندهای بازارهای مالی است. در این روش از شاخصها و الگوهای ریاضی برای پیشبینی جهت حرکت قیمت استفاده میشود. پایتون بهدلیل داشتن کتابخانههای تخصصی مانند ta برای محاسبه شاخصهای تکنیکال و matplotlib برای مصورسازی دادهها، به یکی از ابزارهای اصلی تحلیلگران مالی تبدیل شده است.
در این مقاله، با استفاده از دادههای واقعی (به کمک کتابخانه yfinance) و محاسبه شاخصهای تکنیکال از طریق کتابخانه ta، روندهای مختلف را بررسی و نمودارهایی برای هر یک رسم میکنیم.
نصب و راهاندازی کتابخانهها
ابتدا مطمئن شوید که پایتون (نسخه 3.7 به بالا) و مدیر بسته pip روی سیستم شما نصب است. سپس با اجرای دستورات زیر کتابخانههای مورد نیاز را نصب کنید:
pip install ta pandas matplotlib yfinance
توضیح:
• ta: کتابخانهای برای محاسبه شاخصهای تحلیل تکنیکال
• pandas: برای مدیریت دادههای جدولی
• matplotlib: برای رسم نمودار
• yfinance: برای دریافت دادههای تاریخی از Yahoo Finance
آمادهسازی دادههای نمونه
در ادامه با استفاده از کتابخانه yfinance دادههای تاریخی سهم «AAPL» (اپل) را برای یک بازه زمانی مشخص دریافت کرده و آماده میکنیم. در مثالهای بعدی از این دادهها استفاده میشود.
import yfinance as yf
import pandas as pd
# دریافت دادههای تاریخی سهم اپل از تاریخ 2022-01-01 تا 2023-01-01
symbol = "AAPL"
start_date = "2022-01-01"
end_date = "2023-01-01"
df = yf.download(symbol, start=start_date, end=end_date)
df.columns = [col[0] if isinstance(col, tuple) else col for col in df.columns]
# مرتبسازی دادهها بر اساس تاریخ
df.sort_index(inplace=True)
# نمایش چند سطر اول دادهها
print(df.head())
مثال 1: رسم نمودار قیمت بستهشدن
ابتدا نمودار سادهای از قیمت بستهشدن سهم رسم میکنیم.
import matplotlib.pyplot as plt
plt.figure(figsize=(10,5))
plt.plot(df.index, df['Close'], label='قیمت بستهشدن', color='blue')
plt.title('نمودار قیمت بستهشدن سهم AAPL')
plt.xlabel('تاریخ')
plt.ylabel('قیمت (USD)')
plt.legend()
plt.grid(True)
plt.show()
مثال 2: محاسبه و رسم میانگین متحرک ساده (SMA)
با استفاده از کتابخانه ta، میانگین متحرک ساده 20 روزه را محاسبه و روی نمودار قیمت بستهشدن رسم میکنیم.
import ta
# محاسبه SMA با دوره 20 روزه
df['SMA_20'] = ta.trend.sma_indicator(df['Close'], window=20)
plt.figure(figsize=(10,5))
plt.plot(df.index, df['Close'], label='قیمت بستهشدن', color='blue')
plt.plot(df.index, df['SMA_20'], label='SMA 20 روزه', color='red', linewidth=2)
plt.title('قیمت بستهشدن سهم به همراه میانگین متحرک ساده (SMA 20)')
plt.xlabel('تاریخ')
plt.ylabel('قیمت (USD)')
plt.legend()
plt.grid(True)
plt.show()
مثال 3: محاسبه و رسم میانگین متحرک نمایی (EMA)
در این مثال، میانگین متحرک نمایی 20 روزه محاسبه و روی نمودار رسم میشود.
# محاسبه EMA با دوره 20 روزه
df['EMA_20'] = ta.trend.ema_indicator(df['Close'], window=20)
plt.figure(figsize=(10,5))
plt.plot(df.index, df['Close'], label='قیمت بستهشدن', color='blue')
plt.plot(df.index, df['EMA_20'], label='EMA 20 روزه', color='green', linewidth=2)
plt.title('قیمت بستهشدن سهم به همراه میانگین متحرک نمایی (EMA 20)')
plt.xlabel('تاریخ')
plt.ylabel('قیمت (USD)')
plt.legend()
plt.grid(True)
plt.show()
مثال 4: محاسبه و رسم شاخص RSI
شاخص قدرت نسبی (RSI) یک شاخص محبوب برای اندازهگیری اشباع خرید یا فروش است. در این مثال RSI با دوره 14 روزه محاسبه و نمودار آن به همراه قیمت رسم میشود.
# محاسبه RSI با دوره 14 روزه
df['RSI'] = ta.momentum.rsi(df['Close'], window=14)
fig, ax1 = plt.subplots(figsize=(10,8))
# نمودار قیمت در محور اول
ax1.plot(df.index, df['Close'], label='قیمت بستهشدن', color='blue')
ax1.set_xlabel('تاریخ')
ax1.set_ylabel('قیمت (USD)')
ax1.legend(loc='upper left')
ax1.grid(True)
# محور دوم برای RSI
ax2 = ax1.twinx()
ax2.plot(df.index, df['RSI'], label='RSI (14)', color='orange')
ax2.set_ylabel('RSI')
ax2.axhline(70, color='red', linestyle='--', linewidth=1)
ax2.axhline(30, color='green', linestyle='--', linewidth=1)
ax2.legend(loc='upper right')
plt.title('قیمت سهم به همراه شاخص RSI')
plt.show()
مثال 5: محاسبه و رسم MACD
MACD (همگرایی/واگرایی میانگین متحرک) از شاخصهای مهم تحلیل تکنیکال است. در این مثال MACD، خط سیگنال و اختلاف آن محاسبه و رسم میشوند.
# محاسبه MACD با استفاده از کلاس MACD موجود در ta
macd = ta.trend.MACD(df['Close'], window_slow=26, window_fast=12, window_sign=9)
df['MACD'] = macd.macd()
df['MACD_signal'] = macd.macd_signal()
df['MACD_diff'] = macd.macd_diff()
fig, ax = plt.subplots(figsize=(10,5))
ax.plot(df.index, df['MACD'], label='MACD', color='blue')
ax.plot(df.index, df['MACD_signal'], label='خط سیگنال', color='red')
ax.bar(df.index, df['MACD_diff'], label='MACD Diff', color='gray', alpha=0.3)
ax.set_title('نمودار MACD')
ax.set_xlabel('تاریخ')
ax.set_ylabel('مقدار MACD')
ax.legend()
ax.grid(True)
plt.show()
مثال 6: محاسبه و رسم Bollinger Bands
باندهای بولینگر برای اندازهگیری نوسان قیمت استفاده میشوند. در این مثال باندهای بالا و پایین و همچنین باند میانی (معمولاً همان SMA) را محاسبه و رسم میکنیم.
# محاسبه Bollinger Bands با دوره 20 روزه و انحراف معیار 2
bb = ta.volatility.BollingerBands(close=df['Close'], window=20, window_dev=2)
df['BB_High'] = bb.bollinger_hband()
df['BB_Low'] = bb.bollinger_lband()
df['BB_Mid'] = bb.bollinger_mavg()
plt.figure(figsize=(10,5))
plt.plot(df.index, df['Close'], label='قیمت بستهشدن', color='blue')
plt.plot(df.index, df['BB_High'], label='باند بالا', color='green', linestyle='--')
plt.plot(df.index, df['BB_Low'], label='باند پایین', color='red', linestyle='--')
plt.plot(df.index, df['BB_Mid'], label='میانگین متحرک (باند میانی)', color='orange')
plt.title('قیمت سهم به همراه Bollinger Bands')
plt.xlabel('تاریخ')
plt.ylabel('قیمت (USD)')
plt.legend()
plt.grid(True)
plt.show()
مثال 7: محاسبه و رسم ATR
میانگین دامنه واقعی (ATR) شاخصی برای اندازهگیری نوسانات بازار است. در این مثال ATR با دوره 14 روزه محاسبه و نمودار آن رسم میشود.
# محاسبه ATR با دوره 14 روزه
df['ATR'] = ta.volatility.average_true_range(high=df['High'], low=df['Low'], close=df['Close'], window=14)
plt.figure(figsize=(10,5))
plt.plot(df.index, df['ATR'], label='ATR (14)', color='purple')
plt.title('شاخص ATR')
plt.xlabel('تاریخ')
plt.ylabel('ATR')
plt.legend()
plt.grid(True)
plt.show()
مثال 8: محاسبه و رسم Stochastic Oscillator
شاخص استوکستیک از شاخصهای مومنتوم است که وضعیت اشباع خرید یا فروش را نشان میدهد. در این مثال از تابع StochasticOscillator استفاده میکنیم.
# محاسبه Stochastic Oscillator با دوره 14 روزه و smooth_window 3
stoch = ta.momentum.StochasticOscillator(high=df['High'], low=df['Low'], close=df['Close'], window=14, smooth_window=3)
df['Stoch'] = stoch.stoch()
df['Stoch_signal'] = stoch.stoch_signal()
fig, ax = plt.subplots(figsize=(10,5))
ax.plot(df.index, df['Stoch'], label='%K', color='blue')
ax.plot(df.index, df['Stoch_signal'], label='%D', color='red')
ax.set_title('شاخص استوکستیک')
ax.set_xlabel('تاریخ')
ax.set_ylabel('مقادیر استوکستیک')
ax.legend()
ax.grid(True)
plt.show()
مثال 9: محاسبه و رسم Parabolic SAR
شاخص Parabolic SAR برای تعیین نقاط احتمالی تغییر روند به کار میرود. در این مثال با استفاده از کلاس PSARIndicator، شاخص PSAR را محاسبه و رسم میکنیم.
# محاسبه PSAR با دورههای پیشفرض
from ta.trend import PSARIndicator
psar = PSARIndicator(high=df['High'], low=df['Low'], close=df['Close'], step=0.02, max_step=0.2)
df['PSAR'] = psar.psar()
plt.figure(figsize=(10,5))
plt.plot(df.index, df['Close'], label='قیمت بستهشدن', color='blue')
plt.scatter(df.index, df['PSAR'], label='PSAR', color='magenta', s=10)
plt.title('شاخص Parabolic SAR')
plt.xlabel('تاریخ')
plt.ylabel('قیمت (USD)')
plt.legend()
plt.grid(True)
plt.show()
مثال 10: ترکیب چند اندیکاتور در یک نمودار
در این مثال نهایی، چند شاخص تکنیکال مختلف را بر روی نمودار یک نمودار شمعی (candlestick) رسم میکنیم. برای رسم نمودار شمعی میتوانیم از کتابخانه mplfinance استفاده کنیم؛ اما در اینجا با استفاده از matplotlib، قیمت بستهشدن به همراه SMA و MACD را در دو بخش جداگانه رسم میکنیم.
ابتدا نمودار شمعی (بهصورت خطی برای سادگی) همراه SMA رسم میشود و سپس نمودار MACD در پنجرهای جداگانه.
# محاسبه SMA 20 روزه (اگر قبلاً انجام نشده باشد)
df['SMA_20'] = ta.trend.sma_indicator(df['Close'], window=20)
# رسم نمودار قیمت به همراه SMA
plt.figure(figsize=(10,5))
plt.plot(df.index, df['Close'], label='قیمت بستهشدن', color='blue')
plt.plot(df.index, df['SMA_20'], label='SMA 20 روزه', color='red', linewidth=2)
plt.title('قیمت سهم AAPL به همراه SMA 20 روزه')
plt.xlabel('تاریخ')
plt.ylabel('قیمت (USD)')
plt.legend()
plt.grid(True)
plt.show()
# رسم نمودار MACD در یک پنجره جداگانه (همانند مثال 5)
macd = ta.trend.MACD(df['Close'], window_slow=26, window_fast=12, window_sign=9)
df['MACD'] = macd.macd()
df['MACD_signal'] = macd.macd_signal()
df['MACD_diff'] = macd.macd_diff()
plt.figure(figsize=(10,5))
plt.plot(df.index, df['MACD'], label='MACD', color='blue')
plt.plot(df.index, df['MACD_signal'], label='خط سیگنال', color='red')
plt.bar(df.index, df['MACD_diff'], label='MACD Diff', color='gray', alpha=0.3)
plt.title('نمودار MACD')
plt.xlabel('تاریخ')
plt.ylabel('مقدار MACD')
plt.legend()
plt.grid(True)
plt.show()
نکته: در پروژههای واقعی میتوانید از کتابخانههای تخصصی رسم نمودار شمعی مانند mplfinance استفاده کنید؛ اما برای سادگی و تمرین، در این مثالها از نمودارهای خطی استفاده شده است.
در این مقاله جامع به بررسی نحوه استفاده از کتابخانههای تحلیل تکنیکال در پایتون (به کمک کتابخانه ta) پرداختیم. با استفاده از دادههای تاریخی واقعی سهم و محاسبه شاخصهای مختلف مانند SMA، EMA، RSI، MACD، Bollinger Bands، ATR، Stochastic Oscillator و Parabolic SAR، توانستیم به کمک matplotlib نمودارهایی جهت نمایش روند قیمت و شاخصها رسم کنیم. همچنین در مثال نهایی، ترکیب چند اندیکاتور در یک نمودار بهعنوان نمونهای از تحلیل چندجانبه مورد بررسی قرار گرفت.
با استفاده از این مباحث و کدهای ارائهشده، شما میتوانید تحلیلهای تکنیکال پیشرفتهتری را انجام دهید و بر اساس دادههای واقعی تصمیمات بهتری در بازارهای مالی اتخاذ کنید.
