Skip to main content

Oxtapus 1.2

Tests PyPI downloads Supported Python versions Package version

⁧⁦Oxtapus⁩ یه بستهٔ پایتون تایپ‌شده و مبتنی بر ⁦Polars⁩ برای داده‌های بازار مالی ایرانه. شاخهٔ ⁦1.x⁩ با یه معماری و رابط برنامه‌نویسی کاملاً تازه ساخته شده؛ یعنی هم برای کارهای سریع داخل نوت‌بوک جمع‌وجوره و هم زیرِ همین ظاهر ساده، سرویس‌های تایپ‌شده، قراردادهای مشخص برای فراهم‌کننده‌ها، انتقال مقاوم ⁦HTTPX2⁩ و خط لوله داده قابل‌بازپخش داره تا توی پروژه‌های بزرگ‌تر هم بشه روش حساب کرد.⁩

⁧با ⁦Oxtapus⁩ می‌تونی به داده‌های عمومی بورس اوراق بهادار تهران و بازار سرمایه ایران از منبع ⁦TSETMC⁩ دسترسی داشته باشی. این پروژه مستقل و غیررسمیه و هیچ وابستگی یا تأییدی از طرف ⁦TSETMC⁩ نداره.⁩

⁧تاریخچهٔ قیمت دلار آزاد، دلار نیما، یورو، سکه امامی و نیم‌سکه هم از ⁦TGJU⁩ در دسترسه.⁩

⁧به زبان ساده، اگه دنبال یه کتابخونه پایتون برای دریافت و پردازش داده‌های بورس تهران هستی، ⁦Oxtapus⁩ دقیقاً برای همین کار ساخته شده.⁩

⁧حواست باشه سایت‌های منبع ممکنه هر لحظه و بدون اطلاع قبلی تغییر کنن. ⁦Oxtapus⁩ اطلاعات منبع و نسخه طرح‌واره رو ثبت می‌کنه، ولی در دسترس‌بودن همیشگی منبع یا اجازه بازنشر داده‌ها رو تضمین نمی‌کنه. اگه استفاده تجاری داری، حتماً اول اطلاعیه منابع داده رو بخون.⁩

نصب

برای نصب معمولی این دستور رو اجرا کن:

python -m pip install oxtapus

⁧نسخه‌های ⁦3.11⁩ تا ⁦3.14⁩ پایتون پشتیبانی می‌شن. اگه یکپارچه‌سازی‌های اختیاری رو هم می‌خوای، باید موقع نصب مشخصشون کنی:⁩

python -m pip install 'oxtapus[arrow,pandas,duckdb,http2]'

شروع سریع پنج‌دقیقه‌ای

برای گرفتن قیمت‌های روزانه چند نماد، همین چند خط کافیه:

import oxtapus as ox

prices = ox.tsetmc.daily_prices(
    symbols=["فولاد", "خودرو"],
    start="1403/10/12",
    end="1404/10/11",
    progress=True,
)

print(prices.select("symbol", "trading_date", "close_price"))

برای گرفتن تاریخچهٔ دلار یا سکه هم فقط اسم دارایی رو بده:

usd = ox.tgju.daily_prices("دلار", start="1402/10/11")
nima = ox.tgju.daily_prices("دلار نیما")
eur = ox.tgju.daily_prices("یورو")
emami = ox.tgju.daily_prices("سکه امامی")
half = ox.tgju.daily_prices("نیم‌سکه")

⁧⁦start⁩ و ⁦end⁩ اختیاری‌ان. تاریخ شمسی رو می‌تونی با رقم فارسی، عربی یا انگلیسی و در قالب‌های ⁦YYYY-MM-DD⁩، ⁦YYYY/MM/DD⁩، ⁦YYYY.MM.DD⁩ یا ⁦YYYYMMDD⁩ بدی. ⁦Oxtapus⁩ با ⁦jdatetime⁩ اون رو به میلادی تبدیل می‌کنه؛ تاریخ میلادی ⁦ISO⁩ هم پذیرفته می‌شه. ورودی نامعتبر، همراه با همون مقدار واردشده و قالب‌های مجاز خطا می‌ده.⁩

⁧تابع‌های ساده یه ⁦polars.DataFrame⁩ برمی‌گردونن. شکل‌های مختلف حروف فارسی و عربی به‌صورت خودکار یکدست می‌شن، شناسه‌ها شفاف پیدا می‌شن، مقدارهای گم‌شده واقعاً گم‌شده می‌مونن، تلاش مجدد فقط برای همون درخواست ناموفق انجام می‌شه و خطاهای پردازش گروهی هم قایم نمی‌شن.⁩

⁧اگه قراره چند بار درخواست بفرستی، بهتره یه کلاینت ⁦Client⁩ بسازی و همون رو نگه داری:⁩

from oxtapus import Client, Settings

settings = Settings(concurrency=4, requests_per_second=2, progress=True)
with Client(settings) as client:
    snapshot = client.market.market_watch(["equity", "etf"])
    quote = client.market.quote("فولاد")
    order_book = client.market.market_depth("فولاد")
    activity = client.market.investor_activity("فولاد")
    identity = client.instruments.identity("فولاد")
    board = client.governance.board_members("فولاد")
    result = client.market.fetch_daily_prices(["فولاد", "خودرو"])

print(result.failures)
print(result.lineage.to_dict())

⁧نسخهٔ ناهمگام ⁦async⁩ هم مستقیم با ⁦await⁩ سطح بالای ⁦Jupyter⁩ کار می‌کنه:⁩

from oxtapus import AsyncClient

async with AsyncClient() as client:
    prices = await client.market.daily_prices(["فولاد", "خودرو"])

⁧⁦Oxtapus⁩ خودش حلقهٔ رویداد ⁦event loop⁩ رو راه نمی‌اندازه، تودرتو نمی‌کنه، از نو اجرا نمی‌کنه و دستکاریش هم نمی‌کنه.⁩

رابط عمومی

⁧میان‌برهای ساده بر اساس منبع گروه‌بندی شدن: داده‌های بورس تهران زیر ⁦ox.tsetmc⁩ و داده‌های ارز و سکه زیر ⁦ox.tgju⁩. برای نمونه، هر دو منبع متد ⁦daily_prices⁩ دارن ولی مسیر فراخوانی مشخص می‌کنه داده از کجا میاد. کلاس‌های داخلی فراهم‌کننده‌ها بخشی از رابط عمومی نیستن.⁩

معماری

flowchart LR
    API[Notebook API / Client / CLI] --> APP[Application services]
    APP --> PORT[Provider and storage ports]
    PORT --> TS[TSETMC provider]
    PORT --> TG[TGJU provider]
    TS --> HTTP[HTTPX2 transport]
    TG --> HTTP
    APP --> B[Bronze raw evidence]
    B --> S[Silver canonical]
    S --> G[Gold curated]
    S --> PQ[Parquet / Memory]
    G --> PQ
    PQ --> DB[Optional DuckDB]

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

توسعه پروژه

برای آماده‌کردن محیط توسعه و اجرای همه بررسی‌ها از این دستورها استفاده کن:

uv sync --all-extras --group dev
uv run ruff format --check .
uv run ruff check .
uv run pyright
uv run pytest -m "not live"
uv run lint-imports
uv run sphinx-build -W --keep-going -b html docs docs/_build/html
uv build

⁧تست‌های معمولی کاملاً آفلاین اجرا می‌شن. تست‌های زنده اختیاری‌ان و با ⁦pytest -m live⁩ اجرا می‌شن.⁩

حمایت از پروژه

⁧اگه ⁦Oxtapus⁩ کارت رو راحت‌تر کرده و دوست داری توسعه متن‌بازش ادامه پیدا کنه، می‌تونی از پروژه حمایت کنی.⁩

حمایت از Oxtapus

مجوز

⁧کد منبع ⁦Oxtapus⁩ با مجوز ⁦MIT⁩ منتشر شده. قوانین استفاده از داده‌های دریافتی جداست و به منبع اصلی هر داده بستگی داره.⁩

Release files for oxtapus 1.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oxtapus 1.2.0
File Size Uploaded
oxtapus-1.2.0.tar.gz 111.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for oxtapus 1.2.0
File Interpreter ABI Platform
oxtapus-1.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 227.2 kB

Release files / oxtapus-1.2.0.tar.gz

Download URL oxtapus-1.2.0.tar.gz
Size 111.1 kB
Tags Source
SHA-256 checksum
How to use checksums
b1958cb5b3bd43943d97e81173fbdeed2c203bd88ca2323bec11d9cd0b0b5676
BLAKE2b-256 checksum
How to use checksums
7bd457bdb86f2f5962e7fe78e923bcda53e0d6d81f4b7beef61b382114c3e898
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.2

Release files / oxtapus-1.2.0-py3-none-any.whl

Download URL oxtapus-1.2.0-py3-none-any.whl
Size 116.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7305bc8684ca0e0d34d14c84d88b7e82e65bb0d964ffb8d922d071db1bd09816
BLAKE2b-256 checksum
How to use checksums
462b67c12eb6a3c928295c5af9379ea96b573c38a37127f600d3e3f35ef54b05
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.2

Release history Release notifications | RSS feed

This release

1.2.0 This release

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.0

2 release files

0.4.1

1 release file

0.4.0

1 release file

0.3.11

1 release file

0.3.10

1 release file

0.3.9

1 release file

0.3.8

1 release file

0.3.6

1 release file

0.3.5

1 release file

0.3.4

1 release file

0.3.3

1 release file

0.3.2

1 release file

0.3.1

1 release file

0.3.0

1 release file

0.2.18

2 release files

0.2.17

1 release file

0.2.16

1 release file

0.2.15

1 release file

0.2.13

1 release file

0.2.12

1 release file

0.2.11

1 release file

0.2.10

1 release file

0.2.9

1 release file

0.2.8

1 release file

0.2.7

1 release file

0.2.6

1 release file

0.2.5

1 release file

0.2.4

1 release file

0.2.3

1 release file

0.2.2

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page