Галоўная / Артыкулы

Трэйдынгавы агент на LangChain з жывымі рынкавымі данымі EODHD крок за крокам

Чаму трэйдынгавыя LLM-агенты падводзяць без рэальных даных, як працуе цыкл ReAct і як пабудаваць агента LangChain з трыма інструментамі на цэнах, фундаментальных даных і RSI ад EODHD.

Выдавец: REACTAPP.TOP8 хв чытання1769 слоў

Крыніцы: Building a Trading Agent with LangChain and the EODHD API

Большая частка так званых агентаў для трынкавання на аснове ШЫ, які показаны ў відэа, на самай працэ не ўжо ўважаюцца агентамі. Гэта проста мадэлі мовы з аптымізаванымі запітамі і выдуманымі цыфрамі. Настоямы агент патрабуе трохо: здатнасці да логічных выводам, інструменты для дзеяння і актуальныя даны, каб не ствараць халюцынацый. Калі прыбыць да трэцьяго элемента, першыя два практычна не маюць значэння. Гэта падходзіць для тых, хто стварае агентаў для фінансавага аналізу, паў’язуе LangChain з рэальнымі рыночнымі данымі, або тых, хто пробаваў „ботаў“ на аснове LLM і заўважыў, што без надзеяных даных гэта проста ілюзія.

Корачэй кажучы, агент — гэта LLM, якому даюцься інструменты (функцыі) і свабода выбіраць, калі і як іх выкарыстоўваць, замест таго каб ён адпавядаў на запыткі на адважанні на базе навучальных дадзенняў. LangChain — гэта фрэймворк на Python, які з’ѐеднвае мадэль, інструменты, памяць і цыкл прыняцця рашэнняў у адну рабочую ейкапаты. EODHD задае тое, чаго няма ў мадэлях за замовчаннем: ціны у рэальны час, фундаменталы, тэхнічныя показнікі і апошнія фінансавыя новыні, чырэз REST API. Разам гэтыя элементы ствараюць агента, які можа адпавядаць на запыткі на кшталт «Чы гэтыя акцыі маюць быць пад майму наглядам зараз?» на адважанні на базе актуальных дадзенняў, а не застарэлай памяці.

Мадэль — не слабы момент

Калі запытаць будзь-які ШЫ працэўніка пра тэкушчую цэну акцыі, ён дае чысло. Гэта чысло можа быць застарэлым на калькі месцаў або проста выдуманым. Мадэлі не маюць доступу да рэальнага рынку, не ведаюць, што адбылося ўчора, і не бачылі найновейшых звястакоў пра фінансавыя рэзультаты, але багато праектаў вжываюць іх так, як будто у ўсём гэтым ёсць сенс. Раслідаванні такіх сітуацыяў ўсё прыводзяць да таго ж: рэкамендаціі, створаныя на застарэлых даных, выдуманыя фундаменталныя показнікі, прыносзеныя з аблігацыёй да правды, і тэхнічны аналіз, вырачаны на цэнам, якіх ніколі не існавало.

Нічыга з гэтага не паказвае, што мадэль паслабна ў фінансах. Проблема заключаецца у тым, што ніхто не задаёў яй правільных дадзенняў. Мадэль без інструментаў — цэлая бібліятэка без вікнаў: множыцтва знанняў, але без можлівасці бачыць сучаснасць. Большая мадэль гэта не рашае. Рашае доступ да пераканальных зовнішнях дадзенняў, а таксама можласць для мадэлі самай выбіраць, калі ўзяць іх пад увагу. Для гэтага і існуе агент.

Стак

LangChain керуе логікай агента. Ён берае запытанне карыстальніка, выбірае інструмент, адклёкаеся да яго, аналізуе рэсультат і пішае адказ. У гэтым няма нічога чародзейскага — толькі цыкл разумавання з правіламі.

EODHD заполняе прырыв у даных. Праз свой API агент можа загружаць даны пра ціны OHLCV у рэальны час і за історыяй, фундаментальныя паказнікі компаній такія як коефіцыенты, балансавый звёздчатак і дохады, тэхнічныя показнікі як RSI, сярэднія значэння і MACD, а таксама новыны з інформацыяй пра настроены рынку. Практычныя прычыны выбраць яго для такога роду автаматызаціі. Ёго паводлівасць распрастраняецца на біржы па всім свету, а не толькі на NYSE і NASDAQ. Фундаментальныя паказнікі, тэхнічныя показнікі і новыны знаходзяцца за адзінамі канцэнтрамі, тады кожны з іх можа стаць самастоятэльным інструментам. А бесплатны ўровень дастаткова ўжымкі, каб створыць протатэп перш чым пераходзіць да масштабавання.

Анаіз EODHD як шара даных

Кожны аптэк дадзеных кантролюець заслуговае на адказны анаіз пры тым, як ён будзе включаны ў агента. З позытывных сторон цены, фундаментальныя показнікі, тэхнічныя даны і новыні аднародзены пад адной кантроллю і аднам планам расчытків, тады не трэба складваць тры розныя партнеры. Большасць безкоштовных альтэрнатыў, такіх як скраперы на базе Yahoo і обмежаныя планы Alpha Vantage, працуюць толькі з амерыканскімі індэксамі, тады як EODHD падтрымляе дзесяткі бірж, што мае значэнне для акцый не з Амерыкі. Расходныя даны выдаюцца у фармаце JSON з прыемлівымі полямі (close, change_p, PERatio і т. д.), таму стварэнне інструментаў-обгортакоў ёсць простым, і нічога не залежыць ад нестабільнага парсінгу HTML. Вы можэце стварыць і працаваць з усім агентам, які включае цены, фундаментальныя показнікі і RSI, прычым перад тым, як плаціць. Ліміты частоты запытоў задокументаваны і прыемлівыя, што мае значэнне, калі агент можа вызваць інструмент колькі разоў для адной запытання.

Ёсць і недактары. Бесплатны ўровень мае дзенневыя ліміты на запіты, што падходзіць для персональнага спіску на старонг, але недастаткова для сервісу з колькома корыстнікамі. Даныя па фундаментальных паказначэннях апдэйтуюцца за графікам развядчыка, а не як толькі з’яўляюцца новыя даны, што ёсць спаканам для всіх API па фундаментальных паказначэннях, але мае значэнне, калі ваш агент выкарыстоўвае аналіз за той жа дзень. А опісы інструментоў заставаюцца вашай адпаведальнасцю: паслаба напісаны інструмент LangChain все равно можа быць вызваны не тады або неправяму чынам перакананы модэлем, незалежна ад якосці API. Для агента, які патрэбуе рэальных структураваных фінансавых дадзеных без пайплайна для збору інфармацыі, такія компромісы спрыяюць выбору хоставанага API замест самастойна стваранага шару дадзеных.

Як працюе цыкл разумавання

Большасць навучальных матэрыялаў прыхоўвае тое, што такое „агент“ з тэхнічной точкі зору. Агент LangChain, які выкарыстоўвае шаблон ReAct (разумаванне плюс дзеянне), запускае цыкл, які складаецца з чатырох частак.

  1. LLM, які чытае запытанне і апісанні інструментаў і выбірае наступны крок.
  2. Інструменты – функцыі, якія можна вызваць, кожная з якіх мае назву, апісанне, а таксама неабходныя вхідныя і выхідныя даны, такія як get_live_price, get_fundamentals і get_rsi.
  3. Екзэкутар, які фактычна запускае запрошаны інструмент, перадае выхідныя даны назад модэлю і дазваляе яму выбраць наступны крок.
  4. Скрапчпад – рэгістрацыя думак, дзеянняў і спазыраўненняў пад час аднае запыткі, так што модэль памятае, што ён ужо пераканаў.

Запытанне на кшталт „Чы гэта час разглядаць AAPL.US?“ стварае такі ланцуг. Спачатку модэль хочаць цэну:

Thought: I need the current price first.
Action: get_live_price("AAPL.US")
Observation: AAPL.US: current price 227.50, change +0.8%

Потым ён вырашае, што сама цена мало сказываецца, і пераходзіць да імпульсу рынку і оцэнкі актыву:

Thought: Price alone isn't enough — check momentum.
Action: get_rsi("AAPL.US")
Observation: AAPL.US — RSI(14): 58.3Thought: Not overbought. Check if valuation is reasonable.
Action: get_fundamentals("AAPL.US")
Observation: AAPL.US — PE: 31.2, Market Cap: 3.4T, Dividend Yield: 0.4%Thought: I now have enough data to answer.
Final Answer: [synthesized response]

Гэта архітэктурная розніца межа агентам і чатботам, які выкарыстоўваюць сістэмныя прампты. Мадэль на час выканання выбірае парадак вызоваў інструментаў на адной заснове таго, што паказваюць кожныя назірання, і не выкарыстоўваецца жадны фіксаваны скрапт. Самэ гэта таксама ўскладнюе сітуацыю з якасцю і структурой джэрэла дадзеных. Калі get_fundamentals вяртае некалькісныя або застарэлыя цыфры, кожная думка, пабудаваная на іх, успадкуе гэтую памылку без жадных відных апавешчэнняў. Кожны крок разумовага аналізу залежыць ад надзеямасці паказванага раней кроку, і гэта галоўная прычына, чаму фінансавыя агенты патрабуюць справжняй, структураванай API, а не дадзеных, засобленаўных з інтэрнэту аб кеша.

Стварэнне

У агента ёсць тры інструменты, прыўязаныя да EODHD: рэальныя цены, фундаменталы і тэхнічныя показнікі. Пачніце з інсталлявання пакетаў:

pip install langchain langchain-openai requests

Самыя інструменты — гэта простыя функцыі. Кожная з іх выканае апыл да ўзела EODHD і вярта чысты, структураваны выхідны дадзеныя, якіе можа прачытаць мадэль:

import requests
from langchain.tools import tool
EODHD_API_KEY = "YOUR_API_KEY"
BASE_URL = "https://eodhd.com/api"
@tool
def get_live_price(ticker: str) -> str:
    """Returns the current price of a stock. Example ticker: AAPL.US"""
    url = f"{BASE_URL}/real-time/{ticker}"
    params = {"api_token": EODHD_API_KEY, "fmt": "json"}
    r = requests.get(url, params=params).json()
    return f"{ticker}: current price {r['close']}, change {r['change_p']}%"
@tool
def get_fundamentals(ticker: str) -> str:
    """Returns key fundamental metrics: PE ratio, market cap, dividend yield."""
    url = f"{BASE_URL}/fundamentals/{ticker}"
    params = {"api_token": EODHD_API_KEY}
    r = requests.get(url, params=params).json()
    highlights = r.get("Highlights", {})
    return (
        f"{ticker} - PE: {highlights.get('PERatio')}, "
        f"Market Cap: {highlights.get('MarketCapitalization')}, "
        f"Dividend Yield: {highlights.get('DividendYield')}"
    )
@tool
def get_rsi(ticker: str) -> str:
    """Returns the 14-day RSI to assess overbought or oversold conditions."""
    url = f"{BASE_URL}/technical/{ticker}"
    params = {"api_token": EODHD_API_KEY, "function": "rsi", "period": 14, "fmt": "json"}
    r = requests.get(url, params=params).json()
    latest = r[-1]
    return f"{ticker} - RSI(14): {latest['rsi']} as of {latest['date']}"

Потым складзіце агента з модэлю чату, інструментаў і запросу ReAct:

from langchain_openai import ChatOpenAI
from langchain.agents import create_react_agent, AgentExecutor
from langchain import hub

llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [get_live_price, get_fundamentals, get_rsi]

prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

Гэта трыя інструменты: адзін LLM і адзін цыкл, які выбірае сярод іх на адпаведна запытанне. Выклік выглядае так:

response = executor.invoke({
    "input": "Should we be looking at AAPL.US right now?"
})
print(response["output"])

Агент не адаптуе сваю адказчыцу на аснове памяці. Спачатку ён вызывае get_live_price, потым get_rsi, а get_fundamentals — калі неабходна оцэнка, пасля чыгуўнае злучае всі тры рэзультаты ў адказ, які стоіць на аснове рэальных дадзэнняў, а не на аснове вымышленых інформацый. Серэд можлівых расшырэнняў — агент, які можа пораўняваць калькі акцый у адной запытцы, сістэма, якая дадае новыні праз канцэнтры-эндпоінт, і прыбутковы механізм, які паведамляе пра змяны ў спостэрагаемых акцыях кожы гадзіну.

Што трэба запамятаць

Агент без рэальных дадзей — гэта толькі генератор пераконлівых тэкстаў, а не інструмент для аналізу. LangChain займаецца оркестрацыяй, а надзеяны API дадзей рашае основную проблему — адночаснае і надзеянае фінансавае інфармацыя. У агенце тыпу ReAct кожны крок успадковвае надзеямасць дадзей, якія лежачы за паканнам ранейшага крока, таму слой дадзей мае такое ж значэнне, як і сам пакан. А простыя інструменты з адной відпаведальнасцю працуюць лепшая, чым калі вся логіка запаковываецца ў адны вялікі пакан.

Наступаюць калькі ласковых запытанняў. Чаму ёсць агент у сэрэдзібе трагавання? Цэна — гэта сыстэма, у якой LLM выбірае, якія інструменты выкарыстоўваць — ад цэнаў да фундаментальных даных і новын — каб завершыць задачу з рэальнымі данымі, а не толькі з навучанымі знаннямі. Чаму LangChain, а не працэўванне з API безпосерэдна? Ён карыстуецца ціклам прынятка рашэнняў, тое ў чым інструмент, калі і як спаўнаць канкрэтныя рышучання, што інакш давялося бы задаць у вігляды жорсткага коду для кожнага случая. Чы трэба платны акаунт EODHD, каб працаваць з гэтым? Не, дастатнек абавесныя версіі для стварэння пратотыпа. У чым галоўны компроміс у працэўванні з гэтым падходам у порываў з стварэнням савастай сістэмы? Вы віддаеце полны кантроль над джэрамі даных зарады швальнасці і надзеяння, пры чым адна структураваная API заменяе калькаторы даных або калькі інтэграцый з постачальнікамі, а ліміт, які трэба врачываць, — гэта дзённы ліміт абавесной версіі пасля таго, як заканчыцеся стадыя пратотыпаў.