TradingAgents/tradingagents/indian_config.py

226 lines
8.1 KiB
Python

import os
import pytz
from typing import Dict, List, Any
from tradingagents.default_config import DEFAULT_CONFIG
# Indian market configuration
INDIAN_CONFIG = DEFAULT_CONFIG.copy()
# Update with Indian market specific settings
INDIAN_CONFIG.update({
# Market identification
"market_region": "india",
"currency": "INR",
"timezone": "Asia/Kolkata",
# Trading hours (IST)
"trading_hours": {
"pre_open": "09:00",
"open": "09:15",
"close": "15:30",
"post_close": "16:00",
"timezone": "Asia/Kolkata"
},
# Indian exchanges
"exchanges": {
"primary": "NSE",
"secondary": "BSE",
"supported": ["NSE", "BSE"]
},
# Data sources configuration
"data_sources": {
"market_data": {
"primary": "alpha_vantage",
"secondary": "yahoo_finance",
"fallback": "manual_nse_api"
},
"fundamental_data": {
"primary": "alpha_vantage",
"secondary": "yahoo_finance",
"indian_specific": "moneycontrol_scraper"
},
"news_data": {
"primary": "google_news",
"indian_sources": ["economic_times", "moneycontrol", "business_standard"],
"government": ["rbi_announcements", "sebi_updates"]
},
"sentiment_data": {
"social_media": ["twitter_india", "reddit_india"],
"forums": ["indian_stock_forums", "valuepickr"]
}
},
# API keys (to be set via environment variables)
"api_keys": {
"alpha_vantage": os.getenv("ALPHA_VANTAGE_API_KEY"),
"financial_modeling_prep": os.getenv("FMP_API_KEY"),
"polygon": os.getenv("POLYGON_API_KEY"),
"twitter": os.getenv("TWITTER_API_KEY"),
"news_api": os.getenv("NEWS_API_KEY")
},
# Indian market specific parameters
"market_parameters": {
"circuit_breakers": {
"individual_stock": {"upper": 0.20, "lower": 0.20}, # 20% circuit breakers
"index": {"upper": 0.10, "lower": 0.10} # 10% for indices
},
"lot_sizes": {
# Will be populated dynamically or from file
"default": 1
},
"tick_sizes": {
"below_100": 0.05,
"100_to_1000": 0.05,
"above_1000": 0.05
},
"settlement": "T+1" # Indian market settlement cycle
},
# Indian indices for correlation analysis
"benchmark_indices": {
"broad_market": ["^NSEI", "^BSESN"], # Nifty 50, Sensex
"sectoral": {
"banking": "^CNXBANK",
"it": "^CNXIT",
"auto": "^CNXAUTO",
"pharma": "^CNXPHARMA",
"fmcg": "^CNXFMCG",
"metal": "^CNXMETAL",
"realty": "^CNXREALTY"
}
},
# Regulatory and compliance
"regulatory": {
"sebi_regulations": True,
"insider_trading_rules": True,
"disclosure_requirements": True,
"algorithmic_trading_approval": False # Set to True if approved
},
# Indian market holidays (major ones - should be updated annually)
"market_holidays_2024": [
"2024-01-26", # Republic Day
"2024-03-08", # Holi
"2024-03-29", # Good Friday
"2024-04-11", # Eid ul Fitr
"2024-04-17", # Ram Navami
"2024-05-01", # Maharashtra Day
"2024-08-15", # Independence Day
"2024-08-26", # Janmashtami
"2024-10-02", # Gandhi Jayanti
"2024-10-31", # Diwali Laxmi Puja
"2024-11-01", # Diwali Balipratipada
"2024-11-15", # Guru Nanak Jayanti
],
# Risk management parameters for Indian market
"risk_parameters": {
"max_position_size": 0.05, # 5% of portfolio
"stop_loss_default": 0.08, # 8% stop loss
"volatility_adjustment": 1.2, # Indian markets are more volatile
"liquidity_threshold": 1000000, # Minimum daily volume in INR
"market_cap_preference": "large_cap" # Prefer large cap for stability
},
# Currency and conversion
"currency_settings": {
"base_currency": "INR",
"usd_inr_tracking": True,
"currency_hedging": False
}
})
# Major Indian stocks for testing and validation
MAJOR_INDIAN_STOCKS = {
# Large Cap - Nifty 50 constituents
"RELIANCE": {"name": "Reliance Industries Ltd", "sector": "Energy", "exchange": "NSE"},
"TCS": {"name": "Tata Consultancy Services", "sector": "IT", "exchange": "NSE"},
"HDFCBANK": {"name": "HDFC Bank Ltd", "sector": "Banking", "exchange": "NSE"},
"INFY": {"name": "Infosys Ltd", "sector": "IT", "exchange": "NSE"},
"ICICIBANK": {"name": "ICICI Bank Ltd", "sector": "Banking", "exchange": "NSE"},
"HINDUNILVR": {"name": "Hindustan Unilever Ltd", "sector": "FMCG", "exchange": "NSE"},
"ITC": {"name": "ITC Ltd", "sector": "FMCG", "exchange": "NSE"},
"SBIN": {"name": "State Bank of India", "sector": "Banking", "exchange": "NSE"},
"BHARTIARTL": {"name": "Bharti Airtel Ltd", "sector": "Telecom", "exchange": "NSE"},
"KOTAKBANK": {"name": "Kotak Mahindra Bank", "sector": "Banking", "exchange": "NSE"},
"LT": {"name": "Larsen & Toubro Ltd", "sector": "Infrastructure", "exchange": "NSE"},
"HCLTECH": {"name": "HCL Technologies Ltd", "sector": "IT", "exchange": "NSE"},
"ASIANPAINT": {"name": "Asian Paints Ltd", "sector": "Paints", "exchange": "NSE"},
"MARUTI": {"name": "Maruti Suzuki India Ltd", "sector": "Auto", "exchange": "NSE"},
"BAJFINANCE": {"name": "Bajaj Finance Ltd", "sector": "NBFC", "exchange": "NSE"},
"WIPRO": {"name": "Wipro Ltd", "sector": "IT", "exchange": "NSE"},
"NESTLEIND": {"name": "Nestle India Ltd", "sector": "FMCG", "exchange": "NSE"},
"ULTRACEMCO": {"name": "UltraTech Cement Ltd", "sector": "Cement", "exchange": "NSE"},
"TITAN": {"name": "Titan Company Ltd", "sector": "Jewellery", "exchange": "NSE"},
"POWERGRID": {"name": "Power Grid Corporation", "sector": "Power", "exchange": "NSE"}
}
# Sectoral classifications for Indian market
INDIAN_SECTORS = {
"banking": ["HDFCBANK", "ICICIBANK", "SBIN", "KOTAKBANK", "AXISBANK"],
"it": ["TCS", "INFY", "HCLTECH", "WIPRO", "TECHM"],
"fmcg": ["HINDUNILVR", "ITC", "NESTLEIND", "BRITANNIA"],
"auto": ["MARUTI", "TATAMOTORS", "M&M", "BAJAJ-AUTO"],
"pharma": ["SUNPHARMA", "DRREDDY", "CIPLA", "DIVISLAB"],
"energy": ["RELIANCE", "ONGC", "IOC", "BPCL"],
"telecom": ["BHARTIARTL", "JIOFINANCE"],
"metals": ["TATASTEEL", "HINDALCO", "VEDL", "JSW"],
"cement": ["ULTRACEMCO", "SHREECEM", "ACC"],
"nbfc": ["BAJFINANCE", "SBICARD", "CHOLAFIN"]
}
def get_indian_config() -> Dict[str, Any]:
"""Get the Indian market configuration"""
return INDIAN_CONFIG.copy()
def get_major_stocks() -> Dict[str, Dict[str, str]]:
"""Get major Indian stocks dictionary"""
return MAJOR_INDIAN_STOCKS.copy()
def get_sector_stocks(sector: str) -> List[str]:
"""Get stocks for a specific sector"""
return INDIAN_SECTORS.get(sector.lower(), [])
def is_market_open() -> bool:
"""Check if Indian market is currently open"""
import datetime
ist = pytz.timezone('Asia/Kolkata')
now = datetime.datetime.now(ist)
# Check if it's a weekday
if now.weekday() >= 5: # Saturday = 5, Sunday = 6
return False
# Check trading hours
market_open = now.replace(hour=9, minute=15, second=0, microsecond=0)
market_close = now.replace(hour=15, minute=30, second=0, microsecond=0)
return market_open <= now <= market_close
def get_market_status() -> str:
"""Get current market status"""
import datetime
ist = pytz.timezone('Asia/Kolkata')
now = datetime.datetime.now(ist)
if now.weekday() >= 5:
return "closed_weekend"
market_open = now.replace(hour=9, minute=15, second=0, microsecond=0)
market_close = now.replace(hour=15, minute=30, second=0, microsecond=0)
pre_open = now.replace(hour=9, minute=0, second=0, microsecond=0)
if now < pre_open:
return "pre_market"
elif pre_open <= now < market_open:
return "pre_open"
elif market_open <= now <= market_close:
return "open"
else:
return "closed"