با استفاده از pytse client میتونید به دیتای بازار بورس تهران در پایتون دسترسی داشته باشید. هدف حل مشکلات گرفتن اطلاعات بروز از سایت بازار بورس تهران هست.
لطفا این صفحه رو مطالعه کنید
- دریافت اطلاعات روز های معاملاتی هر سهم و قابلیت ذخیره سازی
- قابلیت گرفتن اطلاعات یک سهام مانند گروه سهام و اطلاعات معاملات حقیقی و حقوقی
- دریافت اطلاعات فاندامنتال یک نماد شامل(eps, p/e ,حجم مبنا)
pip install pytse-client
با استفاده از این تابع میتوان سابقه سهام هارو دریافت کرد و هم اون رو ذخیره و هم توی کد استفاده کرد
import pytse_client as tse
tickers = tse.download(symbols="all", write_to_csv=True)
tickers["ولملت"] # history
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)
این ماژول برای کار با دیتای یک سهم خاص هست و با گرفتن نماد اطلاعات موجود رو میده
برای مثال:
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
15377.0
print(ticker.p_e_ratio) # P/E
6.994212135006828
print(ticker.group_p_e_ratio) # group P/E
9.39
print(ticker.psr) # PSR این نسبت ویژه شرکتهای تولیدی است
66639.9822222222
print(ticker.p_s_ratio) # P/S این نسبت ویژه شرکتهای تولیدی است
1.6138959887677713
print(ticker.base_volume) # حجم مبنا
896459.0
print(ticker.last_price) # آخرین معامله
108800
print(ticker.adj_close) # قیمت پایانی
107550
print(ticker.best_supply_price) # قیمت بهترین تقاضا
108800
print(ticker.best_supply_vol) # حجم بهترین تقاضا
35461
print(ticker.best_demand_price) # قیمت بهترین عرضه
108800
print(ticker.best_demand_vol) # حجم بهترین عرضه
50
print(ticker.shareholders) # اطلاعات سهام داران عمده
print(ticker.get_shareholders_history())) # تاریخچهی سهام داران عمده
print(ticker.get_ticker_real_time_info_response()) # اطلاعات لحظهای مانند قیمت و پیشنهادات خرید و فروش
برای استفاده لازم نیست حتما تابع دانلود صدا زده بشه. اگر این کد رو بدون دانلود کردن سهم استفاده کنید خودش اطلاعات سهم رو از سایت میگیره، اما اگر قبل از اون از دانلود استفاده کرده باشید به جای گرفتن از اینترنت اطلاعات رو از روی فایل میخونه که سریع تر هست
طبق تجربه ای که داشتم چون گاهی اوقات سایت بورس مدت زیادی طول میکشه تا اطلاعات رو بفرسته یا بعضی مواقع نمیفرسته بهتر هست که اول تابع دانلود رو استفاده کنید برای سهمهایی که لازم هست و بعد با دیتای اون ها کار کنید.
بعضی از ویژگیها برای همهی سهم ها در دسترس نیست. برای مثال بعضی از سهم ها دارای آخرین قیمت یا پی به ای یا ای پی اس نیستند. مقدار این ویژگیها در صورت نبودن برابر با 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 هست.
ticker = Ticker("وبملت")
print(ticker.shareholders) # اطلاعات سهام داران عمده
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
برای مثال میشه با استفاده از سهامداران عمده شناور سهم رو حساب کرد:
ticker.shareholders.percentage.sum() # جمع سهام داران
53.63
100 - ticker.shareholders.percentage.sum() # شناور سهم
46.37
با استفاده از تابع get_shareholders_history میشه اطلاعات سهام داران عمده رو گرفت ورودیهای تابع:
from_when=datetime.timedelta(days=90), تعداد روزهای گذشته پیشفرض ۹۰ روز گذشته است
to_when=datetime.datetime.now(), تا چه تاریخی اطلاعات گرفته شود پیشفرض امروز هست
only_trade_days=True, فقط روزهای معاملاتی پیش فرض بله
خروجی این تابع یک دیتا فریم به شکل زیر هست که به صورت csv
,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
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
میشه اطلاعات لحظهای سهام رو گرفت.
نمونهی استفاده
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.adj_close) # آخرین معامله
print(real_time_data.last_price) # قیمت پایانی
# پیشنهادات فروش
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)
اگر درباره پکیج یا استفاده از اون سوالی دارید میتونید توی سرور دیسکورد بپرسید.