دریافت داده های بورس تهران در پایتون — راهنمای گام به گام

آخرین به‌روزرسانی: ۱۸ دی ۱۴۰۱
زمان مطالعه: ۶ دقیقه
دریافت داده های بورس تهران در پایتون

پیش‌تر در آموزش «کار با داده های مالی در پایتون — راهنمای مقدماتی» به موضوعاتی همچون دریافت و پردازش داده‌های مربوط به بورس خارج از کشور، رمزارزها و قیمت جهانی فلزات گران‌بها پرداختیم. در این مطلب قصد داریم تا داده های بورس تهران را دریافت و آن‌ها را پردازش کنیم. بدین منظور از ماژول (Module) Finpy-TSE استفاده خواهیم کرد که برای این کار توسعه داده شده است و امکانات خوبی فراهم آورده است. برای آشنایی بیشتر با این کتابخانه، می‌توانید به صفحه PyPi مربوط به آن (+) مراجعه کنید.

فراخوانی کتابخانه‌ها

برای شروع کار دریافت داده های بورس تهران در بورس، پس از نصب کتابخانه مورد نظر، وارد محیط برنامه‌نویسی پایتون شده و کتابخانه‌های مورد نیاز را فراخوانی می‌کنیم:

import numpy as np
import pandas as pd
import finpy_tse as tse
import mplfinance as mplf
import scipy.stats as stt
import matplotlib.pyplot as plt

این کتابخانه‌ها به ترتیب برای موارد زیر استفاده خواهند شد:

  1. محاسبات برداری
  2. کار با دیتافریم‌ها
  3. دریافت داده از API مربوط به بورس تهران
  4. رسم نمودارهای تکنیکال
  5. محاسبه ضریب همبستگی پیرسون (Pearson Correlation Coefficient)
  6. رسم نمودار

حال تنظیمات نمودارها را به شکل زیر تعیین می‌کنیم:

plt.style.use('ggplot')

دریافت فهرست تمامی سهام‌ها

حال می‌توانیم در اولین قدم، فهرست تمامی سهم‌ها را دریافت کنیم:

DF1 = tse.Build_Market_StockList(bourse=True,
                                 farabourse=True,
                                 payeh=True,
                                 detailed_list=False,
                                 show_progress=True,
                                 save_excel=False,
                                 save_csv=False)

ورودی‌های تعریف شده برای این تابع، به ترتیب برای این موارد کاربرد دارند:

  1. دریافت سهام مربوط به بازار بورس
  2. دریافت سهام مربوط به بازار فرابورس
  3. دریافت سهام مربوط به بازار پایه
  4. اضافه کردن اطلاعات سربرگ سهام به دیتافریم خروجی
  5. نمایش روند دریافت داده
  6. ذخیره دیتافریم در فایل اکسل (Excel)
  7. ذخیره دیتافریم در فایل CSV

حال ۵ سطر ابتدایی دیتافریم دریافت‌شده را نشان می‌دهیم:

print(DF1.head())

که خواهیم داشت:

Market Name Ticker
بورس تولید نیروی برق آبادان آبادا
بورس آسان پرداخت پرشین آپ
بورس بیمه آسیا آسیا
بورس کنتورسازی ایران آکنتور
بورس فرآورده معدنی اپال کانی پارس اپال

توجه داشته باشید که می‌توان با تغییر detailed_list به True می‌توان فهرستی با جزئیات بیشتر دریافت کرد.

حال می‌توانیم برای دریافت فهرستی از تمامی نمادها، به شکل زیر نوشت:

Tickers = DF1.index.to_list()

به این ترتیب، فهرستی به طول ۷۰۵ ایجاد می‌شود که شامل کل نمادهای بورس، فرابورس و بازار پایه است.

برای یادگیری برنامه‌نویسی با زبان پایتون، پیشنهاد می‌کنیم به مجموعه آموزش‌های مقدماتی تا پیشرفته پایتون فرادرس مراجعه کنید که لینک آن در ادامه آورده شده است.

  • برای مشاهده مجموعه آموزش‌های برنامه نویسی پایتون (Python) — مقدماتی تا پیشرفته + اینجا کلیک کنید.

دریافت تاریخچه شاخص کل

در اغلب بازارها، یک شاخص کل وجود دارد که برگرفته از کل بازار است و بر رفتار اغلب نمادها اثرگذار است. برای دریافت تاریخچه شاخص کل، می‌توان به شکل زیر عمل کرد:

DF2 = tse.Get_CWI_History(start_date='1396-01-01',
                          end_date='1399-01-01',
                          ignore_date=False,
                          just_adj_close=False,
                          show_weekday=True,
                          double_date=True)

برای این تابع، ورودی‌های تعریف‌شده اعمال زیر را تنظیم می‌کنند:

  1. تاریخ اولین داده
  2. تاریخ آخرین داده
  3. این ورودی در صورت True بودن، کل تاریخچه را برمی‌گرداند و دو ورودی قبلی را Ignore می‌کند.
  4. این ورودی در صورت True بودن، تنها مقدار تعدیل شده Close را برمی‌گرداند.
  5. اضافه کردن روز هفته به دیتافریم خروجی
  6. اضافه کردن تاریخ میلادی به دیتافریم خروجی

پس از اجرای کد فوق، دیتافریم به شکل زیر دریافت می‌شود:

                 Date    Weekday     Open     High      Low    Close  Adj Close     Volume
J-Date
1396-01-05 2017-03-25   Saturday  77239.0  77494.0  77239.0  77486.0    77485.8  282764388
1396-01-06 2017-03-26     Sunday  77505.0  77542.0  77493.0  77503.0    77502.9  362972179
1396-01-07 2017-03-27     Monday  77519.0  77529.0  77481.0  77523.0    77523.3  356510812
1396-01-08 2017-03-28    Tuesday  77533.0  77577.0  77533.0  77548.0    77548.5  466165632
1396-01-09 2017-03-29  Wednesday  77575.0  77607.0  77565.0  77584.0    77584.4  547432473

به این ترتیب، مشاهده می‌کنیم که مجموعه داده به صورت تعیین‌شده دریافت می‌شود.

حال می‌توانیم یک نمودار شمعی (Candle Stick Plot) برای قیمت رسم کنیم. برای این کار ابتدا Index دیتافریم را به تاریخ میلادی تغییر می‌دهیم:

DF2.index = DF2['Date']

سپس برای رسم نمودار می‌نویسیم:

mplf.plot(DF2[-200:], type='candle', mav=(13, 55))
plt.show()

که نمودار زیر حاصل می‌شود.

دریافت تاریخچه شاخص کل

به این ترتیب، نمودار مورد نظر رسم می‌شود.

می‌توان نمودار OHLC را نیز به شکل زیر رسم کرد:

mplf.plot(DF2[-200:], type='ohlc', mav=(13, 55))
plt.show()

که در این صورت، شکل زیر را خواهیم داشت.

دریافت داده های بورس تهران

به این ترتیب، نمودار OHLC نیز رسم می‌شود. علاوه بر این دو نمودار، نمودارهای Line و Renko و PNF نیز قابل رسم هستند.

به جز شاخص کل، می‌توان از توابع زیر استفاده کرد:

  1. Get_EWI_History: این تابع برای دریافت تاریخچه شاخص کل هم وزن کاربرد دارد.
  2. Get_INDI_History: این تابع برای دریافت تاریخچه شاخص صنعت کاربرد دارد.
  3. Get_ACT50_History: این تابع برای دریافت تاریخچه ۵۰ شرکت فعال‌تر کاربرد دارد.
  4. Get_LCI30_History: این تابع برای دریافت تاریخچه ۳۰ شرکت بزرگ کاربرد دارد.

علاوه بر موارد گفته‌شده، توابع دیگری نیز وجود دارد.

برای مقایسه، می‌توان اطلاعات دو شاخص کل و شاخص کل هم‌وزن را در DF2 و DF3 دریافت کرد:

DF2 = tse.Get_CWI_History(start_date='1396-01-01',
                          end_date='1399-01-01',
                          ignore_date=False,
                          just_adj_close=False,
                          show_weekday=True,
                          double_date=True)

DF3 = tse.Get_EWI_History(start_date='1396-01-01',
                          end_date='1399-01-01',
                          ignore_date=False,
                          just_adj_close=False,
                          show_weekday=True,
                          double_date=True)

حال می‌توانیم ستون Close را در کنار هم رسم کنیم:

CWI = DF2['Adj Close'].to_numpy()
EWI = DF3['Adj Close'].to_numpy()

plt.subplot(1, 2, 1)
plt.plot(CWI, ls='-', lw=1, c='crimson')
plt.title('Tehran Stock Exchange CWI')
plt.xlabel('Time')
plt.ylabel('Value')
plt.yscale('log')

plt.subplot(1, 2, 2)
plt.plot(EWI, ls='-', lw=1, c='crimson')
plt.title('Tehran Stock Exchange EWI')
plt.xlabel('Time')
plt.ylabel('Value')
plt.yscale('log')

plt.show()

که شکل زیر را خواهیم داشت.

دریافت داده های بورس تهران

همچنین، می‌توانیم همبستگی بین این دو شاخص را نیز به شکل زیر در قالب یک نمودار نشان دهیم:

PCC = 100 * stt.pearsonr(CWI, EWI)[0]

plt.scatter(CWI, EWI, s=10, color='crimson')
plt.title(f'Tehran Stock Exchange CWI & EWI Correlation (PCC: {round(PCC, 2)} %)')
plt.xlabel('CWI')
plt.ylabel('EWI')
plt.show()

که نتیجه آن، شکل زیر است.

نمودار همبستگی

به این ترتیب، مشاهده می‌کنیم که شاخص کل با شاخص کل هم‌وزن ٪۹۸ همبستگی دارد که عدد بزرگی است. از طرفی، در بخش ابتدایی نمودار مشاهده می‌کنیم که این رابطه در مقدارهای کمتر از ۱۰۰٬۰۰۰ شاخص کل، ضعیف‌تر است.

علاوه بر قیمت، می‌توان نمودار بالا را برای لگاریتم قیمت نیز رسم کرد:

logCWI = np.log(CWI)
logEWI = np.log(EWI)

PCC = 100 * stt.pearsonr(logCWI, logEWI)[0]

plt.scatter(logCWI, logEWI, s=10, color='crimson')
plt.title(f'Tehran Stock Exchange log(CWI) & log(EWI) Correlation (PCC: {round(PCC, 2)} %)')
plt.xlabel('log(CWI)')
plt.ylabel('log(EWI)')
plt.show()

که در این صورت، نمودار زیر حاصل می‌شود.

نمودار شاخص کل

به این ترتیب، مشاهده می‌کنیم که در حالت لگاریتمی، جزئیات بهتر دیده می‌شوند، از طرفی نیز مقدار ضریب همبستگی پیرسون به عدد ٪۹۷ کاهش می‌یابد. با توجه به رفتار نمایی بازار، همبستگی بین لگاریتم قیمت‌ها، قابل‌استنادتر است.

همین نمودار را می‌توانیم برای تغییرات لگاریتم قیمت رسم کنیم:

difflogCWI = logCWI[1:] - logCWI[:-1]
difflogEWI = logEWI[1:] - logEWI[:-1]

PCC = 100 * stt.pearsonr(difflogCWI, difflogEWI)[0]

plt.scatter(difflogCWI, difflogEWI, s=10, color='crimson')
plt.title(f'Tehran Stock Exchange diff(log(CWI)) & diff(log(EWI)) Correlation (PCC: {round(PCC, 2)} %)')
plt.xlabel('diff(log(CWI))')
plt.ylabel('diff(log(EWI))')
plt.show()

که در این صورت، شکل زیر را خواهیم داشت.

نمودار شاخص کل

به این ترتیب، مشاهده می‌کنیم که همبستگی ٪۹۷ که برای لگاریتم قیمت مشاهده شده بود، در تغییرات لگاریتم قیمت به ٪۸۰ کاهش یافته است. دلیل این اتفاق در انباشت تغییرات نهفته است. اگر یک بازه ۳۰ روز را در نظر بگیریم، اگر تغییرات هر دو شاخص با یکدیگر ٪۸۰ همبستگی داشته باشند، به دلیل انباشت این تغییرات روی هم، مقدار قیمت در طول این بازه همبستگی بیشتری از خود نشان خواهد داد. به همین دلیل، معیار مهم‌تر و قابل اعتمادتر، همبستگی بین تغییرات لگاریتم قیمت است. می‌توان تغییرات نسبی را نیز به جای این معیار استفاده کرد.

دریافت تاریخچه قیمت سهام

برای دریافت تاریخچه قیمت سهام، از تابع Get_Price_History به شکل زیر استفاده می‌کنیم:

DF4 = tse.Get_Price_History(stock='شپنا',
                            start_date='1397-01-01',
                            end_date='1399-01-01',
                            ignore_date=False,
                            adjust_price=True,
                            show_weekday=True,
                            double_date=True)

در این تابع ۲ ورودی جدید وجود دارد که اولی Stock بوده و نماد مورد بررسی را نشان می‌دهد. دومین مورد نیز مربوط به Adjust Price است که تعیین می‌کند قیمت‌های تعدیل‌شده نیز در دیتافریم نهایی افزوده شوند یا خیر.

پس از اجرا، یک دیتا فریم با ۱۸ ستون ایجاد خواهد شد. می‌توانیم دیتافریم را به شکل زیر تمیز و اصلاح کنیم:

DropList = ['Open', 'High', 'Low', 'Close', 'Final',
            'No', 'Ticker', 'Name', 'Part']

DF4.drop(columns=DropList, axis=1, inplace=True)

RenameDict = {'Adj Open': 'Open',
              'Adj High': 'High',
              'Adj Low': 'Low',
              'Adj Close': 'Close',
              'Adj Final': 'Final'}

DF4.rename(columns=RenameDict, inplace=True)

به این ترتیب، دیتافریم تمیزتر شده و به شکل زیر در می‌آید:

                 Date    Weekday   Volume        Value  Open  High  Low  Close  Final
J-Date
1397-01-05 2018-03-25     Sunday  2105211   9110653660   485   488  480    480    483
1397-01-06 2018-03-26     Monday  2920816  12508686541   484   485  475    475    479
1397-01-07 2018-03-27    Tuesday  2509378  10627250267   476   476  471    473    474
1397-01-08 2018-03-28  Wednesday  4395699  18484907932   479   479  467    468    470
1397-01-14 2018-04-03    Tuesday  4699234  19610457457   474   474  465    465    467

دریافت اطلاعات لحظه‌ای بازار

علاوه بر تاریخچه شاخص و سهام، اطلاعات لحظه‌ای نمادها نیز می‌تواند سودمند باشد که آن‌ها را نیز می‌توان به شکل زیر دریافت کرد:

DF5 = tse.Get_MarketWatch(save_excel=False)

در این دیتافریم، ستون‌های متعددی از جمله قیمت‌ها، درصد تغییرات، حد بالا و پایین قیمت مجاز روزانه، ارزش معاملات و صف‌ها، میانگین ارزش سرانه صف‌ها، حجم خرید حقیقی و حقوقی و… وجود دارد. برای آشنایی بیشتر با این تابع، می‌توان دیتافریم حاصل را بررسی کرد و از اطلاعات موجود در آن، برای استخراج شرایط خاص استفاده کرد. یکی از کاربرد‌های این دیتافریم، فیلترنویسی است و به این طریق می‌توان سهامی که از شرایط خاصی برخوردار هستند را شناسایی کرد.

در کتابخانه Finpy-TSE، علاوه به موارد ذکرشده، توابع و امکانات دیگری نیز برای دانلود دسته جمعی دیتا، ساخت پنل قیمت، دریافت ارزش صف‌ها، دریافت دیتای عمق بازار، دریافت سابقه حقیقی-حقوقی وجود دارد که هرکدام بسته به نیاز می‌توانند مورد استفاده قرار گیرند.

معرفی فیلم آموزش پیاده سازی اندیکاتورهای تکنیکال با پایتون Python

فیلم آموزش پایتون

اندیکاتورهای مالی از ابزارهای مهم تحلیل معاملات هستند که با کمک زبان‌های برنامه‌نویسی می‌توان محاسبات مربوط به آن‌ها را انجام داد. در آموزش پیاده سازی اندیکاتورهای تکنیکال با پایتون Python که در ۲ ساعت و ۱۶ دقیقه تهیه و تدوین شده است، ضمن آشنایی کوتاه با ۱۰ اندیکاتور پرکاربرد، پیاده‌سازی گام به گام آن‌ها در محیط زبان برنامه‌نویسی پایتون (Python) ارائه شده است.

  • برای مشاهده آموزش پیاده سازی اندیکاتورهای تکنیکال با پایتون Python + اینجا کلیک کنید.

جمع‌بندی دریافت داده های بورس تهران

در این مطلب، دریافت داده های بورس تهران در بورس و پردازش آن‌ها را بررسی و برخی از امکانات کتابخانه Finpy-TSE را معرفی کردیم. برای مطالعه بیشتر این کتابخانه می‌توانید Documentation آن را مطالعه کنید.

بر اساس رای ۲۹ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
مجله فرادرس
۱۴ thoughts on “دریافت داده های بورس تهران در پایتون — راهنمای گام به گام

درود، امکان دریافت تاریخچه تایم فریم زیر روزانه وجود داره آیا؟
Documentationهارو خوندم، مشخص نبود این موضوع

فرض کنید یک اکسل داریم که اطلاعات روزانه برای هر نماد رو در یک سطر داره
و هر نماد هم سابقش تا روز معاملاتی قبل در اکسل مخصوص خودش هست.
حالا من باید نماد رو از هرسطر بخونم وفایل اکسل اون نماد رو باز کنم و اطلاعات روز رو در سطر آخر اکسل سابقه بنویسم و ببندمش و برای تک تک نماد ها یا سطر اکسل اطلاعات روزانه (همون خروجی اکسل لینک فیلتر بورس) انجامش بده

سلام، با استفاده از کتابخانه Pandas و ماژول os این کار قابل انجام می‌باشد.

سلام
خسته نباشین
چطور میتونم این داده ها رو تو برنامه نویسی اندروید پیاده کنم؟ آیا بورس توابعی برای استفاده از داده هاش داره که بشه ازش استفاده کرد؟و اینکه شما توابع رو از کجا اوردین

ممنونم

سلام،
وقتتون بخیر،
اگر قصد استفاده از زبان برنامه‌نویسی پایتون را داشته باشید، می‌توانید از کتابخانه‌های موجود استفاده کنید، در غیر این صورت می‌تواند با توجه به کد هر نماد، اطلاعات آن را از سایت بورس تهران دریافت نمایید.

سلام باتشکر از مقاله شما
بببخشید من میخوام مظنه قیمت تو اولین پله سفارشات روبعد از هر معامله برای ی سهم ببینم

چجوری می تونم این کار رو انجام بدم

سلام، این اطلاعات از دفتر سفارش (Order Book) قابل استخراج است. با توجه به بازار و نماد مورد نظر، می‌توان از امکانات و APIهای مختلف استفاده نمود. برای دریافت و پردازش دفاتر سفارش در پایتون، در حوزه رمزارزها آموزشی تهیه و منتشر شده است.

سلام
آیا میشه برای تایم فریم مثلا ده دقیقه اطلاعات لحظه ای و تاریخچه رو دانلود کرد؟

سلام،
برای بررسی امکانات موجود در این کتابخانه، می‌توانید به Documentationهای ایجاد شده مراجعه نمایید.
در صورت نبود چنین امکاناتی، می‌توان با استفاده از Web Crawling اطلاعات مورد نیاز را استخراج کرد. مجموعه فرادرس آموزش‌های متنوعی در این حوزه تهیه کرده است.

درود بر شما
من میخواستم corr بین یک نماد وشاخص رو بگیرم، خطا داد گفت تعداد نمونه ها برابر نیست.
این مشکل رو باید چه جوری برطرف کرد؟

با توجه به اینکه شاخص به ازای تمامی روزهای غیرتعطیل موجود می‌باشد اما قسمت نماد ممکن است برای برخی روزهای غیرتعطیل ناموجود باشد، خطای طول را خواهیم داشت. برای رفع این مشکل می‌تواند تنها از تواریخی برای محاسبه همبستگی استفاده کرد که مقدار شاخص و نماد هر دو موجود هستند. به این منظور می‌توانید دو دیتافریم مربوط به قیمت نماد و مقدار شاخص را با استفاده از تابع pandas.concat به هم چسبانده و سطور حاوی مقادیر NaN را با استفاده از DF.drona حذف نمایید.

سلام بسیار ممنون از شما به خاطر مقاله جامع – دقیق – روان و مفیدی در سایت فرادرس قرار دادید
برای من که اطلاعاتم کم بود اموزنده بود

سلام.
آیا امکان داره که رسم نمودارpnf را کاملتر توضیح بدید؟؟

سلام، برای این منظور می‌توانید ورودی type مربوط به تابع mplfinance.plot را به pnf تغییر دهید.

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *