An async Python library to fetch data from https://tsetmc.com/.
Requires Python 3.13 or later.
pip install tsetmc
Let's start with a simple script:
import asyncio
from tsetmc.instruments import Instrument
async def main():
inst = await Instrument.from_l18('فملی')
info = await inst.info()
print(info)
asyncio.run(main())The Instrument class provides many methods for getting information about an instrument.
The following code blocks try to demonstrate some of its capabilities.
Note: You need an asyncio capable REPL, like python -m asyncio or IPython, to run the following code samples, otherwise you'll have to run them inside an async function like the sample code above.
>>> from tsetmc.instruments import Instrument
>>> inst = await Instrument.from_l18('فملی')
>>> await inst.info()
{'eps': {'epsValue': None,
'estimatedEPS': '721',
'sectorPE': 12.02,
'psr': 1472.8279},
'sector': {'dEven': 0, 'cSecVal': '27 ', 'lSecVal': 'فلزات اساسی'},
'staticThreshold': {'insCode': None,
'dEven': 0,
'hEven': 0,
'psGelStaMax': 8270.0,
'psGelStaMin': 7190.0},
'minWeek': 7630.0,
'maxWeek': 7970.0,
'minYear': 4630.0,
'maxYear': 10670.0,
'qTotTran5JAvg': 179233329.0,
'kAjCapValCpsIdx': '43',
'dEven': 0,
'topInst': 1,
'faraDesc': '',
'contractSize': 0,
'nav': 0.0,
'underSupervision': 0,
'cValMne': None,
'lVal18': 'S*I. N. C. Ind.',
'cSocCSAC': None,
'lSoc30': None,
'yMarNSC': None,
'yVal': '300',
'insCode': '35425587644337450',
'lVal30': 'ملی\u200c صنایع\u200c مس\u200c ایران\u200c',
'lVal18AFC': 'فملی',
'flow': 1,
'cIsin': 'IRO1MSMI0000',
'zTitad': 600000000000.0,
'baseVol': 15584416,
'instrumentID': 'IRO1MSMI0001',
'cgrValCot': 'N1',
'cComVal': '1',
'lastDate': 0,
'sourceID': 0,
'flowTitle': 'بازار بورس',
'cgrValCotTitle': 'بازار اول (تابلوی اصلی) بورس'}Getting the latest price information:
>>> await inst.closing_price_info()
{'instrumentState': {'idn': 0,
'dEven': 0,
'hEven': 0,
'insCode': None,
'cEtaval': 'A ',
'realHeven': 0,
'underSupervision': 0,
'cEtavalTitle': 'مجاز'},
'instrument': None,
'lastHEven': 170725,
'finalLastDate': 20230524,
'nvt': 0.0,
'mop': 0,
'thirtyDayClosingHistory': None,
'priceChange': 0.0,
'priceMin': 7630.0,
'priceMax': 7900.0,
'priceYesterday': 7730.0,
'priceFirst': 7750.0,
'last': True,
'id': 0,
'insCode': '0',
'dEven': 20230524,
'hEven': 170725,
'pClosing': 7700.0,
'iClose': False,
'yClose': False,
'pDrCotVal': 7670.0,
'zTotTran': 7206.0,
'qTotTran5J': 84108817.0,
'qTotCap': 648015842640.0}Getting the daily trade history for the last n days: (as a DataFrame)
>>> await inst.daily_closing_price(n=2)
priceChange priceMin priceMax ... zTotTran qTotTran5J qTotCap
0 30.0 7490.0 7600.0 ... 4555.0 75649965.0 5.689944e+11
1 10.0 7500.0 7590.0 ... 4614.0 83570336.0 6.276337e+11
[2 rows x 17 columns]Getting adjusted daily prices:
>>> await inst.price_history(adjusted=True)
pmax pmin pf pl tvol pc
date
2007-02-04 45 41 45 42 172898994 42
2007-02-05 43 43 43 43 10826496 43
2007-02-06 44 44 44 44 26850133 44
2007-02-07 45 45 45 45 31086849 45
2007-02-10 45 45 45 45 40645528 45
... ... ... ... ... ...
2021-07-12 13340 12840 13110 12860 106208763 13020
2021-07-13 13010 12640 12840 12680 66812306 12770
2021-07-14 12830 12450 12540 12690 70277940 12670
2021-07-17 12960 12550 12800 12640 68542961 12750
2021-07-18 12880 12530 12600 12630 88106162 12650
[3192 rows x 6 columns]Getting intraday data for a specific date:
>>> await inst.on_date(20210704).states() # a dataframe:
idn dEven hEven insCode cEtaval realHeven underSupervision cEtavalTitle
0 0 0 1 0 A 94838 0 NoneSearching for an instrument:
>>> await Instrument.from_search('چادرملو')
Instrument(18027801615184692, 'کچاد')The instruments.price_adjustments function gets all the price adjustments for a specified flow.
The market_watch module contains several function to fetch market watch data. They include:
market_watch_initmarket_watch_plusclosing_price_allclient_type_allkey_statsombud_messagesstatus_changes
Use market_watch.MarketWatch for watching the market. Here is how:
from asyncio import new_event_loop
from tsetmc.market_watch import MarketWatch
async def listen_to_update_events():
while True:
await market_watch.update_event.wait()
df = market_watch.df
print(df.at['35425587644337450', 'pl']) # last price of فملی
market_watch = MarketWatch()
loop = new_event_loop()
watch_task = loop.create_task(listen_to_update_events())
loop.run_until_complete(market_watch.start())There are many other functions and methods that are not covered here. Explore the codebase to learn more.
To keep the offline dataset up-to-date, run the tsetmc.dataset.update() function periodically (e.g., daily). This dataset acts as a cache for basic information about common instruments.
If you are interested in other information available on tsetmc.com that this library has no API for, please open an issue for them.