تكامل واجهات برمجة تطبيقات بيانات السوق
استخدام Alpha Vantage وYahoo Finance وPolygon.io للبيانات الآنية والتاريخية.
تكامل واجهات برمجة تطبيقات بيانات السوق درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.
بيانات السوق في الوكلاء الماليين
تحتاج وكلاء التحليل المالي إلى الوصول إلى بيانات السوق الآنية والتاريخية. وتشمل أنواع البيانات الشائعة OHLCV (الفتح/الأعلى/الأدنى/الإغلاق/الحجم)، وتواريخ إعلان الأرباح، والنسب المالية الأساسية، وسلاسل الخيارات.
توفر عدة واجهات API هذه البيانات، منها: yfinance (مجاني، من Yahoo Finance)، وPolygon.io (مدفوع وموثوق)، وAlpha Vantage (تتوفر له فئة مجانية).
yfinance: بيانات الأسعار التاريخية
تغلّف yfinance واجهة Yahoo Finance API، وهي أسرع طريقة للبدء. وتُرجع Ticker.history() كائن pandas DataFrame يحتوي على بيانات OHLCV.
import yfinance as yf
ticker = yf.Ticker('AAPL')
# 1 year of daily data
history = ticker.history(period='1y')
print(history.tail(3))
# Open High Low Close Volume
# Date
# 2026-05-27 189.1500 190.3200 188.9200 190.0500 55234000
# 2026-05-28 190.4200 191.5600 189.7800 191.1200 62345000
print(f'Rows: {len(history)}')yfinance: نطاقات تواريخ مخصصة
استخدم المعلمتين start وend لتحديد نطاقات تواريخ مخصصة، أو استخدم interval للحصول على بيانات خلال اليوم (1m و5m و1h). لاحظ أن البيانات خلال اليوم تقتصر على آخر 60 يومًا، بحسب الفاصل الزمني.
import yfinance as yf
ticker = yf.Ticker('MSFT')
# Custom date range
history = ticker.history(start='2024-01-01', end='2024-12-31')
print(f'Trading days in 2024: {len(history)}')
# Batch multiple tickers
tickers = yf.download(['AAPL', 'MSFT', 'GOOGL'],
start='2025-01-01', end='2025-12-31')
print(tickers['Close'].head())واجهة Polygon.io REST API
توفر Polygon.io بيانات سوق بمستوى احترافي، مع حدود أعلى لمعدل الطلبات ووقت تشغيل أكثر موثوقية من المصادر المجانية. استخدمها في الوكلاء الماليين المخصصة لبيئات الإنتاج.
import requests
POLYGON_KEY = 'YOUR_POLYGON_API_KEY'
def get_polygon_daily(ticker: str, from_date: str, to_date: str) -> list[dict]:
url = f'https://api.polygon.io/v2/aggs/ticker/{ticker}/range/1/day/{from_date}/{to_date}'
resp = requests.get(url, params={'apiKey': POLYGON_KEY, 'limit': 365})
resp.raise_for_status()
data = resp.json()
return data.get('results', [])
bars = get_polygon_daily('AAPL', '2025-01-01', '2025-12-31')
print(f'Bars returned: {len(bars)}')
if bars:
print('Latest close:', bars[-1]['c'])Alpha Vantage TIME_SERIES_DAILY
توفر Alpha Vantage فئة مجانية (25 استدعاءً يوميًا) وفئة مدفوعة. وتُرجع نقطة النهاية TIME_SERIES_DAILY بيانات OHLCV مع أسعار معدّلة اختيارية.
import requests
ALPHA_KEY = 'YOUR_ALPHA_VANTAGE_KEY'
def get_alpha_vantage_daily(symbol: str, outputsize: str = 'compact') -> dict:
# outputsize: 'compact' (100 days) or 'full' (20+ years)
resp = requests.get('https://www.alphavantage.co/query', params={
'function': 'TIME_SERIES_DAILY_ADJUSTED',
'symbol': symbol,
'outputsize': outputsize,
'apikey': ALPHA_KEY
})
resp.raise_for_status()
data = resp.json()
series = data.get('Time Series (Daily)', {})
return series # dict: {date_str: {open, high, low, close, volume, ...}}حدود معدل الطلبات ومنطق إعادة المحاولة
تفرض جميع واجهات API لبيانات السوق حدودًا لمعدل الطلبات. وعند تجاوزها، تحصل على الخطأ 429 (طلبات كثيرة جدًا). طبّق دائمًا التراجع الأسي والتزم بالحدود.
import time, requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
def make_rate_limited_session(calls_per_minute: int = 5) -> requests.Session:
session = requests.Session()
retry = Retry(
total=3,
backoff_factor=2, # 1s, 2s, 4s waits
status_forcelist=[429, 500, 502, 503, 504]
)
adapter = HTTPAdapter(max_retries=retry)
session.mount('https://', adapter)
session._calls_per_min = calls_per_minute
session._min_interval = 60.0 / calls_per_minute
session._last_call = 0.0
return session
def rate_limited_get(session, url, **kwargs):
elapsed = time.time() - session._last_call
if elapsed < session._min_interval:
time.sleep(session._min_interval - elapsed)
session._last_call = time.time()
return session.get(url, **kwargs)التخزين المؤقت لبيانات السوق
البيانات التاريخية غير قابلة للتغيير — فسعر الإغلاق بالأمس لا يتغير أبدًا. خزّنها مؤقتًا لتجنب استدعاءات API المكررة. استخدم ذاكرة تخزين مؤقت بسيطة على القرص، مع فهرستها بحسب (ticker, date_range).
import hashlib, json, os
CACHE_DIR = '/tmp/market_cache'
os.makedirs(CACHE_DIR, exist_ok=True)
def cache_key(ticker: str, start: str, end: str) -> str:
return hashlib.md5(f'{ticker}_{start}_{end}'.encode()).hexdigest()
def get_cached(ticker: str, start: str, end: str):
key = cache_key(ticker, start, end)
path = os.path.join(CACHE_DIR, f'{key}.json')
if os.path.exists(path):
with open(path) as f:
return json.load(f)
return None
def set_cached(ticker: str, start: str, end: str, data):
key = cache_key(ticker, start, end)
path = os.path.join(CACHE_DIR, f'{key}.json')
with open(path, 'w') as f:
json.dump(data, f)
if __name__ == '__main__':
set_cached('AAPL', '2024-01-01', '2024-01-31', {'close': [150, 151, 149]})
cached = get_cached('AAPL', '2024-01-01', '2024-01-31')
print('Cached data for AAPL:', cached)
print('Cache miss for MSFT:', get_cached('MSFT', '2024-01-01', '2024-01-31'))
التعامل مع ساعات التداول وفجوات السوق
تُغلق الأسواق في عطلات نهاية الأسبوع والعطلات الرسمية. وستحتوي نطاقات التواريخ التي تشمل أيامًا غير مخصصة للتداول على فجوات في البيانات. اكتشف هذه الفجوات وتعامل معها دائمًا بدلًا من افتراض أن البيانات اليومية متصلة.
import pandas as pd
from pandas.tseries.offsets import BDay
def detect_gaps(history: pd.DataFrame) -> list[str]:
if history.empty:
return []
date_range = pd.date_range(
start=history.index.min(),
end=history.index.max(),
freq=BDay() # Business days only
)
missing = date_range.difference(history.index)
return [str(d.date()) for d in missing]
import yfinance as yf
history = yf.Ticker('AAPL').history(start='2024-12-23', end='2025-01-07')
gaps = detect_gaps(history)
print('Missing business days (holidays):', gaps)إنشاء أداة بيانات سوق للوكلاء
سجّل أداة لجلب بيانات السوق بوصفها أداة للوكيل. ويمكن لـ LLM استدعاؤها لاسترجاع البيانات، ثم استخدام أداة أخرى (التحليل) لمعالجة النتيجة.
import yfinance as yf, json
def get_market_data_tool(ticker: str, period: str = '1y') -> str:
cached = get_cached(ticker, period, 'yfinance')
if cached:
return json.dumps(cached)
try:
hist = yf.Ticker(ticker).history(period=period)
if hist.empty:
return json.dumps({'error': f'No data for {ticker}'})
result = {
'ticker': ticker,
'period': period,
'start': str(hist.index.min().date()),
'end': str(hist.index.max().date()),
'latest_close': float(hist['Close'].iloc[-1]),
'pct_change_ytd': float((hist['Close'].iloc[-1] / hist['Close'].iloc[0] - 1) * 100),
'rows': len(hist)
}
set_cached(ticker, period, 'yfinance', result)
return json.dumps(result)
except Exception as e:
return json.dumps({'error': str(e)})البيانات الأساسية من yfinance
إلى جانب بيانات الأسعار، توفر yfinance بيانات أساسية، مثل نسبة السعر إلى الأرباح، وربحية السهم، والقيمة السوقية، وغير ذلك. تثري البيانات الأساسية تحليل الوكيل بما يتجاوز حركة الأسعار وحدها.
import yfinance as yf
ticker = yf.Ticker('AAPL')
info = ticker.info
print('Market Cap: ', info.get('marketCap'))
print('P/E Ratio: ', info.get('trailingPE'))
print('EPS: ', info.get('trailingEps'))
print('52-Week High: ', info.get('fiftyTwoWeekHigh'))
print('52-Week Low: ', info.get('fiftyTwoWeekLow'))
print('Dividend Yield: ', info.get('dividendYield'))
print('Analyst Target: ', info.get('targetMeanPrice'))معالجة الأخطاء: رموز التداول المشطوبة وغير الصالحة
ليست كل رموز التداول صالحة أو متداولة حاليًا. وتُرجع الشركة المشطوبة من التداول سجلًا تاريخيًا فارغًا. تحقّق دائمًا من الاستجابة قبل متابعة التحليل.
import yfinance as yf
def safe_fetch(ticker_symbol: str, period: str = '1y') -> dict:
try:
ticker = yf.Ticker(ticker_symbol)
history = ticker.history(period=period)
if history.empty:
return {
'error': f'No data for {ticker_symbol}. May be delisted or invalid.',
'ticker': ticker_symbol
}
return {
'ticker': ticker_symbol,
'latest_close': float(history['Close'].iloc[-1]),
'data_start': str(history.index.min().date()),
'bars': len(history)
}
except Exception as e:
return {'error': str(e), 'ticker': ticker_symbol}
print(safe_fetch('AAPL')) # valid
print(safe_fetch('INVALID')) # returns error dictماذا يُرجع outputsize بقيمة «compact» في نقطة النهاية Alpha Vantage TIME_SERIES_DAILY؟
يُعد فهم معلمات حجم المخرَج في واجهات API مهمًا لإدارة النطاق الترددي وزمن الاستجابة وحصص API في الوكلاء الماليين.
مراجعة تكامل واجهات API لبيانات السوق
استخدم yfinance للنمذجة الأولية السريعة (مجانيًا)، وPolygon.io لبيئات الإنتاج (موثوق ومدفوع)، وAlpha Vantage كخيار ذي فئة مجانية. طبّق دائمًا تحديد معدل الطلبات، والتخزين المؤقت على القرص للبيانات التاريخية، واكتشاف الفجوات في أيام عدم التداول.
وفّر عملية الجلب بوصفها أداة للوكيل حتى يتمكن LLM من طلب البيانات عند الحاجة.
الأسئلة الشائعة
هل درس «تكامل واجهات برمجة تطبيقات بيانات السوق» مجاني؟
نعم — نص درس «تكامل واجهات برمجة تطبيقات بيانات السوق» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.
ماذا ستتعلم في «تكامل واجهات برمجة تطبيقات بيانات السوق»؟
استخدام Alpha Vantage وYahoo Finance وPolygon.io للبيانات الآنية والتاريخية. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟
لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «تكامل واجهات برمجة تطبيقات بيانات السوق»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟
نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تكامل واجهات برمجة تطبيقات بيانات السوق
- أدوات الوكيل لتحليل المحافظ الاستثمارية
- ضوابط المخاطر والامتثال
- اختبار قرارات الوكيل بأثر رجعي