AI-agenter · leksjon

Integrasjon med API-er for markedsdata

Alpha Vantage, Yahoo Finance og Polygon.io for sanntidsdata og historiske data.

Leksjon 1 av 413 trinn

Integrasjon med API-er for markedsdata er en gratis leksjon i AI-agenter på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-agenter, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-agenter inneholder totalt 4 leksjoner.

Markedsdata i finansielle agenter

Agenter for finansanalyse trenger tilgang til markedsdata i sanntid og historiske markedsdata. Vanlige datatyper omfatter OHLCV (Open/High/Low/Close/Volume), datoer for resultatfremleggelser, fundamentale nøkkeltall og opsjonskjeder.

Flere API-er tilbyr slike data: yfinance (gratis, Yahoo Finance), Polygon.io (betalt, pålitelig) og Alpha Vantage (gratisnivå tilgjengelig).

yfinance: Historiske prisdata

yfinance fungerer som et omslag rundt Yahoo Finance API og er den raskeste måten å komme i gang på. Ticker.history() returnerer en pandas DataFrame med OHLCV-data.

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: Egendefinerte datointervaller

Bruk parameterne start og end for egendefinerte datointervaller, eller interval for intradagsdata (1m, 5m, 1h). Vær oppmerksom på at intradagsdata kan være begrenset til de siste 60 dagene, avhengig av intervallet.

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 tilbyr markedsdata av profesjonell kvalitet, med høyere hastighetsgrenser og mer pålitelig oppetid enn gratis kilder. Bruk det i finansielle agenter som skal settes i produksjon.

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 tilbyr et gratisnivå (25 kall per dag) og et betalt nivå. Endepunktet TIME_SERIES_DAILY returnerer OHLCV-data med valgfrie justerte priser.

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, ...}}

Hastighetsgrenser og logikk for nye forsøk

Alle API-er for markedsdata håndhever hastighetsgrenser. Hvis du overskrider dem, får du 429 (Too Many Requests). Implementer alltid eksponentiell backoff, og overhold grensene.

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)

Bufring av markedsdata

Historiske data er uforanderlige – gårsdagens sluttkurs endres aldri. Bufre dataene for å unngå overflødige API-kall. Bruk en enkel diskbuffer med nøkkel basert på (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'))

Håndtering av åpningstider og markedshull

Markedene er stengt i helger og på helligdager. Datointervaller som omfatter dager uten handel, vil ha hull i dataene. Oppdag og håndter alltid disse hullene i stedet for å anta at daglige data er sammenhengende.

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)

Bygging av et markedsdataverktøy for agenter

Registrer en innhenter av markedsdata som et agentverktøy. LLM-et kan kalle verktøyet for å hente data og deretter bruke et annet verktøy (analyse) til å behandle resultatet.

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)})

Fundamentale data fra yfinance

I tillegg til prisdata tilbyr yfinance fundamentale data som P/E-forhold, resultat per aksje, markedsverdi og mer. Fundamentale data gjør agentens analyse mer innholdsrik enn en analyse som bare ser på prisbevegelser.

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'))

Feilhåndtering: Avnoterte og ugyldige tickere

Ikke alle ticker-symboler er gyldige eller i aktiv handel. Et avnotert selskap returnerer en tom historikk. Valider alltid svaret før du fortsetter med analysen.

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

Hva returnerer outputsize-verdien «compact» i Alpha Vantage-endepunktet TIME_SERIES_DAILY?

Det er viktig å forstå parameterne for API-utdataenes størrelse når du skal håndtere båndbredde, ventetid og API-kvoter i finansielle agenter.

Oppsummering: Integrering av markedsdata-API-er

Bruk yfinance til rask prototyping (gratis), Polygon.io i produksjon (pålitelig, betalt) og Alpha Vantage som et alternativ med gratisnivå. Implementer alltid hastighetsbegrensning, diskbufring for historiske data og oppdaging av hull for dager uten handel.

Eksponer innhentingen som et agentverktøy, slik at LLM-et kan be om data ved behov.

Gratis å komme i gang

Lær deg AI-agenter med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
60
Leksjoner
239

Ofte stilte spørsmål

Er leksjonen «Integrasjon med API-er for markedsdata» gratis?

Ja – hele teksten i «Integrasjon med API-er for markedsdata» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI-agenter-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI-agenter inneholder totalt 4 leksjoner.

Hva lærer jeg i «Integrasjon med API-er for markedsdata»?

Alpha Vantage, Yahoo Finance og Polygon.io for sanntidsdata og historiske data. Du øver på AI-agenter med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med AI-agenter?

Ingen tidligere erfaring er nødvendig. AI-agenter på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «Integrasjon med API-er for markedsdata»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne AI-agenter-leksjonen?

Ja. Alle AI-agenter-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Integrasjon med API-er for markedsdata
  2. Agentverktøy for porteføljeanalyse
  3. Sikkerhetsnett for risiko og etterlevelse
  4. Bakkteste agentbeslutninger
← Tilbake til AI-agenter