ParallelLLC/algorithmic_trading
2732
1#!/usr/bin/env python32"""3Demo script for the Algorithmic Trading System with FinRL and Alpaca Integration4 5This script demonstrates the complete trading workflow including:6- Data ingestion from multiple sources (CSV, Alpaca, Synthetic)7- Strategy generation with technical indicators8- Order execution with Alpaca broker9- FinRL reinforcement learning integration10- Real-time trading capabilities11"""12 13import os14import sys15import time16import logging17from datetime import datetime, timedelta18from typing import Dict, Any19 20# Add the project root to the path21sys.path.append(os.path.dirname(os.path.abspath(__file__)))22 23from agentic_ai_system.main import load_config24from agentic_ai_system.orchestrator import run, run_backtest, run_live_trading25from agentic_ai_system.data_ingestion import load_data, validate_data, add_technical_indicators26from agentic_ai_system.finrl_agent import FinRLAgent, FinRLConfig27from agentic_ai_system.alpaca_broker import AlpacaBroker28 29def setup_logging():30 """Setup logging configuration"""31 logging.basicConfig(32 level=logging.INFO,33 format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',34 handlers=[35 logging.StreamHandler(),36 logging.FileHandler('logs/demo.log')37 ]38 )39 40def print_system_info(config: Dict[str, Any]):41 """Print system configuration information"""42 print("\n" + "="*60)43 print("๐ค ALGORITHMIC TRADING SYSTEM WITH FINRL & ALPACA")44 print("="*60)45 46 print(f"\n๐ Data Source: {config['data_source']['type']}")47 print(f"๐ Trading Symbol: {config['trading']['symbol']}")48 print(f"๐ฐ Capital: ${config['trading']['capital']:,}")49 print(f"โฑ๏ธ Timeframe: {config['trading']['timeframe']}")50 print(f"๐ง Broker API: {config['execution']['broker_api']}")51 52 if config['execution']['broker_api'] in ['alpaca_paper', 'alpaca_live']:53 print(f"๐ฆ Alpaca Account Type: {config['alpaca']['account_type']}")54 print(f"๐ก Alpaca Base URL: {config['alpaca']['base_url']}")55 56 print(f"๐ง FinRL Algorithm: {config['finrl']['algorithm']}")57 print(f"๐ Learning Rate: {config['finrl']['learning_rate']}")58 print(f"๐ฏ Training Steps: {config['finrl']['training']['total_timesteps']:,}")59 60 print("\n" + "="*60)61 62def demo_data_ingestion(config: Dict[str, Any]):63 """Demonstrate data ingestion capabilities"""64 print("\n๐ฅ DATA INGESTION DEMO")65 print("-" * 30)66 67 try:68 # Load data69 print(f"Loading data from source: {config['data_source']['type']}")70 data = load_data(config)71 72 if data is not None and not data.empty:73 print(f"โ
Successfully loaded {len(data)} data points")74 print(f"๐
Date range: {data['timestamp'].min()} to {data['timestamp'].max()}")75 print(f"๐ฐ Price range: ${data['close'].min():.2f} - ${data['close'].max():.2f}")76 77 # Validate data78 if validate_data(data):79 print("โ
Data validation passed")80 81 # Add technical indicators82 data_with_indicators = add_technical_indicators(data)83 print(f"โ
Added {len(data_with_indicators.columns) - len(data.columns)} technical indicators")84 85 return data_with_indicators86 else:87 print("โ Data validation failed")88 return None89 else:90 print("โ Failed to load data")91 return None92 93 except Exception as e:94 print(f"โ Error in data ingestion: {e}")95 return None96 97def demo_alpaca_integration(config: Dict[str, Any]):98 """Demonstrate Alpaca broker integration"""99 print("\n๐ฆ ALPACA INTEGRATION DEMO")100 print("-" * 30)101 102 if config['execution']['broker_api'] not in ['alpaca_paper', 'alpaca_live']:103 print("โ ๏ธ Alpaca integration not configured (using simulation mode)")104 return None105 106 try:107 # Initialize Alpaca broker108 print("Connecting to Alpaca...")109 alpaca_broker = AlpacaBroker(config)110 111 # Get account information112 account_info = alpaca_broker.get_account_info()113 if account_info:114 print(f"โ
Connected to Alpaca {config['alpaca']['account_type']} account")115 print(f" Account ID: {account_info['account_id']}")116 print(f" Status: {account_info['status']}")117 print(f" Buying Power: ${account_info['buying_power']:,.2f}")118 print(f" Portfolio Value: ${account_info['portfolio_value']:,.2f}")119 print(f" Equity: ${account_info['equity']:,.2f}")120 121 # Check market status122 market_hours = alpaca_broker.get_market_hours()123 if market_hours:124 print(f"๐ Market Status: {'๐ข OPEN' if market_hours['is_open'] else '๐ด CLOSED'}")125 if market_hours['next_open']:126 print(f" Next Open: {market_hours['next_open']}")127 if market_hours['next_close']:128 print(f" Next Close: {market_hours['next_close']}")129 130 # Get current positions131 positions = alpaca_broker.get_positions()132 if positions:133 print(f"๐ Current Positions: {len(positions)}")134 for pos in positions:135 print(f" {pos['symbol']}: {pos['quantity']} shares @ ${pos['current_price']:.2f}")136 else:137 print("๐ No current positions")138 139 return alpaca_broker140 141 except Exception as e:142 print(f"โ Error connecting to Alpaca: {e}")143 return None144 145def demo_finrl_training(config: Dict[str, Any], data):146 """Demonstrate FinRL training"""147 print("\n๐ง FINRL TRAINING DEMO")148 print("-" * 30)149 150 try:151 # Initialize FinRL agent152 finrl_config = FinRLConfig(153 algorithm=config['finrl']['algorithm'],154 learning_rate=config['finrl']['learning_rate'],155 batch_size=config['finrl']['batch_size'],156 buffer_size=config['finrl']['buffer_size'],157 learning_starts=config['finrl']['learning_starts'],158 gamma=config['finrl']['gamma'],159 tau=config['finrl']['tau'],160 train_freq=config['finrl']['train_freq'],161 gradient_steps=config['finrl']['gradient_steps'],162 verbose=config['finrl']['verbose'],163 tensorboard_log=config['finrl']['tensorboard_log']164 )165 166 agent = FinRLAgent(finrl_config)167 168 # Use a subset of data for demo training169 demo_data = data.tail(500) if len(data) > 500 else data170 print(f"Training on {len(demo_data)} data points...")171 172 # Train the agent (shorter training for demo)173 training_steps = min(10000, config['finrl']['training']['total_timesteps'])174 result = agent.train(175 data=demo_data,176 config=config,177 total_timesteps=training_steps,178 use_real_broker=False # Use simulation for demo training179 )180 181 if result['success']:182 print(f"โ
Training completed successfully!")183 print(f" Algorithm: {result['algorithm']}")184 print(f" Timesteps: {result['total_timesteps']:,}")185 print(f" Model saved: {result['model_path']}")186 187 # Test prediction188 print("\n๐ฎ Testing predictions...")189 prediction_result = agent.predict(190 data=demo_data.tail(100),191 config=config,192 use_real_broker=False193 )194 195 if prediction_result['success']:196 print(f"โ
Prediction completed!")197 print(f" Initial Value: ${prediction_result['initial_value']:,.2f}")198 print(f" Final Value: ${prediction_result['final_value']:,.2f}")199 print(f" Total Return: {prediction_result['total_return']:.2%}")200 print(f" Total Trades: {prediction_result['total_trades']}")201 202 return agent203 else:204 print(f"โ Training failed: {result['error']}")205 return None206 207 except Exception as e:208 print(f"โ Error in FinRL training: {e}")209 return None210 211def demo_trading_workflow(config: Dict[str, Any], data):212 """Demonstrate complete trading workflow"""213 print("\n๐ TRADING WORKFLOW DEMO")214 print("-" * 30)215 216 try:217 # Run single trading cycle218 print("Running trading workflow...")219 result = run(config)220 221 if result['success']:222 print("โ
Trading workflow completed successfully!")223 print(f" Data Loaded: {'โ
' if result['data_loaded'] else 'โ'}")224 print(f" Signal Generated: {'โ
' if result['signal_generated'] else 'โ'}")225 print(f" Order Executed: {'โ
' if result['order_executed'] else 'โ'}")226 print(f" Execution Time: {result['execution_time']:.2f} seconds")227 228 if result['order_executed'] and result['execution_result']:229 exec_result = result['execution_result']230 print(f" Order ID: {exec_result.get('order_id', 'N/A')}")231 print(f" Action: {exec_result['action']}")232 print(f" Symbol: {exec_result['symbol']}")233 print(f" Quantity: {exec_result['quantity']}")234 print(f" Price: ${exec_result['price']:.2f}")235 print(f" Total Value: ${exec_result['total_value']:.2f}")236 else:237 print("โ Trading workflow failed!")238 for error in result['errors']:239 print(f" Error: {error}")240 241 return result242 243 except Exception as e:244 print(f"โ Error in trading workflow: {e}")245 return None246 247def demo_backtest(config: Dict[str, Any], data):248 """Demonstrate backtesting capabilities"""249 print("\n๐ BACKTESTING DEMO")250 print("-" * 30)251 252 try:253 # Run backtest on recent data254 end_date = datetime.now().strftime('%Y-%m-%d')255 start_date = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')256 257 print(f"Running backtest from {start_date} to {end_date}...")258 result = run_backtest(config, start_date, end_date)259 260 if result['success']:261 print("โ
Backtest completed successfully!")262 print(f" Initial Capital: ${result['initial_capital']:,.2f}")263 print(f" Final Value: ${result['final_value']:,.2f}")264 print(f" Total Return: {result['total_return']:.2%}")265 print(f" Total Trades: {result['total_trades']}")266 267 # Calculate additional metrics268 if result['total_trades'] > 0:269 win_rate = len([t for t in result['trades'] if t.get('execution', {}).get('success', False)]) / result['total_trades']270 print(f" Win Rate: {win_rate:.2%}")271 else:272 print(f"โ Backtest failed: {result.get('error', 'Unknown error')}")273 274 return result275 276 except Exception as e:277 print(f"โ Error in backtesting: {e}")278 return None279 280def main():281 """Main demo function"""282 setup_logging()283 284 try:285 # Load configuration286 config = load_config()287 print_system_info(config)288 289 # Demo 1: Data Ingestion290 data = demo_data_ingestion(config)291 if data is None:292 print("โ Cannot proceed without data")293 return294 295 # Demo 2: Alpaca Integration296 alpaca_broker = demo_alpaca_integration(config)297 298 # Demo 3: FinRL Training299 finrl_agent = demo_finrl_training(config, data)300 301 # Demo 4: Trading Workflow302 workflow_result = demo_trading_workflow(config, data)303 304 # Demo 5: Backtesting305 backtest_result = demo_backtest(config, data)306 307 # Summary308 print("\n" + "="*60)309 print("๐ DEMO COMPLETED SUCCESSFULLY!")310 print("="*60)311 print("\n๐ Summary:")312 print(f" โ
Data Ingestion: {'Working' if data is not None else 'Failed'}")313 print(f" โ
Alpaca Integration: {'Working' if alpaca_broker is not None else 'Simulation Mode'}")314 print(f" โ
FinRL Training: {'Working' if finrl_agent is not None else 'Failed'}")315 print(f" โ
Trading Workflow: {'Working' if workflow_result and workflow_result['success'] else 'Failed'}")316 print(f" โ
Backtesting: {'Working' if backtest_result and backtest_result['success'] else 'Failed'}")317 318 print("\n๐ Next Steps:")319 print(" 1. Set up your Alpaca API credentials in .env file")320 print(" 2. Configure your trading strategy in config.yaml")321 print(" 3. Run live trading with: python -m agentic_ai_system.main --mode live")322 print(" 4. Monitor performance in logs/ directory")323 324 except Exception as e:325 print(f"โ Demo failed with error: {e}")326 logging.error(f"Demo error: {e}", exc_info=True)327 328if __name__ == "__main__":329 main() 