API للمطورين

إنشاء متتبع للأسهم السعودية باستخدام Python وواجهة SAHMK API

تعلّم استخدام واجهة SAHMK API لجلب بيانات الأسهم الفورية من تداول السعودية، وتتبع تحركات مؤشر تاسي، وإنشاء متتبع بسيط للمحفظة، وكل ذلك باستخدام Python.

Pythonمبتدئقراءة 10 دقائق

1. المتطلبات والإعداد

قبل أن نبدأ، ستحتاج إلى:

  • Python 3.7+ مثبّتاً على جهازك
  • مفتاح SAHMK API مجاني — سجّل في sahmk.sa/developers (100 طلب مجاني يومياً)
  • مكتبة requests

ثبّت مكتبة requests:

bash
pip install requests

تمنحك واجهة SAHMK API وصولاً إلى أكثر من 350 شركة مدرجة في تداول (السوق الرئيسية ونمو)، بما يشمل الأسعار الفورية والبيانات التاريخية والقوائم المالية والتوزيعات وغيرها. تتضمن الباقة المجانية أسعاراً متأخرة 15 دقيقة، وهي مثالية للتعلم والبناء.

2. أول طلب API — جلب سعر باستخدام المعرّف

لنبدأ بجلب سعر Aramco. يستخدم هذا المثال الرمز 2222، لكن البحث عن السعر يدعم أيضاً الاسم العربي والإنجليزي والاسم البديل:

إذا لم تعرف الرمز الدقيق، فاستخدم /companies/ أو client.companies() أولاً.

get_quote.py
import requests

API_KEY = "your_api_key_here"
BASE_URL = "https://api.sahmk.sa/api/v1"

headers = {"X-API-Key": API_KEY}

# Fetch Aramco quote by identifier
response = requests.get(f"{BASE_URL}/quote/2222/", headers=headers)
data = response.json()

print(f"Company: {data['name_en']}")
print(f"Symbol:  {data['symbol']}")
print(f"Price:   {data['price']} SAR")
print(f"Change:  {data['change']} ({data['change_percent']}%)")
print(f"Volume:  {data['volume']:,}")
مثال على الاستجابة
Company: Saudi Aramco
Symbol:  2222
Price:   28.30 SAR
Change:  -0.15 (-0.53%)
Volume:  8,432,150

تعيد نقطة النهاية /quote/{symbol}/ بيانات شاملة تشمل السعر والتغير والحجم ونطاق اليوم ونطاق 52 أسبوعاً وغيرها. راجع مرجع واجهة API الكامل لجميع الحقول المتاحة.

3. نظرة عامة على السوق — الرابحون والخاسرون والأعلى حجماً

توفر واجهة SAHMK نقاط نهاية لأبرز تحركات السوق اليوم. وهذا مفيد لبناء لوحات السوق أو أدوات الفرز:

market_movers.py
import requests

API_KEY = "your_api_key_here"
BASE_URL = "https://api.sahmk.sa/api/v1"

headers = {"X-API-Key": API_KEY}

# Get today__TOKEN_3__gainers__TOKEN_4__name_en__TOKEN_5__change_percent__TOKEN_6__price__TOKEN_7__s top losers (TASI by default)
losers_response = requests.get(f"{BASE_URL}/market/losers/?limit=5&index=TASI", headers=headers).json()
losers = losers_response['losers']

print("📉 Top 5 Losers Today")
print("-" * 50)
for stock in losers:
    print(f"  {stock['name_en']:<25} {stock['change_percent']:>+6.2f}%  {stock['price']} SAR")

print()

# Get market summary (TASI index)
summary = requests.get(f"{BASE_URL}/market/summary/?index=TASI", headers=headers).json()

print("🏛️  Market Summary")
print("-" * 50)
print(f"  TASI: {summary['index_value']} ({summary['index_change_percent']:+.2f}%)")
print(f"  Delayed Feed: {summary['is_delayed']}")
مثال على الاستجابة
📈 Top 5 Gainers Today
--------------------------------------------------
  Aldrees Petroleum         +9.97%  142.00 SAR
  Alujain Corp              +7.42%  38.50 SAR
  Saudi Ceramic             +5.18%  61.00 SAR
  Zamil Industrial          +4.85%  27.30 SAR
  Batic Investments         +4.23%  39.75 SAR

📉 Top 5 Losers Today
--------------------------------------------------
  Alinma Bank               -3.12%  27.95 SAR
  Savola Group              -2.87%  32.10 SAR
  Yanbu Cement              -2.45%  54.80 SAR
  Saudi Kayan               -2.31%  12.68 SAR
  Etihad Etisalat           -1.98%  51.20 SAR

🏛️  Market Summary
--------------------------------------------------
  TASI: 12,456.32 (+0.45%)
  Delayed Feed: False
  Nomu: 28,234.10 (-0.12%)

تشمل نقاط نهاية السوق الأخرى /market/volume/, /market/value/, و /market/sectors/ للتحليل على مستوى القطاعات.

4. أنشئ متتبعاً للمحفظة

لننشئ الآن تطبيقاً عملياً — متتبعاً للمحفظة يعرض ممتلكاتك الحالية وقيمتها والربح أو الخسارة:

portfolio_tracker.py
import requests

API_KEY = "your_api_key_here"
BASE_URL = "https://api.sahmk.sa/api/v1"

headers = {"X-API-Key": API_KEY}

# Define your portfolio: symbol, shares, avg cost
portfolio = [
    {"symbol": "2222", "shares": 100, "avg_cost": 27.50},  # Aramco
    {"symbol": "1180", "shares": 50,  "avg_cost": 32.00},  # Al Rajhi Bank
    {"symbol": "2350", "shares": 200, "avg_cost": 8.50},   # Saudi Kayan
    {"symbol": "7010", "shares": 75,  "avg_cost": 98.00},  # STC
]

print("📊 Portfolio Summary")
print("=" * 70)
print(f"  {'Stock':<20} {'Shares':>6} {'Avg Cost':>10} {'Price':>10} {'P/L':>12}")
print("-" * 70)

total_cost = 0
total_value = 0

for holding in portfolio:
    response = requests.get(
        f"{BASE_URL}/quote/{holding['symbol']}/",
        headers=headers
    )
    stock = response.json()

    current_price = float(stock["price"])
    cost_basis = holding["shares"] * holding["avg_cost"]
    market_value = holding["shares"] * current_price
    pnl = market_value - cost_basis
    pnl_pct = (pnl / cost_basis) * 100

    total_cost += cost_basis
    total_value += market_value

    sign = "+" if pnl >= 0 else ""
    print(
        f"  {stock['name_en']:<20} "
        f"{holding['shares']:>6} "
        f"{holding['avg_cost']:>9.2f} "
        f"{current_price:>9.2f} "
        f"{sign}{pnl:>8.2f} ({sign}{pnl_pct:.1f}%)"
    )

total_pnl = total_value - total_cost
total_pnl_pct = (total_pnl / total_cost) * 100
sign = "+" if total_pnl >= 0 else ""

print("=" * 70)
print(f"  Total Cost:   {total_cost:>10,.2f} SAR")
print(f"  Market Value: {total_value:>10,.2f} SAR")
print(f"  Total P/L:    {sign}{total_pnl:>10,.2f} SAR ({sign}{total_pnl_pct:.1f}%)")
مثال على الاستجابة
📊 Portfolio Summary
======================================================================
  Stock                Shares   Avg Cost      Price          P/L
----------------------------------------------------------------------
  Saudi Aramco            100      27.50      28.30   +80.00 (+2.9%)
  Al Rajhi Bank            50      32.00      88.40 +2,820.00 (+176.3%)
  Saudi Kayan             200       8.50      12.68  +836.00 (+49.2%)
  STC                      75      98.00     168.80 +5,310.00 (+72.2%)
======================================================================
  Total Cost:    12,200.00 SAR
  Market Value:  21,246.00 SAR
  Total P/L:    +9,046.00 SAR (+74.1%)

5. أسعار مجموعة أسهم — عدة أسهم في طلب واحد

بدلاً من إرسال طلب مستقل لكل سهم، استخدم نقطة نهاية المجموعة لجلب عدة أسعار دفعة واحدة. هذا أكثر كفاءة ويستهلك طلبات API أقل:

batch_quotes.py
import requests

API_KEY = "your_api_key_here"
BASE_URL = "https://api.sahmk.sa/api/v1"

headers = {"X-API-Key": API_KEY}

# Fetch multiple quotes in a single request
identifiers = "2222,الراجحي,stc,سابك"

response = requests.get(
    f"{BASE_URL}/quotes/",
    headers=headers,
    params={"symbols": identifiers}
)
stocks = response.json()["quotes"]

print(f"{'Symbol':<8} {'Company':<25} {'Price':>8} {'Change':>10}")
print("-" * 55)

for stock in stocks:
    change = f"{stock['change_percent']:+.2f}%"
    print(f"{stock['symbol']:<8} {stock['name_en']:<25} {stock['price']:>8} {change:>10}")
مثال على الاستجابة
Symbol   Company                      Price     Change
-------------------------------------------------------
2222     Saudi Aramco                  28.30     -0.53%
1180     Al Rajhi Bank                 88.40     +1.26%
2350     Saudi Kayan                   12.68     -2.31%
7010     STC                          168.80     +0.84%
1010     Riyad Bank                    27.65     +0.36%
2010     SABIC                         82.30     -0.48%

تقبل نقطة نهاية المجموعة حتى 50 معرّفاً في الطلب الواحد، ما يجعلها مناسبة للوحات المحافظ وقوائم المراقبة.

إذا طابق المعرّف عدة شركات، فأعد المحاولة باستخدام رمز السوق الدقيق.

6. الخطوات التالية

لديك الآن متتبع يعمل للأسهم السعودية. إليك أفكاراً لتطويره:

  • البيانات التاريخية: استخدم /historical/{identifier}/ لرسم اتجاهات الأسعار (باقة Starter)
  • القوائم المالية: اجلب الميزانيات وقوائم الدخل عبر /financials/ (باقة Starter)
  • البث في الوقت الفعلي: اتصل عبر WebSocket لتحديثات الأسعار المباشرة (باقة Pro+)
  • توزيعات الأرباح: تتبّع إعلانات التوزيعات باستخدام /dividends/
  • أنشئ لوحة ويب: ادمجه مع Flask أو Streamlit لإنشاء واجهة مرئية

هل أنت جاهز لبدء البناء؟

احصل على مفتاح API المجاني وابدأ جلب بيانات أسهم تداول خلال دقائق. تشمل الباقة 100 طلب مجاني يومياً ولا تتطلب بطاقة ائتمانية.

نشر بواسطة @sahmk_sa · مرخّص من تداول السعودية