Sanchit7's picture
Initial Hugging Face Spaces deployment
9e0d3ce
raw
history blame
3.58 kB
"""
Command-line interface for Financial Research Agent
Quick analysis without starting the web server
"""
import asyncio
import argparse
import logging
from pathlib import Path
from .core.types import AnalysisRequest
from .agents.orchestrator import EquityAnalysisOrchestrator
def setup_logging(verbose: bool = False):
"""Setup logging configuration"""
level = logging.DEBUG if verbose else logging.INFO
logging.basicConfig(
level=level,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
)
async def analyze_ticker(
ticker: str,
company_name: str = None,
filing_type: str = "10-K",
include_news: bool = True,
include_technicals: bool = True,
):
"""Analyze a single ticker"""
orchestrator = EquityAnalysisOrchestrator()
request = AnalysisRequest(
ticker=ticker.upper(),
company_name=company_name,
filing_type=filing_type,
include_news=include_news,
include_technicals=include_technicals,
)
print(f"\n{'='*60}")
print(f"Analyzing {request.ticker}...")
print(f"{'='*60}\n")
result = await orchestrator.analyze(request)
# Print results
print("\n" + "="*60)
print("ANALYSIS RESULTS")
print("="*60)
rec = result.recommendation
print(f"\nTicker: {rec.ticker}")
print(f"Sentiment: {rec.sentiment}")
print(f"Confidence: {rec.confidence}")
print(f"\nRecommended Action:")
print(f" {rec.recommended_action}")
if rec.key_risks:
print(f"\nKey Risks:")
for risk in rec.key_risks:
print(f" [{risk.severity.upper()}] {risk.description}")
if rec.key_opportunities:
print(f"\nKey Opportunities:")
for opp in rec.key_opportunities:
print(f" • {opp}")
print(f"\nReasoning:")
print("-" * 60)
print(rec.reasoning)
print("-" * 60)
return result
def main():
"""CLI entry point"""
parser = argparse.ArgumentParser(
description="Financial Research Agent - Autonomous Equity Analysis"
)
parser.add_argument(
"ticker",
type=str,
help="Stock ticker symbol (e.g., TSLA, AAPL, RBLX)",
)
parser.add_argument(
"-c", "--company",
type=str,
help="Company name for better news search",
)
parser.add_argument(
"-f", "--filing-type",
type=str,
default="10-K",
choices=["10-K", "10-Q", "8-K"],
help="SEC filing type to analyze (default: 10-K)",
)
parser.add_argument(
"--no-news",
action="store_true",
help="Skip news analysis",
)
parser.add_argument(
"--no-technicals",
action="store_true",
help="Skip technical analysis",
)
parser.add_argument(
"-v", "--verbose",
action="store_true",
help="Verbose logging",
)
args = parser.parse_args()
# Setup logging
setup_logging(args.verbose)
# Run analysis
try:
asyncio.run(
analyze_ticker(
ticker=args.ticker,
company_name=args.company,
filing_type=args.filing_type,
include_news=not args.no_news,
include_technicals=not args.no_technicals,
)
)
except KeyboardInterrupt:
print("\n\nAnalysis interrupted by user")
except Exception as e:
print(f"\n\nError: {str(e)}")
if args.verbose:
import traceback
traceback.print_exc()
if __name__ == "__main__":
main()