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

چند روز پیش بود که برای یک پروژه شخصی در حال جمع‌‌آوری تاریخچه قیمت سهام در بورس تهران بودم، برای جمع‌آوری و منظم کردن اطلاعات از یک پایگاه‌داده کوچک و سبک مبتنی بر `sqlite` استفاده کردم. بعد از کمی کار کردن به این نتیجه رسیدم که میشه با کمی‌ دستکاری یک بسته مناسب برای دسترسی راحت به قیمت ‌های بورس برای استفاده علاقه‌مندان به بورس و پایتون آماده کرد. حالا نسخه ابتدایی این بسته آماده است و از طریق github و pypi با نام `tehran_stocks` در دسترس است.

تزئینی :)
تزئینی :)

ویژگی‌های بسته

  • دریافت خودکار لیست سهم‌ها همراه با اطلاعات ابتدایی
  • امکان دریافت خودکار تاریخچه قیمت کل سهم‌ها
  • امکان دریافت تاریخچه قیمت سهم‌های یک گروه ( مانند گروه خودرو)
  • امکان دریافت تاریخچه قیمت یک سهم خاص
  • امکان بروز رسانی قیمت
  • مبتنی بر PANDAS
  • و sqlite
  • سهام شی‌‌ءگرا

نصب بسته

مثل هر پکیج پایتون شما میتونید به راحتی با استفاده از `pip` بسته سهام تهران رو نصب کنید:

‍‍pip install tehran_stocks

روش توصیه شده برای استفاده از محیط مجازی پایتون برای این پکیچ `pipenv` ولی شما میتونید از هر روش که مایلید این بسته رو استفاده کنید. در زمان نگارش این متن نسخه ۰.۵.۳ آخرین نسخه منتشر شده در گیت‌‌هاب و پای‌پای هست. برای اینکه مطمئن باشید همه چیز تحت کنترل هست مطمئن باشید که شما هم نسخه ۰.۵.۳ را نصب دارید، در غیر این صورت حتما به مستندات موجود در گیت‌هاب سهام تهران مراجعه کنید.

استفاده از بسته

برای استفاده از پکیج نیاز به یک راه‌اندازی ابتدایی هست و برای راه‌اندازی ابتدایی دو راه حل وجود دارد:

راه حل اول:

در یک محیط مثل ژوپیتر یا در یک فایل پایتون ساده خط زیر رو وارد کنید:

import tehran_stocks

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

Do you want to download all price? [y,(n)]

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

راه حل دوم:

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

 ts-get init

با اجرای دستور بالا دیتابیس آماده شده و در صورتی که اولین اجرا باشد از شما در مورد دانلود تمامی اطلاعات سوال می‌کند و مطابق تصمیم شما عمل می‌کند.

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

دریافت و بروزرسانی قیمت‌ها

برای دریافت و بروزرسانی قیمت ها چند روش وجود داره، نکته مهم و جالب اینه که دریافت برای اولین بار و همینطور بروزرسانی پایگاه داده در همه حالت‌ها با یک دستور انجام میشه، فعلا ۳ روش برای دریافت قیمت‌ها وجود دارد:

  1. دریافت و بروزرسانی همه قیمت‌ها
  2. دریافت و بروزرسانی قیمت‌ها در یک گروه خاص( مثلا گروه خودرو یا etf‌ها)
  3. دریافت و بروزرسانی قیمت‌ها برای یک سهم

بروزرسانی همه قیمت‌ها:

برای بروزرسانی قیمت دو راه حل وجود دارد. استفاده از خط فرمان(command line) و استفاده از کد پایتون.

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

ts-get update

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

در کد پایتون نیز میتونید دستور زیر رو وارد کنید:

from tehran_stocks import get_all_price
get_all_price()


بعد از اجرای کد همه قیمت‌ها در دسترس شماست.

فرآیند دریافت کل قیمت‌ها بسته به سرعت اینترنت شما ممکن است تا چندساعت نیز زمان ببرد ولی با یک سرعت مناسب در ۲۰ دقیقه دریافت می‌شود.

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

برای استفاده از این روش باید کد گروه مورد نظر رو بدونید برای بدست آوردن این عدد میتونید از روش زیر استفاده کنید:

در خط فرمان:

ts_get get_groups 

که احتمالا بخاطر عدم پشتیبانی از فارسی با مشکل مواجه میشید و یا در یک محیط دیگر مثل ژوپیتر نوت‌بوک:

‍‍from tehran_stock import Stocks # we will talk about Stocks later
Stock.get_group()

حالا میتونید با یکی از این دو روش قیمت‌های مربوط به گروه مورد نظر رو بدست بیارید، مثلا برای گروه خودرو با کد ۳۴ در خط فرمان

ts-get group 34

یا در محیط پایتون:

from tehran_stock import update_group
update_group(34)‍

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

برای استفاده از روش سوم باید کمی در مورد دسترسی به سهم‌ها صحبت کنیم.

تزئینی :)
تزئینی :)

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

سهم‌ در بسته سهام تهران به زبان پایتونی یک شی‌ء هستند که ویژگی‌های خاص خود را دارند. نام،نماد، گروه و تاریخچه قیمت از جمله ویژگی‌های موجود برای هر سهم هستند. برای استفاده از Stocks باید آن را وارد کنیم:

‍‍from tehran_stock import Stocks

با استفاده از Stocks می‌توانید به تمامی سهم‌های موجود( که دارای سابقه قیمت هستند) دسترسی پیدا کنید.

برای دسترسی به سهم‌ها می‌توانید از چند پارامتر استفاده کنید،نماد سهم(name)، عنوان سهم(title)و کد سهم(code) که در آدرس سهم در سایت tsetmc.com وجود دارد.

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

s‍‍tock = Stocks.query.filter_by(code='35700344742885862').first()

stock = Stocks.query.filter_by(name='کگل').first()

stock = Stocks.query.filter(Stocks.title.like'%گل گهر%').first() #its based on sqlalchemy

بعد از این شما می‌توانید به اطلاعات سهم گل‌گهر دسترسی دارید.

در نسخه فعلی ۴ متد برای هر سهم وجود دارد.

  1. stock.df # دسترسی به دیتافریم قیمت‌ سهم، شامل قیمت گشایش، قیمت بسته‌شدن،قیمت پایانی حجم معاملات و...
  2. stock.update() # این متد بروزرسانی قیمت سهم را انجام می‌دهد.
  3. stock.summary() # تاریخ آغاز ، پایان و تعداد روز‌های معامله شده سهم را نمایش می‌دهد.
  4. self.display() # اطلاعات کلی سهم را نمایش می‌دهد.

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

در نسخه فعلی مهمترین ویژگی‌ بسته دسترسی به دیتافریم هر سهم است. اگر با PANDAS آشنایی داشته باشید براحتی میتونید مسیر خودتون رو برای کارهای علمی و مالی ادامه بدید، اگر هم مایلید که از یک ابزار دیگر برای پردازش‌‌های خود استفاده کنید می‌توانید به راحتی با استفاده از یکی از متد‌های زیر تاریخچه قیمت را به خروجی مورد نظر خود تبدیل کنید:

stock.df.to_csv('price.csv')
stock.df.to_excel('price.xlsx')
stock.df.to_stata('price.dta')

نکات پایانی

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

در بروزرسانی‌های آتی بسته سعی می‌کنم علاوه بر بهبود عملکرد، تسهیل جستجوی سهام و اضافه کردن تقویم شمسی برخی از پردازش‌های متداول رو هم به بسته اضافه کنم. چیزی مثل محاسبه رشد قیمت یا اجرای یک مدل سری‌زمانی برای پیش‌بینی(مثل ARIMA) و حتی اضافه‌کردن محاسبه شاخص‌های تکنیکال. توی این مسیر خوشحال می‌شم که نیاز‌ها و پیشنهاد‌های خودتون را از طریق تلگرام، توییتر و یا از طریق گیت‌هاب با من در میان بگذارید.

+ ممنون می‌شم که این بسته رو به دوستان خودتون معرفی کنید و اگر دوست داشتید یک ستاره در گیت‌هاب بهش اعطا کنید.

+ این بسته لیسانسش رو از MIT گرفته در نتیجه می‌تونید این بسته رو برای هر نیتی و با هر عنوان منتشر کنید و از اون برای بهتر کردن فعالیت‌هاتون استفاده کنید و اگر مایل بودید به بهتر شدن این بسته کمک کنید.

https://github.com/ghodsizadeh/tehran-stocks