You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
248 lines
9.1 KiB
248 lines
9.1 KiB
from loguru import logger
|
|
import yfinance as yf
|
|
import json
|
|
|
|
|
|
def get_figma_stock_data(stock: str) -> str:
|
|
"""
|
|
Fetches comprehensive stock data for Figma (FIG) using Yahoo Finance.
|
|
|
|
Returns:
|
|
Dict[str, Any]: A dictionary containing comprehensive Figma stock data including:
|
|
- Current price and market data
|
|
- Company information
|
|
- Financial metrics
|
|
- Historical data summary
|
|
- Trading statistics
|
|
|
|
Raises:
|
|
Exception: If there's an error fetching the data from Yahoo Finance
|
|
"""
|
|
try:
|
|
# Initialize Figma stock ticker
|
|
figma = yf.Ticker(stock)
|
|
|
|
# Get current stock info
|
|
info = figma.info
|
|
|
|
# Get recent historical data (last 30 days)
|
|
hist = figma.history(period="30d")
|
|
|
|
# Get real-time fast info
|
|
fast_info = figma.fast_info
|
|
|
|
# Compile comprehensive data
|
|
figma_data = {
|
|
"company_info": {
|
|
"name": info.get("longName", "Figma Inc."),
|
|
"symbol": "FIG",
|
|
"sector": info.get("sector", "N/A"),
|
|
"industry": info.get("industry", "N/A"),
|
|
"website": info.get("website", "N/A"),
|
|
"description": info.get("longBusinessSummary", "N/A"),
|
|
},
|
|
"current_market_data": {
|
|
"current_price": info.get("currentPrice", "N/A"),
|
|
"previous_close": info.get("previousClose", "N/A"),
|
|
"open": info.get("open", "N/A"),
|
|
"day_low": info.get("dayLow", "N/A"),
|
|
"day_high": info.get("dayHigh", "N/A"),
|
|
"volume": info.get("volume", "N/A"),
|
|
"market_cap": info.get("marketCap", "N/A"),
|
|
"price_change": (
|
|
info.get("currentPrice", 0)
|
|
- info.get("previousClose", 0)
|
|
if info.get("currentPrice")
|
|
and info.get("previousClose")
|
|
else "N/A"
|
|
),
|
|
"price_change_percent": info.get(
|
|
"regularMarketChangePercent", "N/A"
|
|
),
|
|
},
|
|
"financial_metrics": {
|
|
"pe_ratio": info.get("trailingPE", "N/A"),
|
|
"forward_pe": info.get("forwardPE", "N/A"),
|
|
"price_to_book": info.get("priceToBook", "N/A"),
|
|
"price_to_sales": info.get(
|
|
"priceToSalesTrailing12Months", "N/A"
|
|
),
|
|
"enterprise_value": info.get(
|
|
"enterpriseValue", "N/A"
|
|
),
|
|
"beta": info.get("beta", "N/A"),
|
|
"dividend_yield": info.get("dividendYield", "N/A"),
|
|
"payout_ratio": info.get("payoutRatio", "N/A"),
|
|
},
|
|
"trading_statistics": {
|
|
"fifty_day_average": info.get(
|
|
"fiftyDayAverage", "N/A"
|
|
),
|
|
"two_hundred_day_average": info.get(
|
|
"twoHundredDayAverage", "N/A"
|
|
),
|
|
"fifty_two_week_low": info.get(
|
|
"fiftyTwoWeekLow", "N/A"
|
|
),
|
|
"fifty_two_week_high": info.get(
|
|
"fiftyTwoWeekHigh", "N/A"
|
|
),
|
|
"shares_outstanding": info.get(
|
|
"sharesOutstanding", "N/A"
|
|
),
|
|
"float_shares": info.get("floatShares", "N/A"),
|
|
"shares_short": info.get("sharesShort", "N/A"),
|
|
"short_ratio": info.get("shortRatio", "N/A"),
|
|
},
|
|
"recent_performance": {
|
|
"last_30_days": {
|
|
"start_price": (
|
|
hist.iloc[0]["Close"]
|
|
if not hist.empty
|
|
else "N/A"
|
|
),
|
|
"end_price": (
|
|
hist.iloc[-1]["Close"]
|
|
if not hist.empty
|
|
else "N/A"
|
|
),
|
|
"total_return": (
|
|
(
|
|
hist.iloc[-1]["Close"]
|
|
- hist.iloc[0]["Close"]
|
|
)
|
|
/ hist.iloc[0]["Close"]
|
|
* 100
|
|
if not hist.empty
|
|
else "N/A"
|
|
),
|
|
"highest_price": (
|
|
hist["High"].max()
|
|
if not hist.empty
|
|
else "N/A"
|
|
),
|
|
"lowest_price": (
|
|
hist["Low"].min() if not hist.empty else "N/A"
|
|
),
|
|
"average_volume": (
|
|
hist["Volume"].mean()
|
|
if not hist.empty
|
|
else "N/A"
|
|
),
|
|
}
|
|
},
|
|
"real_time_data": {
|
|
"last_price": (
|
|
fast_info.last_price
|
|
if hasattr(fast_info, "last_price")
|
|
else "N/A"
|
|
),
|
|
"last_volume": (
|
|
fast_info.last_volume
|
|
if hasattr(fast_info, "last_volume")
|
|
else "N/A"
|
|
),
|
|
"bid": (
|
|
fast_info.bid
|
|
if hasattr(fast_info, "bid")
|
|
else "N/A"
|
|
),
|
|
"ask": (
|
|
fast_info.ask
|
|
if hasattr(fast_info, "ask")
|
|
else "N/A"
|
|
),
|
|
"bid_size": (
|
|
fast_info.bid_size
|
|
if hasattr(fast_info, "bid_size")
|
|
else "N/A"
|
|
),
|
|
"ask_size": (
|
|
fast_info.ask_size
|
|
if hasattr(fast_info, "ask_size")
|
|
else "N/A"
|
|
),
|
|
},
|
|
}
|
|
|
|
logger.info("Successfully fetched Figma (FIG) stock data")
|
|
return json.dumps(figma_data, indent=4)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Error fetching Figma stock data: {e}")
|
|
raise Exception(f"Failed to fetch Figma stock data: {e}")
|
|
|
|
|
|
# # Example usage
|
|
# # Initialize the quantitative trading agent
|
|
# agent = Agent(
|
|
# agent_name="Quantitative-Trading-Agent",
|
|
# agent_description="Advanced quantitative trading and algorithmic analysis agent specializing in stock analysis and trading strategies",
|
|
# system_prompt=f"""You are an expert quantitative trading agent with deep expertise in:
|
|
# - Algorithmic trading strategies and implementation
|
|
# - Statistical arbitrage and market making
|
|
# - Risk management and portfolio optimization
|
|
# - High-frequency trading systems
|
|
# - Market microstructure analysis
|
|
# - Quantitative research methodologies
|
|
# - Financial mathematics and stochastic processes
|
|
# - Machine learning applications in trading
|
|
# - Technical analysis and chart patterns
|
|
# - Fundamental analysis and valuation models
|
|
# - Options trading and derivatives
|
|
# - Market sentiment analysis
|
|
|
|
# Your core responsibilities include:
|
|
# 1. Developing and backtesting trading strategies
|
|
# 2. Analyzing market data and identifying alpha opportunities
|
|
# 3. Implementing risk management frameworks
|
|
# 4. Optimizing portfolio allocations
|
|
# 5. Conducting quantitative research
|
|
# 6. Monitoring market microstructure
|
|
# 7. Evaluating trading system performance
|
|
# 8. Performing comprehensive stock analysis
|
|
# 9. Generating trading signals and recommendations
|
|
# 10. Risk assessment and position sizing
|
|
|
|
# When analyzing stocks, you should:
|
|
# - Evaluate technical indicators and chart patterns
|
|
# - Assess fundamental metrics and valuation ratios
|
|
# - Analyze market sentiment and momentum
|
|
# - Consider macroeconomic factors
|
|
# - Provide risk-adjusted return projections
|
|
# - Suggest optimal entry/exit points
|
|
# - Calculate position sizing recommendations
|
|
# - Identify potential catalysts and risks
|
|
|
|
# You maintain strict adherence to:
|
|
# - Mathematical rigor in all analyses
|
|
# - Statistical significance in strategy development
|
|
# - Risk-adjusted return optimization
|
|
# - Market impact minimization
|
|
# - Regulatory compliance
|
|
# - Transaction cost analysis
|
|
# - Performance attribution
|
|
# - Data-driven decision making
|
|
|
|
# You communicate in precise, technical terms while maintaining clarity for stakeholders.
|
|
# Data: {get_figma_stock_data('FIG')}
|
|
|
|
# """,
|
|
# max_loops=1,
|
|
# model_name="gpt-4o-mini",
|
|
# dynamic_temperature_enabled=True,
|
|
# output_type="str-all-except-first",
|
|
# streaming_on=True,
|
|
# print_on=True,
|
|
# telemetry_enable=False,
|
|
# )
|
|
|
|
# # Example 1: Basic usage with just a task
|
|
# logger.info("Starting quantitative analysis cron job for Figma (FIG)")
|
|
# cron_job = CronJob(agent=agent, interval="10seconds")
|
|
# cron_job.run(
|
|
# task="Analyze the Figma (FIG) stock comprehensively using the available stock data. Provide a detailed quantitative analysis"
|
|
# )
|
|
|
|
print(get_figma_stock_data("FIG"))
|