1. المتطلبات والإعداد
قبل أن نبدأ، ستحتاج إلى:
- Python 3.7+ مثبّتاً على جهازك
- مفتاح SAHMK API مجاني — سجّل في sahmk.sa/developers (100 طلب مجاني يومياً)
- مكتبة
requests
ثبّت مكتبة requests:
pip install requestsتمنحك واجهة SAHMK API وصولاً إلى أكثر من 350 شركة مدرجة في تداول (السوق الرئيسية ونمو)، بما يشمل الأسعار الفورية والبيانات التاريخية والقوائم المالية والتوزيعات وغيرها. تتضمن الباقة المجانية أسعاراً متأخرة 15 دقيقة، وهي مثالية للتعلم والبناء.
2. أول طلب API — جلب سعر باستخدام المعرّف
لنبدأ بجلب سعر Aramco. يستخدم هذا المثال الرمز 2222، لكن البحث عن السعر يدعم أيضاً الاسم العربي والإنجليزي والاسم البديل:
إذا لم تعرف الرمز الدقيق، فاستخدم /companies/ أو client.companies() أولاً.
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 نقاط نهاية لأبرز تحركات السوق اليوم. وهذا مفيد لبناء لوحات السوق أو أدوات الفرز:
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. أنشئ متتبعاً للمحفظة
لننشئ الآن تطبيقاً عملياً — متتبعاً للمحفظة يعرض ممتلكاتك الحالية وقيمتها والربح أو الخسارة:
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 أقل:
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 طلب مجاني يومياً ولا تتطلب بطاقة ائتمانية.