File size: 5,204 Bytes
c04ca05
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# main.py
from fastapi import FastAPI, HTTPException, Depends
from fastapi.middleware.cors import CORSMiddleware # If Streamlit runs on a different port
from typing import Dict, List
from services.data_fetcher import IndianMarketDataFetcher
from services.analyzer import IndianFinancialAnalyzer
from services.swarm_service import create_indian_market_swarm
from models.market_data import StockDataResponse, IndexData, SectorPerformance, EconomicIndicators
from models.analysis import StockAnalysisResponse, SwarmAnalysisResponse, InvestmentRecommendationResponse
from config import NIFTY50_COMPANIES

app = FastAPI(title="Indian Market Analysis API", version="1.0.0")

# Configure CORS if needed (e.g., if Streamlit runs on localhost:8501)
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"], # Restrict this in production!
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# Dependency Injection for services
def get_data_fetcher():
    return IndianMarketDataFetcher()

def get_analyzer():
    return IndianFinancialAnalyzer()

# --- API Endpoints ---

@app.get("/")
async def root():
    return {"message": "Indian Market Analysis API"}

# --- Market Data Endpoints ---

@app.get("/api/market/indices", response_model=Dict[str, IndexData])
async def get_market_indices(fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
    """Get live market indices data."""
    return fetcher.get_market_indices()

@app.get("/api/market/sectors", response_model=Dict[str, SectorPerformance])
async def get_sector_performance(fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
    """Get sector performance data."""
    return fetcher.get_sector_performance()

@app.get("/api/market/economic", response_model=EconomicIndicators)
async def get_economic_indicators(analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
    """Get key economic indicators."""
    return EconomicIndicators(
        repo_rate=analyzer.rbi_repo_rate,
        inflation_rate=analyzer.indian_inflation_rate
    )

# --- Stock Data Endpoints ---

@app.get("/api/stocks/list", response_model=Dict[str, str])
async def get_nifty50_list(fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
    """Get the list of Nifty 50 companies."""
    return fetcher.get_nifty50_companies()

@app.get("/api/stocks/{symbol}", response_model=StockDataResponse)
async def get_stock_data(symbol: str, period: str = "1y", fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher)):
    """Get detailed stock data for a given symbol."""
    stock_data = fetcher.get_stock_data(symbol, period)
    if not stock_data:
        raise HTTPException(status_code=404, detail=f"Data for stock symbol {symbol} could not be fetched.")
    return stock_data

# --- Analysis Endpoints ---

@app.post("/api/analysis/stock/{symbol}", response_model=StockAnalysisResponse)
async def analyze_stock(symbol: str, period: str = "1y",

                        fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher),

                        analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
    """Perform basic financial analysis on a stock."""
    stock_data = fetcher.get_stock_data(symbol, period)
    if not stock_data:
        raise HTTPException(status_code=404, detail=f"Data for stock symbol {symbol} could not be fetched.")

    company_name = NIFTY50_COMPANIES.get(symbol, symbol)
    return analyzer.analyze_indian_stock(stock_data, company_name)

@app.post("/api/analysis/swarm/{symbol}", response_model=SwarmAnalysisResponse)
async def run_swarm_analysis(symbol: str, period: str = "1y",

                             fetcher: IndianMarketDataFetcher = Depends(get_data_fetcher),

                             analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
    """Run AI swarm analysis on a stock."""
    stock_data = fetcher.get_stock_data(symbol, period)
    if not stock_data:
        return SwarmAnalysisResponse(status="error", error=f"Data for stock symbol {symbol} could not be fetched.")

    company_name = NIFTY50_COMPANIES.get(symbol, symbol)

    # Perform basic analysis first
    basic_analysis_response = analyzer.analyze_indian_stock(stock_data, company_name)
    basic_analysis_text = basic_analysis_response.basic_analysis

    # Prepare data for swarm analysis
    market_data_summary = f"""

Stock: {company_name} ({symbol})

Current Price: ₹{stock_data.history.get('Close', [0])[-1] if stock_data.history.get('Close') else 'N/A'}

Market Data Analysis: {basic_analysis_text}

"""

    # Run swarm analysis
    return create_indian_market_swarm(market_data_summary, company_name)

@app.get("/api/analysis/recommendation", response_model=InvestmentRecommendationResponse)
async def get_investment_recommendation(analyzer: IndianFinancialAnalyzer = Depends(get_analyzer)):
    """Get general investment recommendations."""
    return analyzer.generate_investment_recommendation()

# --- Utility Endpoints ---

@app.get("/api/health")
async def health_check():
    """Health check endpoint."""
    return {"status": "ok"}