172 lines
4.8 KiB
Python
172 lines
4.8 KiB
Python
"""Research and external data tools for trading analysis."""
|
|
|
|
from typing import Dict, Any, Optional
|
|
from langchain_core.tools import tool
|
|
from langchain_community.tools import (
|
|
ArxivQueryRun,
|
|
WikipediaQueryRun,
|
|
DuckDuckGoSearchRun
|
|
)
|
|
from langchain_community.utilities import (
|
|
ArxivAPIWrapper,
|
|
WikipediaAPIWrapper,
|
|
DuckDuckGoSearchAPIWrapper
|
|
)
|
|
|
|
|
|
@tool
|
|
def search_arxiv(query: str, max_results: int = 5) -> str:
|
|
"""Search arXiv for academic papers on quantitative finance, trading strategies, and machine learning.
|
|
|
|
Use this to find research papers on topics like:
|
|
- Market microstructure and order flow
|
|
- Algorithmic trading strategies
|
|
- Machine learning for finance
|
|
- Time series forecasting
|
|
- Risk management
|
|
- Portfolio optimization
|
|
|
|
Args:
|
|
query: Search query (e.g., "machine learning algorithmic trading", "deep learning stock prediction")
|
|
max_results: Maximum number of results to return (default: 5)
|
|
|
|
Returns:
|
|
Summary of papers including titles, authors, abstracts, and links
|
|
|
|
Example:
|
|
search_arxiv("reinforcement learning trading", max_results=3)
|
|
"""
|
|
arxiv = ArxivQueryRun(api_wrapper=ArxivAPIWrapper(top_k_results=max_results))
|
|
return arxiv.run(query)
|
|
|
|
|
|
@tool
|
|
def search_wikipedia(query: str) -> str:
|
|
"""Search Wikipedia for information on finance, trading, and economics concepts.
|
|
|
|
Use this to get background information on:
|
|
- Financial instruments and markets
|
|
- Economic indicators
|
|
- Trading terminology
|
|
- Technical analysis concepts
|
|
- Historical market events
|
|
|
|
Args:
|
|
query: Search query (e.g., "Black-Scholes model", "technical analysis", "options trading")
|
|
|
|
Returns:
|
|
Wikipedia article summary with key information
|
|
|
|
Example:
|
|
search_wikipedia("Bollinger Bands")
|
|
"""
|
|
wikipedia = WikipediaQueryRun(api_wrapper=WikipediaAPIWrapper())
|
|
return wikipedia.run(query)
|
|
|
|
|
|
@tool
|
|
def search_web(query: str, max_results: int = 5) -> str:
|
|
"""Search the web for current information on markets, news, and trading.
|
|
|
|
Use this to find:
|
|
- Latest market news and analysis
|
|
- Company announcements and earnings
|
|
- Economic events and indicators
|
|
- Cryptocurrency updates
|
|
- Exchange status and updates
|
|
- Trading strategy discussions
|
|
|
|
Args:
|
|
query: Search query (e.g., "Bitcoin price news", "Fed interest rate decision")
|
|
max_results: Maximum number of results to return (default: 5)
|
|
|
|
Returns:
|
|
Search results with titles, snippets, and links
|
|
|
|
Example:
|
|
search_web("Ethereum merge update", max_results=3)
|
|
"""
|
|
# Lazy initialization to avoid hanging during import
|
|
search = DuckDuckGoSearchRun(api_wrapper=DuckDuckGoSearchAPIWrapper())
|
|
# Note: max_results parameter doesn't work properly with current wrapper
|
|
return search.run(query)
|
|
|
|
|
|
@tool
|
|
def http_get(url: str, params: Optional[Dict[str, str]] = None) -> str:
|
|
"""Make HTTP GET request to fetch data from APIs or web pages.
|
|
|
|
Use this to retrieve:
|
|
- Exchange API data (if public endpoints)
|
|
- Market data from external APIs
|
|
- Documentation and specifications
|
|
- News articles and blog posts
|
|
- JSON/XML data from web services
|
|
|
|
Args:
|
|
url: The URL to fetch
|
|
params: Optional query parameters as a dictionary
|
|
|
|
Returns:
|
|
Response text from the URL
|
|
|
|
Raises:
|
|
ValueError: If the request fails
|
|
|
|
Example:
|
|
http_get("https://api.coingecko.com/api/v3/simple/price",
|
|
params={"ids": "bitcoin", "vs_currencies": "usd"})
|
|
"""
|
|
import requests
|
|
|
|
try:
|
|
response = requests.get(url, params=params, timeout=10)
|
|
response.raise_for_status()
|
|
return response.text
|
|
except requests.RequestException as e:
|
|
raise ValueError(f"HTTP GET request failed: {str(e)}")
|
|
|
|
|
|
@tool
|
|
def http_post(url: str, data: Dict[str, Any]) -> str:
|
|
"""Make HTTP POST request to send data to APIs.
|
|
|
|
Use this to:
|
|
- Submit data to external APIs
|
|
- Trigger webhooks
|
|
- Post analysis results
|
|
- Interact with exchange APIs (if authenticated)
|
|
|
|
Args:
|
|
url: The URL to post to
|
|
data: Dictionary of data to send in the request body
|
|
|
|
Returns:
|
|
Response text from the server
|
|
|
|
Raises:
|
|
ValueError: If the request fails
|
|
|
|
Example:
|
|
http_post("https://webhook.site/xxx", {"message": "Trade executed"})
|
|
"""
|
|
import requests
|
|
import json
|
|
|
|
try:
|
|
response = requests.post(url, json=data, timeout=10)
|
|
response.raise_for_status()
|
|
return response.text
|
|
except requests.RequestException as e:
|
|
raise ValueError(f"HTTP POST request failed: {str(e)}")
|
|
|
|
|
|
# Export tools list
|
|
RESEARCH_TOOLS = [
|
|
search_arxiv,
|
|
search_wikipedia,
|
|
search_web,
|
|
http_get,
|
|
http_post
|
|
]
|