""" Test script to compare Stock Oracle financial data with direct yfinance data """ import asyncio import requests import yfinance_plus as yf from datetime import datetime, timezone import pandas as pd import json from typing import Dict, Any # API configuration API_URL = "http://localhost:18001/api/v1" def get_yfinance_data(ticker: str) -> Dict[str, Any]: """Get financial data directly from yfinance""" print(f"\n=== Getting yfinance data for {ticker} ===") # Create ticker object stock = yf.Ticker(ticker) # Get basic info info = stock.info print(f"Company: {info.get('longName', 'N/A')}") print(f"Sector: {info.get('sector', 'N/A')}") print(f"Industry: {info.get('industry', 'N/A')}") # Get quarterly financial statements quarterly_income = stock.quarterly_income_stmt quarterly_balance = stock.quarterly_balance_sheet quarterly_cashflow = stock.quarterly_cashflow # Get current price data current_price = info.get('currentPrice', info.get('regularMarketPrice', 0)) market_cap = info.get('marketCap', 0) print("\n=== Quarterly Income Statement ===") if not quarterly_income.empty: print(quarterly_income.iloc[:, 0:2]) # Show latest 2 quarters print("\n=== Quarterly Balance Sheet ===") if not quarterly_balance.empty: print(quarterly_balance.iloc[:, 0:2]) # Show latest 2 quarters print("\n=== Quarterly Cash Flow ===") if not quarterly_cashflow.empty: print(quarterly_cashflow.iloc[:, 0:2]) # Show latest 2 quarters # Extract specific metrics for comparison yfinance_data = { 'info': info, 'quarterly_income': quarterly_income.to_dict() if not quarterly_income.empty else {}, 'quarterly_balance': quarterly_balance.to_dict() if not quarterly_balance.empty else {}, 'quarterly_cashflow': quarterly_cashflow.to_dict() if not quarterly_cashflow.empty else {}, 'current_price': current_price, 'market_cap': market_cap } return yfinance_data def get_stock_oracle_data(ticker: str, start_date: str, end_date: str) -> Dict[str, Any]: """Get financial data from Stock Oracle API""" print(f"\n=== Getting Stock Oracle data for {ticker} ===") # Request data from API response = requests.post( f"{API_URL}/financial/data", json={ "ticker": ticker, "start_date": start_date, "end_date": end_date, "period_type": "all", "include_metrics": True, "force_refresh": False } ) if response.status_code == 200: data = response.json() print(f"Company: {data['company']['name']}") print(f"Sector: {data['company']['sector']}") print(f"Industry: {data['company']['industry']}") print(f"Number of periods: {len(data['financial_data'])}") return data else: print(f"Error: {response.status_code} - {response.text}") return None def compare_financial_metrics(yfinance_data: Dict, oracle_data: Dict): """Compare financial metrics between yfinance and Stock Oracle""" print("\n=== COMPARISON RESULTS ===") if not oracle_data or 'financial_data' not in oracle_data: print("No Stock Oracle data to compare") return # Get the latest quarter from Stock Oracle latest_oracle = oracle_data['financial_data'][-1] if oracle_data['financial_data'] else None if not latest_oracle: print("No financial data in Stock Oracle") return print(f"\nStock Oracle Latest Period: {latest_oracle['period_date']}") # Compare basic metrics print("\n--- Revenue Comparison ---") oracle_revenue = latest_oracle.get('revenue', 0) print(f"Stock Oracle Revenue: ${oracle_revenue:,.2f}") # Try to get revenue from yfinance if 'quarterly_income' in yfinance_data and yfinance_data['quarterly_income']: quarters = list(yfinance_data['quarterly_income'].keys()) if quarters: latest_quarter = quarters[0] yf_revenue = yfinance_data['quarterly_income'][latest_quarter].get('Total Revenue', 0) print(f"YFinance Revenue: ${yf_revenue:,.2f}") if oracle_revenue > 0: diff_pct = ((oracle_revenue - yf_revenue) / yf_revenue) * 100 print(f"Difference: {diff_pct:.2f}%") print("\n--- Market Cap Comparison ---") oracle_market_cap = latest_oracle.get('market_cap', 0) yf_market_cap = yfinance_data.get('market_cap', 0) print(f"Stock Oracle Market Cap: ${oracle_market_cap:,.2f}") print(f"YFinance Market Cap: ${yf_market_cap:,.2f}") if oracle_market_cap > 0 and yf_market_cap > 0: diff_pct = ((oracle_market_cap - yf_market_cap) / yf_market_cap) * 100 print(f"Difference: {diff_pct:.2f}%") print("\n--- P/E Ratio Comparison ---") oracle_pe = latest_oracle.get('pe_ratio', 0) yf_pe = yfinance_data['info'].get('trailingPE', 0) print(f"Stock Oracle P/E: {oracle_pe:.2f}") print(f"YFinance P/E: {yf_pe:.2f}") if oracle_pe > 0 and yf_pe > 0: diff_pct = ((oracle_pe - yf_pe) / yf_pe) * 100 print(f"Difference: {diff_pct:.2f}%") print("\n--- Other Metrics from Stock Oracle ---") print(f"EPS: ${latest_oracle.get('eps', 0):.2f}") print(f"Total Assets: ${latest_oracle.get('total_assets', 0):,.2f}") print(f"Total Equity: ${latest_oracle.get('total_equity', 0):,.2f}") print(f"ROE: {latest_oracle.get('roe', 0):.2%}") print(f"Net Margin: {latest_oracle.get('net_margin', 0):.2%}") # Check if we have real yfinance quarterly data if 'quarterly_income' in yfinance_data and yfinance_data['quarterly_income']: print("\n--- Available YFinance Metrics ---") quarters = list(yfinance_data['quarterly_income'].keys()) if quarters: latest_quarter = quarters[0] print(f"Latest YFinance Quarter: {latest_quarter}") # Show some key metrics from yfinance income_data = yfinance_data['quarterly_income'][latest_quarter] for key in ['Total Revenue', 'Net Income', 'Operating Income', 'Gross Profit']: if key in income_data: print(f"{key}: ${income_data[key]:,.2f}") def main(): """Main comparison function""" # Test with Apple ticker = "AAPL" start_date = "2024-01-01" end_date = "2024-12-31" print(f"Comparing financial data for {ticker}") print("=" * 60) # Get data from both sources yfinance_data = get_yfinance_data(ticker) oracle_data = get_stock_oracle_data(ticker, start_date, end_date) # Compare the data compare_financial_metrics(yfinance_data, oracle_data) # Test with another ticker print("\n" + "=" * 60) ticker = "MSFT" print(f"\nComparing financial data for {ticker}") print("=" * 60) yfinance_data = get_yfinance_data(ticker) oracle_data = get_stock_oracle_data(ticker, start_date, end_date) compare_financial_metrics(yfinance_data, oracle_data) if __name__ == "__main__": main()