Skip to main content

a library to retrieve data from tsetmc.com website

Project description

Pytest Status

An async Python library to fetch data from https://tsetmc.com/.

Installation

Requires Python 3.13 or later.

pip install tsetmc

Overview

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         None

Searching 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_init

  • market_watch_plus

  • closing_price_all

  • client_type_all

  • key_stats

  • ombud_messages

  • status_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.

See also

Project details


Release history Release notifications | RSS feed

This version

3.0.3

Download files

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

Source Distribution

tsetmc-3.0.3.tar.gz (254.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tsetmc-3.0.3-py3-none-any.whl (256.9 kB view details)

Uploaded Python 3

File details

Details for the file tsetmc-3.0.3.tar.gz.

File metadata

  • Download URL: tsetmc-3.0.3.tar.gz
  • Upload date:
  • Size: 254.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for tsetmc-3.0.3.tar.gz
Algorithm Hash digest
SHA256 302d7400d0aed8a1c89d208d25c6c182cec4911fd788ff539f1d20a559cc265d
MD5 1295718d364163c53945ab31419c32c0
BLAKE2b-256 3d046a5a6e3dd12d8e4e569e11e628e30253b76e0ae570f2dc4042f195704c50

See more details on using hashes here.

File details

Details for the file tsetmc-3.0.3-py3-none-any.whl.

File metadata

  • Download URL: tsetmc-3.0.3-py3-none-any.whl
  • Upload date:
  • Size: 256.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for tsetmc-3.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 122e998957ba9093d553a7bcc7a8716eb43555033e42a8300d001c4acd071d28
MD5 ca41843bdbee6b408a0a641015bceda7
BLAKE2b-256 9d2af8ec3edb8749b83ca3da2b13dd2a04b2e98376107d4fa6a49756b424defb

See more details on using hashes here.

Supported by

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