Skip to main content

tehran stock exchange(TSE) client in python

Project description

دریافت اطلاعات بازار بورس تهران

Python application Language grade: Python Discord Chat

با استفاده از pytse client میتونید به دیتای بازار بورس تهران در پایتون دسترسی داشته باشید. هدف حل مشکلات گرفتن اطلاعات بروز از سایت بازار بورس تهران هست.

میخواید مشارکت کنید؟

لطفا این صفحه رو مطالعه کنید

قابلیت‌ها

  • دریافت اطلاعات روزهای معاملاتی هر سهم و قابلیت ذخیره‌سازی
  • قابلیت گرفتن اطلاعات یک سهام مانند گروه سهام و اطلاعات معاملات حقیقی و حقوقی
  • دریافت اطلاعات فاندامنتال یک نماد شامل (EPS ,P/E و حجم مبنا)

نصب

pip install pytse-client

نحوه استفاده

دانلود سابقه سهم‌ها

با استفاده از این تابع می‌توان سابقه سهام رو دریافت کرد و هم اون رو ذخیره و هم توی کد استفاده کرد

import pytse_client as tse

tickers = tse.download(symbols="all", write_to_csv=True)
print(tickers["ولملت"])  # history

# Output
            date     open     high  ...     volume  count    close
0     2009-02-18   1050.0   1050.0  ...  330851245    800   1050.0
1     2009-02-21   1051.0   1076.0  ...  335334212   6457   1057.0
2     2009-02-22   1065.0   1074.0  ...    8435464    603   1055.0
3     2009-02-23   1066.0   1067.0  ...    8570222    937   1060.0
4     2009-02-25   1061.0   1064.0  ...    7434309    616   1060.0
...          ...      ...      ...  ...        ...    ...      ...
2323  2020-04-14   9322.0   9551.0  ...  105551315  13536   9400.0
2324  2020-04-15   9410.0   9815.0  ...  201457026  11322   9815.0
2325  2020-04-18  10283.0  10283.0  ...  142377245   8929  10283.0
2326  2020-04-19  10797.0  10797.0  ...  292985635  22208  10380.0
2327  2020-04-20  10600.0  11268.0  ...  295590437  16313  11268.0

برای دانلود سابقه یک یا چند سهم کافیست اسم اون‌ها به تابع داده بشه:

همچنین با گذاشتن write_to_csv=True سابقه سهم توی فایلی با نماد سهم نوشته میشه

سابقه سهم در قالب Dataframe است

در صورتی که می‌خواهید تاریخ شمسی به خروجی اضافه شود می‌توانید با گذاشتن include_jdate=True این امکان را فراهم کنید

برای دریافت قیمت‌های تعدیل شده از adjust=True استفاده کنید

import pytse_client as tse

tse.download(symbols="وبملت", write_to_csv=True)
tse.download(symbols="وبملت", write_to_csv=True, include_jdate=True)
tse.download(symbols=["وبملت", "ولملت"], write_to_csv=True)

دانلود سابقه معاملات حقیقی و حقوقی به صورت مجزا

برای دانلود سابقه معاملات حقیقی و حقوقی برای تمامی نمادها می‌توان از تابع زیر استفاده کرد

from pytse_client import download_client_types_records

if __name__ == '__main__':
    records_dict = download_client_types_records("all")
    print(records_dict["فولاد"])
  
# Output
date         individual_buy_count  ... individual_ownership_change

2020-09-01                36298  ...                   -691857.0
2020-08-31                58185  ...                  83789408.0
2020-08-26                  461  ...                  21647730.0
2020-08-25                 1248  ...                  14716846.0
2020-08-24                38291  ...                -238454702.0
...                         ...  ...                         ...
2008-12-02                    7  ...                    -10000.0
2008-12-01                    8  ...                         0.0
2008-11-30                   10  ...                    -12781.0
2008-11-29                  116  ...                   4596856.0
2008-11-26                   14  ...                    -20000.0

[2518 rows x 17 columns]

مشابه تابع قبلی می‌توان نتایج را ذخیره کرد

from pytse_client import download_client_types_records

if __name__ == '__main__':
    # Records are saved as a .csv file with the same name of ticer's
    records = download_client_types_records("فولاد", write_to_csv=True)

ماژول Ticker

این ماژول برای کار با دیتای یک سهم خاص هست و با گرفتن نماد اطلاعات موجود رو میده

برای مثال:

import pytse_client as tse

tse.download(symbols="نوری", write_to_csv=True)  # optional
ticker = tse.Ticker("نوری")

print(ticker.history)  # سابقه قیمت سهم
print(ticker.client_types)  # حقیقی حقوقی
print(ticker.title)  # نام شرکت
پتروشيمي نوري (نوري)
print(ticker.url)  # آدرس صفحه سهم
http://tsetmc.com/Loader.aspx?ParTree=151311&i=19040514831923530
print(ticker.group_name)  # نام گروه
محصولات شيميايي
print(ticker.fiscal_year)  # سال مالی
12/29
print(ticker.eps)  # EPS
16442.0
print(ticker.p_e_ratio)  # P/E
6.705388638851721
print(ticker.group_p_e_ratio)  # group P/E
8.24
print(ticker.nav)  # NAV خالص ارزش دارایی‌ها ویژه صندوق‌ها می‌باشد
112,881
print(ticker.nav_date)  # last date of NAV تاریخ بروزرسانی خالص ارزش دارایی‌ها ویژه صندوق‌ها می‌باشد
1400/7/25 13:58:00
print(ticker.psr)  # PSR این نسبت ویژه شرکت‌های تولیدی است
71483.0238888889
print(ticker.p_s_ratio)  # P/S این نسبت ویژه شرکت‌های تولیدی است
1.5423242331125966
print(ticker.base_volume)  # حجم مبنا
918780.0
print(ticker.state)  # وضعیت نماد
مجاز
print(ticker.last_price)  # آخرین معامله
109940
print(ticker.adj_close)  # قیمت پایانی
110250
print(ticker.yesterday_price)  # قیمت دیروز
106800
print(ticker.open_price)  # قیمت اولین معامله
108200
print(ticker.high_price)  # قیمت حداکثر
111830
print(ticker.low_price)  # قیمت حداقل
108200
print(ticker.count)  # تعداد معاملات
3934
print(ticker.volume)  # حجم معاملات
2602437
print(ticker.value)  # ارزش معاملات
286919407590
print(ticker.last_date)  # تاریخ آخرین اطلاعات قیمت پایانی ناشی از تغییرات شرکتی و معاملات
2021-11-01 12:29:54
print(ticker.best_supply_price)  # قیمت بهترین تقاضا
109960
print(ticker.best_supply_vol)  # حجم بهترین تقاضا
8296
print(ticker.best_demand_price)  # قیمت بهترین عرضه
109920
print(ticker.best_demand_vol)  # حجم بهترین عرضه
3620
print(ticker.total_shares)  # تعداد سهام
print(ticker.shareholders)  # اطلاعات سهام‌داران عمده
print(ticker.get_shareholders_history())) # تاریخچه‌ی سهام‌داران عمده
print(ticker.get_trade_details())  # ریز معاملات روز جاری
print(ticker.get_ticker_real_time_info_response()) # اطلاعات لحظه‌ای مانند قیمت و پیشنهادات خرید و فروش
برای دریافت قیمت‌های تعدیل شده هم میشه از این کد استفاده کرد
import pytse_client as tse

ticker = tse.Ticker(symbol="بركت", adjust=True)

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

نکته ۱

طبق تجربه‌ ای که داشتم چون گاهی اوقات سایت بورس مدت زیادی طول میکشه تا اطلاعات رو بفرسته یا بعضی مواقع نمی‌فرسته بهتر هست که اول تابع دانلود رو استفاده کنید برای سهم‌هایی که لازم هست و بعد با دیتای اون‌ها کار کنید.

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

نکته ۲

بعضی از ویژگی‌ها برای همه‌ی سهم‌ها در دسترس نیست. برای مثال بعضی از سهم‌ها دارای آخرین قیمت یا پی به ای یا ای پی اس نیستند. مقدار این ویژگی‌ها در صورت نبودن برابر با None خواهد بود. پس باید در برنامه خود اینکه این مقادیر وجود دارند را بررسی کنید.

اطلاعات نماد‌های حذف شده

تعدادی از نماد‌ها توی سایت به شکل حذف شده هستند. برای گرفتن دیتای این نماد‌ها از ماژول تیکر استفاده کنید. برای مثال جهت دسترسی به دیتای نماد حذف شده خصدرا، اندیس آن را از آدرس نماد در سایت بورس بگیرید http://www.tsetmc.com/Loader.aspx?ParTree=151311&i=25165947991415904

import pytse_client as tse

ticker = tse.Ticker("", index="25165947991415904")

مقدار ‍index را با مقدار جلوی i= جایگزین میکنیم.

اطلاعات حقیقی و حقوقی

اطلاعات خرید و فروش حقیقی و حقوقی سهام رو میشه از طریق ticker.client_types گرفت این اطلاعات یه DataFrame شامل اطلاعات موجود در تب حقیقی حقوقی(تب بنفشی که در این صفحه هست) سهم هست:

date : تاریخ
individual_buy_count : تعداد معاملات خرید حقیقی
corporate_buy_count : تعداد معلاملات خرید حقوقی
individual_sell_count : تعداد معاملات فروش حقیقی
corporate_sell_count : تعداد معلاملات فروش حقوقی
individual_buy_vol : حجم خرید حقیقی
corporate_buy_vol : حجم خرید حقوقی
individual_sell_vol : حجم فروش حقیقی
corporate_sell_value : حجم فروش حقوقی
individual_buy_mean_price : قیمت میانگین خرید حقیقی
individual_sell_mean_price : قیمت میانگین فروش حقیقی
corporate_buy_mean_price : قیمت میانگین خرید حقوقی
corporate_sell_mean_price : قیمت میانگین فروش حقوقی
individual_ownership_change : تغییر مالکیت حقوقی به حقیقی

سهامداران عمده

سهام‌داران عمده اطلاعات داخل این صفحه هست. این اطلاعات رو میشه با shareholders گرفت که یک DataFrame هست.

import pytse_client as tse

ticker = Ticker("وبملت")
print(ticker.shareholders)  # اطلاعات سهام‌داران عمده

# Output
 change   percentage       share                                 shareholder  
0   دولت جمهوري اسلامي ايران                    23,114,768,760  11.160     0     
1   صندوق تامين آتيه كاركنان بانك ملت           13,353,035,330  6.440      0      
2   صندوق سرمايه گذاري واسطه گري مالي يكم       11,748,764,647  5.670      0      
3   شركت پتروشيمي فن آوران-سهامي عام-           9,253,327,080   4.460      0      
4   شركت گروه مالي ملت-سهام عام-                8,933,698,834   4.310      0      
5   صندوق سرمايه گذاري.ا.بازارگرداني ملت     8,395,500,914   4.050      0   
6   شركت سرمايه گذاري صباتامين-سهامي عام-       7,659,597,269   3.690      0      
7   شركت تعاوني معين آتيه خواهان                4,561,801,327   2.200      0      
8   شركت س اتهران س.خ-م ك م ف ع-                4,278,903,677   2.060      0      
9   شركت گروه توسعه مالي مهرآيندگان-سهامي عام-  4,161,561,525   2.000      0      
10  شركت س اخراسان رضوي س.خ-م ك م ف ع-          3,442,236,423   1.660      0      
11  شركت س افارس س.خ-م ك م ف ع-                 2,593,956,288   1.250      0      
12  شركت س اخوزستان س.خ-م ك م ف ع-              2,526,080,803   1.220      0      
13  شركت شيرين عسل-سهامي خاص-                   2,496,936,881   1.200      0      
14  شركت سرمايه گذاري ملي ايران-سهامي عام-      2,423,674,676   1.170      0      
15  شركت س ااصفهان س.خ-م ك م ف ع-               2,274,221,331   1.090      0      
شناور سهم

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

import pytse_client as tse

ticker = Ticker("وبملت")

print(ticker.shareholders.percentage.sum())  # جمع درصد سهام‌داران عمده
53.63

print(100 - ticker.shareholders.percentage.sum())  # درصد سهام شناور 
46.37
تاریخچه‌ی سهام‌داران عمده

با استفاده از تابع get_shareholders_history میشه تاریخچه اطلاعات سهام‌داران عمده رو گرفت:

import pytse_client as tse

ticker = Ticker("وبملت")
ticker.get_shareholders_history(
    from_when=datetime.timedelta(days=90),  # تعداد روز‌های گذشته که مقدار پیشفرض ۹۰ روز است
    to_when=datetime.datetime.now(),  # تا چه تاریخی اطلاعات گرفته شود که پیشفرض امروز است
    only_trade_days=True,  # فقط روز‌های معاملاتی که پیشفرض بله است
)
خروجی این تابع یک دیتا فریم حاوی دیتای زیر است:
,date,shareholder_id,shareholder_shares,shareholder_percentage,shareholder_instrument_id,shareholder_name,change
0,2021-08-30 17:01:23.037957,273,2910355428.0,32.19,IRO1RSAP0000,شركت ايراني توليداتومبيل-سايپا-,1
1,2021-08-30 17:01:23.037957,406,975144471.0,10.78,IRO1RSAP0000,شركت سايپا,1
2,2021-08-30 17:01:23.037957,50264,454000000.0,5.02,IRO1RSAP0000,شركت ايراني توليداتومبيل سايپا-سهامي عام-,1
3,2021-08-30 17:01:23.037957,42636,409843922.0,4.53,IRO1RSAP0000,شركت سرمايه گذاري وتوسعه صنعتي نيوان ابتكارس.ع,1
4,2021-08-30 17:01:23.037957,46966,116002189.0,1.28,IRO1RSAP0000,BFMصندوق.س.ا.بازارگرداني سهم آشنايكم,1
5,2021-08-31 17:01:23.037957,273,2910355428.0,32.19,IRO1RSAP0000,شركت ايراني توليداتومبيل-سايپا-,1
6,2021-08-31 17:01:23.037957,406,975144471.0,10.78,IRO1RSAP0000,شركت سايپا,1
7,2021-08-31 17:01:23.037957,50264,454000000.0,5.02,IRO1RSAP0000,شركت ايراني توليداتومبيل سايپا-سهامي عام-,1
8,2021-08-31 17:01:23.037957,42636,409843922.0,4.53,IRO1RSAP0000,شركت سرمايه گذاري وتوسعه صنعتي نيوان ابتكارس.ع,1
9,2021-08-31 17:01:23.037957,46966,116002189.0,1.28,IRO1RSAP0000,BFMصندوق.س.ا.بازارگرداني سهم آشنايكم,1
10,2021-09-01 17:01:23.037957,273,2910355428.0,32.19,IRO1RSAP0000,شركت ايراني توليداتومبيل-سايپا-,1
11,2021-09-01 17:01:23.037957,406,975144471.0,10.78,IRO1RSAP0000,شركت سايپا,1
12,2021-09-01 17:01:23.037957,50264,454000000.0,5.02,IRO1RSAP0000,شركت ايراني توليداتومبيل سايپا-سهامي عام-,1
13,2021-09-01 17:01:23.037957,42636,409843922.0,4.53,IRO1RSAP0000,شركت سرمايه گذاري وتوسعه صنعتي نيوان ابتكارس.ع,1
14,2021-09-01 17:01:23.037957,46966,116002189.0,1.28,IRO1RSAP0000,BFMصندوق.س.ا.بازارگرداني سهم آشنايكم,1

گرفتن این دیتا کار زمان بری هست (با توجه به تعداد روزی که لازم دارید) و سریع کردن کار با کد به راحتی امکان پذیر نیست. سعی نکنید با همزمان اجرا کردن این تابع برای سهم‌های مختلف روند رو سریع‌تر کنید چون سایت ip رو بلاک میکنه. اگر موقع اجرای کد پیغام زیر را به تعداد زیاد گرفتید (مثلا هر ثانیه این پیغام اومد) یعنی آیپی شما توسط سایت بورس بلاک شده و چند دقیقه صبر کنید و دوباره ادامه بدید.
Retrying pytse_client.ticker.ticker.Ticker._get_ticker_daily_info_page_response in 1.3127419515957892 seconds as it raised ClientResponseError: 500, message='Internal Server Error', url=URL('http://cdn.tsetmc.com/Loader.aspx?ParTree=15131P&i=56574323121551263&d=20210220').
اطلاعات لحظه‌ای سهام

از طریق تابع get_ticker_real_time_info_response میشه اطلاعات لحظه‌ای سهام رو گرفت. نمونه‌ی استفاده

import pytse_client as tse

ticker = Ticker("وبملت")
real_time_data = ticker.get_ticker_real_time_info_response()

print(real_time_data.buy_orders) # پیشنهادات خرید
print(real_time_data.sell_orders) # پیشنهادات فروش
print(real_time_data.best_supply_price)  # قیمت بهترین تقاضا
print(real_time_data.best_supply_vol)  # حجم بهترین تقاضا
print(real_time_data.best_demand_price)  # قیمت بهترین عرضه
print(real_time_data.best_demand_vol)  # حجم بهترین عرضه
print(real_time_data.state)  # وضعیت نماد
print(real_time_data.last_price)  # قیمت آخرین معامله
print(real_time_data.adj_close)  # قیمت پایانی
print(real_time_data.yesterday_price)  # قیمت دیروز
print(real_time_data.open_price)  # قیمت اولین معامله
print(real_time_data.high_price)  # قیمت حداکثر
print(real_time_data.low_price)  # قیمت حداقل
print(real_time_data.count)  # تعداد معاملات
print(real_time_data.volume)  # حجم معاملات
print(real_time_data.value)  # ارزش معاملات
print(real_time_data.last_date)  # آخرین اطلاعات قیمت ناشی از تغییرات شرکتی و معاملات

# پیشنهادات فروش
for sell_order in real_time_data.sell_orders:
    print(sell_order.volume, sell_order.count, sell_order.price)

# پیشنهادات خرید
for buy_order in real_time_data.buy_orders:
    print(buy_order.volume, buy_order.count, buy_order.price)

# اطلاعات خرید و فروش حقیقی و حقوقی
print(real_time_data.individual_trade_summary.buy_count)
print(real_time_data.individual_trade_summary.buy_vol)
print(real_time_data.individual_trade_summary.sell_count)
print(real_time_data.individual_trade_summary.sell_vol)
print(real_time_data.corporate_trade_summary.buy_count)
print(real_time_data.corporate_trade_summary.buy_vol)
print(real_time_data.corporate_trade_summary.sell_count)
print(real_time_data.corporate_trade_summary.sell_vol)
ریز معاملات سهام

از طریق تابع get_trade_details می‌توان ریز معاملات آخرین روز معاملاتی سهام را گرفت:

import pytse_client as tse

ticker = tse.Ticker("نوری")
trade_details = ticker.get_trade_details()
print(trade_details)

# Output
          date  volume     price
0     09:00:20   10000  111900.0
1     09:00:20    4480  111900.0
2     09:00:20    3171  111900.0
3     09:00:20    1647  111900.0
4     09:00:20    1101  111900.0
       ...     ...       ...
6478  12:29:57    1163  116000.0
6479  12:29:57    2159  116000.0
6480  12:29:57     795  116000.0
6481  12:29:58     257  116000.0
6482  12:29:59     601  116000.0

کامیونیتی

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

https://discord.gg/ampPDKHpVv

پکیج‌های مورد نیاز:

الهام گرفته از:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytse-client-0.11.0rc1.tar.gz (82.0 kB view hashes)

Uploaded Source

Built Distribution

pytse_client-0.11.0rc1-py3-none-any.whl (81.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page