From b993946ab382c99fe05b3c1d3dd905d6863ddb13 Mon Sep 17 00:00:00 2001 From: Omar Marie Date: Mon, 21 Jul 2025 23:13:12 +0300 Subject: [PATCH] remove: old notebook --- .../stock_analysis_sharia_compliance.ipynb | 1008 ----------------- 1 file changed, 1008 deletions(-) delete mode 100644 week4/community-contributions/ai_stock_trading/stock_analysis_sharia_compliance.ipynb diff --git a/week4/community-contributions/ai_stock_trading/stock_analysis_sharia_compliance.ipynb b/week4/community-contributions/ai_stock_trading/stock_analysis_sharia_compliance.ipynb deleted file mode 100644 index 7fd7810..0000000 --- a/week4/community-contributions/ai_stock_trading/stock_analysis_sharia_compliance.ipynb +++ /dev/null @@ -1,1008 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "# Stock Analysis & Sharia Compliance Chat Interface\n", - "\n", - "This notebook implements a comprehensive Gradio-based chat interface for stock analysis and Islamic Sharia compliance checks. It provides:\n", - "\n", - "- **Real-time Stock Data Fetching** using yfinance\n", - "- **Technical Analysis** with multiple time periods\n", - "- **AI-Powered Trade Recommendations** using OpenAI GPT-4o-mini\n", - "- **Sharia Compliance Assessment** for Islamic investing\n", - "- **Interactive Charts** and user-friendly interface\n", - "\n", - "## Features\n", - "1. Multi-period stock analysis (1 month, 1 year, 5 years)\n", - "2. Automated trade advice (BUY/HOLD/SELL) with justification\n", - "3. Sharia compliance ruling with confidence scores\n", - "4. Interactive price charts\n", - "5. Clean Gradio chat interface\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 1. Imports\n", - "\n", - "First, let's import all necessary libraries and set up our environment.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "āœ… OpenAI API key loaded successfully\n", - "šŸš€ All libraries imported successfully!\n" - ] - } - ], - "source": [ - "# Core imports\n", - "import os\n", - "import json\n", - "import warnings\n", - "from dotenv import load_dotenv\n", - "\n", - "warnings.filterwarnings('ignore')\n", - "\n", - "# Data and analysis\n", - "import yfinance as yf\n", - "import pandas as pd\n", - "import numpy as np\n", - "\n", - "# Visualization\n", - "import matplotlib.pyplot as plt\n", - "import matplotlib.dates as mdates\n", - "\n", - "# Web scraping for company info\n", - "import requests\n", - "from bs4 import BeautifulSoup\n", - "\n", - "# AI and interface\n", - "import openai\n", - "import gradio as gr\n", - "\n", - "# Load OpenAI API key from environment\n", - "load_dotenv(override=True)\n", - "openai.api_key = os.getenv('OPENAI_API_KEY')\n", - "\n", - "if not openai.api_key:\n", - " print(\"āš ļø Warning: OPENAI_API_KEY not found in environment variables\")\n", - " print(\"Please set your OpenAI API key: export OPENAI_API_KEY='your-key-here'\")\n", - "else:\n", - " print(\"āœ… OpenAI API key loaded successfully\")\n", - "\n", - "print(\"šŸš€ All libraries imported successfully!\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 2. Data Fetching Tool\n", - "\n", - "This function fetches historical stock data using yfinance for any given symbol, period, and interval.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "āœ… Successfully fetched 17 data points for ABUK.CA (1mo)\n", - "\n", - "šŸ“Š Sample data for ABUK.CA:\n", - " Open High Low Close \\\n", - "Date \n", - "2025-06-22 00:00:00+03:00 45.970001 47.000000 45.049999 46.840000 \n", - "2025-06-23 00:00:00+03:00 46.840000 47.099998 45.830002 46.410000 \n", - "2025-06-24 00:00:00+03:00 46.410000 47.950001 47.009998 47.889999 \n", - "2025-06-25 00:00:00+03:00 47.889999 48.990002 47.939999 48.889999 \n", - "2025-06-29 00:00:00+03:00 48.889999 50.869999 49.520000 50.389999 \n", - "\n", - " Volume Dividends Stock Splits Capital Gains \n", - "Date \n", - "2025-06-22 00:00:00+03:00 408343 0.0 0.0 0.0 \n", - "2025-06-23 00:00:00+03:00 1425250 0.0 0.0 0.0 \n", - "2025-06-24 00:00:00+03:00 1184487 0.0 0.0 0.0 \n", - "2025-06-25 00:00:00+03:00 833208 0.0 0.0 0.0 \n", - "2025-06-29 00:00:00+03:00 994006 0.0 0.0 0.0 \n" - ] - } - ], - "source": [ - "def fetch_history(symbol, period=\"1mo\", interval=\"1d\"):\n", - " \"\"\"\n", - " Fetch historical stock data using yfinance\n", - " \n", - " Args:\n", - " symbol (str): Stock ticker symbol (e.g., 'AAPL', 'MSFT')\n", - " period (str): Time period ('1d', '5d', '1mo', '3mo', '6mo', '1y', '2y', '5y', '10y', 'ytd', 'max')\n", - " interval (str): Data interval ('1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1wk', '1mo', '3mo')\n", - " \n", - " Returns:\n", - " pandas.DataFrame: Historical stock data with OHLCV columns\n", - " \"\"\"\n", - " try:\n", - " # Create ticker object\n", - " ticker = yf.Ticker(symbol)\n", - " \n", - " # Fetch historical data\n", - " df = ticker.history(period=period, interval=interval)\n", - " \n", - " if df.empty:\n", - " raise ValueError(f\"No data found for symbol: {symbol}\")\n", - " \n", - " print(f\"āœ… Successfully fetched {len(df)} data points for {symbol} ({period})\")\n", - " return df\n", - " \n", - " except Exception as e:\n", - " print(f\"āŒ Error fetching data for {symbol}: {str(e)}\")\n", - " return pd.DataFrame()\n", - "\n", - "# Test the function\n", - "test_symbol = \"ABUK.CA\"\n", - "test_data = fetch_history(test_symbol, \"1mo\", \"1d\")\n", - "if not test_data.empty:\n", - " print(f\"\\nšŸ“Š Sample data for {test_symbol}:\")\n", - " print(test_data.head())\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 3. Analysis Tool\n", - "\n", - "This function analyzes the fetched data and computes key financial metrics.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "šŸ“ˆ Analysis Summary:\n", - " start_price: 46.84\n", - " end_price: 52.7\n", - " total_return_%: 12.51\n", - " volatility_%: 30.91\n", - " avg_volume: 1153685\n", - " max_price: 53.25\n", - " min_price: 45.05\n", - " price_range_%: 18.2\n" - ] - } - ], - "source": [ - "def summarize(df):\n", - " \"\"\"\n", - " Analyze DataFrame and return key financial metrics\n", - " \n", - " Args:\n", - " df (pandas.DataFrame): Historical stock data with OHLCV columns\n", - " \n", - " Returns:\n", - " dict: Summary metrics including returns, volatility, and volume\n", - " \"\"\"\n", - " if df.empty:\n", - " return {\n", - " \"start_price\": 0,\n", - " \"end_price\": 0,\n", - " \"total_return_%\": 0,\n", - " \"volatility_%\": 0,\n", - " \"avg_volume\": 0,\n", - " \"max_price\": 0,\n", - " \"min_price\": 0,\n", - " \"price_range_%\": 0\n", - " }\n", - " \n", - " try:\n", - " # Basic price metrics\n", - " start_price = float(df['Close'].iloc[0])\n", - " end_price = float(df['Close'].iloc[-1])\n", - " max_price = float(df['High'].max())\n", - " min_price = float(df['Low'].min())\n", - " \n", - " # Calculate returns\n", - " total_return = ((end_price - start_price) / start_price) * 100\n", - " \n", - " # Calculate volatility (annualized)\n", - " daily_returns = df['Close'].pct_change().dropna()\n", - " volatility = daily_returns.std() * np.sqrt(252) * 100 # Annualized\n", - " \n", - " # Volume metrics\n", - " avg_volume = float(df['Volume'].mean())\n", - " \n", - " # Price range\n", - " price_range = ((max_price - min_price) / min_price) * 100\n", - " \n", - " summary = {\n", - " \"start_price\": round(start_price, 2),\n", - " \"end_price\": round(end_price, 2),\n", - " \"total_return_%\": round(total_return, 2),\n", - " \"volatility_%\": round(volatility, 2),\n", - " \"avg_volume\": int(avg_volume),\n", - " \"max_price\": round(max_price, 2),\n", - " \"min_price\": round(min_price, 2),\n", - " \"price_range_%\": round(price_range, 2)\n", - " }\n", - " \n", - " return summary\n", - " \n", - " except Exception as e:\n", - " print(f\"āŒ Error in analysis: {str(e)}\")\n", - " return {\"error\": str(e)}\n", - "\n", - "# Test the analysis function\n", - "if not test_data.empty:\n", - " test_summary = summarize(test_data)\n", - " print(\"\\nšŸ“ˆ Analysis Summary:\")\n", - " for key, value in test_summary.items():\n", - " print(f\" {key}: {value}\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 4. Trade Decision Tool\n", - "\n", - "This function uses OpenAI GPT-4o-mini to provide intelligent trade recommendations based on multi-period analysis.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "šŸ¤– Getting AI trade advice...\n", - "\n", - "Trade Advice for ABUK.CA:\n", - "RECOMMENDATION: BUY\n", - "\n", - "**Justification:**\n", - "\n", - "1. **Price Movement**: The stock price has increased from $46.84 to $52.7 over the past month, representing a gain of 12.51%. This upward momentum indicates strong buying interest and positive market sentiment.\n", - "\n", - "2. **Volatility**: The volatility of 30.91% is relatively high, suggesting that while the stock can experience significant price swings, it also presents opportunities for substantial gains. For risk-tolerant investors, this volatility can be seen as a chance to capitalize on price movements.\n", - "\n", - "3. **Average Volume**: The average volume of 1,153,685 shares traded indicates a healthy level of liquidity, allowing for easier entry and exit points for investors. High trading volume often correlates with strong investor interest and can support price stability.\n", - "\n", - "4. **Price Range**: The price range of 18.2% suggests that the stock has experienced considerable fluctuations within the month. However, the upward trend and the recent price increase indicate that the stock is currently on a bullish trajectory.\n", - "\n", - "5. **Risk Factors**: While the high volatility presents risks, the recent positive performance and the total return of 12.51% over the month suggest that the stock is gaining traction. Investors should be aware of potential market corrections but can take advantage of the current upward trend.\n", - "\n", - "**Conclusion**: Given the strong price performance, reasonable trading volume, and potential for continued growth despite volatility, the recommendation is to BUY ABUK.CA. Investors should monitor the stock closely for any changes in market conditions or company fundamentals that may impact future performance.\n" - ] - } - ], - "source": [ - "def get_trade_advice(symbol, summaries):\n", - " \"\"\"\n", - " Get AI-powered trade advice using OpenAI GPT-4o-mini\n", - " \n", - " Args:\n", - " symbol (str): Stock ticker symbol\n", - " summaries (dict): Dictionary containing summaries for different periods\n", - " \n", - " Returns:\n", - " str: Trade advice from AI assistant\n", - " \"\"\"\n", - " if not openai.api_key:\n", - " return \"āŒ OpenAI API key not configured. Please set OPENAI_API_KEY environment variable.\"\n", - " \n", - " try:\n", - " # Build multi-period summary text\n", - " summary_text = f\"Stock Analysis for {symbol}:\\n\\n\"\n", - " \n", - " for period, data in summaries.items():\n", - " if \"error\" not in data:\n", - " summary_text += f\"{period.upper()} ANALYSIS:\\n\"\n", - " summary_text += f\" • Price: ${data['start_price']} → ${data['end_price']}\\n\"\n", - " summary_text += f\" • Total Return: {data['total_return_%']}%\\n\"\n", - " summary_text += f\" • Volatility: {data['volatility_%']}%\\n\"\n", - " summary_text += f\" • Average Volume: {data['avg_volume']:,}\\n\"\n", - " summary_text += f\" • Price Range: {data['price_range_%']}%\\n\\n\"\n", - " \n", - " # Create the prompt\n", - " prompt = f\"\"\"As a professional financial analyst, analyze the following stock data and provide a clear BUY/HOLD/SELL recommendation.\n", - "\n", - "{summary_text}\n", - "\n", - "Instructions:\n", - "1. Start your response with a clear decision: \"RECOMMENDATION: BUY/HOLD/SELL\"\n", - "2. Provide specific numerical justification based on the data\n", - "3. Consider multiple timeframes and risk factors\n", - "4. Keep your analysis concise but thorough\n", - "5. Include key metrics that support your decision\n", - "\n", - "Should I BUY/HOLD/SELL this stock? Justify with numbers.\"\"\"\n", - "\n", - " # Call OpenAI API\n", - " response = openai.chat.completions.create(\n", - " model=\"gpt-4o-mini\",\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": \"You are a professional financial analyst providing stock trading advice based on technical analysis.\"},\n", - " {\"role\": \"user\", \"content\": prompt}\n", - " ],\n", - " max_tokens=500,\n", - " temperature=0.3\n", - " )\n", - " \n", - " advice = response.choices[0].message.content.strip()\n", - " return advice\n", - " \n", - " except Exception as e:\n", - " return f\"āŒ Error getting trade advice: {str(e)}\"\n", - "\n", - "# Test with dummy data\n", - "if not test_data.empty:\n", - " test_summaries = {\"1mo\": test_summary}\n", - " print(\"\\nšŸ¤– Getting AI trade advice...\")\n", - " test_advice = get_trade_advice(test_symbol, test_summaries)\n", - " print(f\"\\nTrade Advice for {test_symbol}:\")\n", - " print(test_advice)\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 5. Sharia Compliance Tool\n", - "\n", - "This tool assesses whether a stock is compliant with Islamic Sharia principles by analyzing the company's business activities.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "ā˜Ŗļø Testing Sharia compliance assessment...\n", - "\n", - "Sharia Assessment for ABUK.CA:\n", - "Ruling: DOUBTFUL\n", - "Confidence: 50%\n", - "Justification: The business description for ABUK.CA does not provide sufficient information about its specific activities or revenue sources. Without clarity on whether the company engages in any HARAM activities or has excessive debt, it is prudent to classify it as DOUBTFUL. Further investigation into the company's financials and business operations is necessary to make a definitive ruling.\n" - ] - } - ], - "source": [ - "def get_company_profile(symbol):\n", - " \"\"\"\n", - " Fetch company information from the internet\n", - " \n", - " Args:\n", - " symbol (str): Stock ticker symbol\n", - " \n", - " Returns:\n", - " str: Company description and business activities\n", - " \"\"\"\n", - " try:\n", - " # Use yfinance to get company info\n", - " ticker = yf.Ticker(symbol)\n", - " info = ticker.info\n", - " \n", - " company_info = \"\"\n", - " if 'longBusinessSummary' in info:\n", - " company_info = info['longBusinessSummary']\n", - " elif 'description' in info:\n", - " company_info = info['description']\n", - " else:\n", - " # Fallback: try to get basic info\n", - " company_info = f\"Company: {info.get('longName', symbol)}, \"\n", - " company_info += f\"Sector: {info.get('sector', 'Unknown')}, \"\n", - " company_info += f\"Industry: {info.get('industry', 'Unknown')}\"\n", - " \n", - " return company_info\n", - " \n", - " except Exception as e:\n", - " return f\"Unable to fetch company information for {symbol}: {str(e)}\"\n", - "\n", - "def assess_sharia(symbol):\n", - " \"\"\"\n", - " Assess Sharia compliance using AI analysis of company activities\n", - " \n", - " Args:\n", - " symbol (str): Stock ticker symbol\n", - " \n", - " Returns:\n", - " dict: Sharia ruling with confidence score and justification\n", - " \"\"\"\n", - " if not openai.api_key:\n", - " return {\n", - " \"ruling\": \"UNKNOWN\",\n", - " \"confidence\": 0,\n", - " \"justification\": \"OpenAI API key not configured\"\n", - " }\n", - " \n", - " try:\n", - " # Get company profile\n", - " company_profile = get_company_profile(symbol)\n", - " \n", - " # Create Sharia compliance prompt\n", - " prompt = f\"\"\"As an Islamic finance scholar, analyze the following company's business activities and determine if it is HALAL (permissible) or HARAM (forbidden) according to Islamic Sharia principles.\n", - "\n", - "Company: {symbol}\n", - "Business Description: {company_profile}\n", - "\n", - "Islamic Sharia Compliance Criteria:\n", - "- HARAM: Alcohol, gambling, adult entertainment, tobacco, conventional banking with interest (riba), insurance, pork products\n", - "- HARAM: Companies with >33% revenue from prohibited activities\n", - "- HARAM: Companies with excessive debt (debt-to-market cap >33%)\n", - "- HALAL: Technology, healthcare, retail (halal products), renewable energy, telecommunications\n", - "\n", - "Provide your assessment in the following format:\n", - "RULING: [HALAL/HARAM/DOUBTFUL]\n", - "CONFIDENCE: [0-100]\n", - "JUSTIFICATION: [Brief explanation of the ruling based on business activities]\n", - "\n", - "Be conservative in your assessment - when in doubt, classify as DOUBTFUL.\"\"\"\n", - "\n", - " # Call OpenAI API\n", - " response = openai.chat.completions.create(\n", - " model=\"gpt-4o-mini\",\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": \"You are an Islamic finance scholar specializing in Sharia compliance assessment for investments.\"},\n", - " {\"role\": \"user\", \"content\": prompt}\n", - " ],\n", - " max_tokens=300,\n", - " temperature=0.2\n", - " )\n", - " \n", - " response_text = response.choices[0].message.content.strip()\n", - " \n", - " # Parse the response\n", - " ruling = \"UNKNOWN\"\n", - " confidence = 0\n", - " justification = response_text\n", - " \n", - " # Extract ruling\n", - " if \"RULING:\" in response_text:\n", - " ruling_line = [line for line in response_text.split('\\n') if 'RULING:' in line][0]\n", - " ruling = ruling_line.split('RULING:')[1].strip()\n", - " \n", - " # Extract confidence\n", - " if \"CONFIDENCE:\" in response_text:\n", - " confidence_line = [line for line in response_text.split('\\n') if 'CONFIDENCE:' in line][0]\n", - " try:\n", - " confidence = int(''.join(filter(str.isdigit, confidence_line)))\n", - " except:\n", - " confidence = 50\n", - " \n", - " # Extract justification\n", - " if \"JUSTIFICATION:\" in response_text:\n", - " justification = response_text.split('JUSTIFICATION:')[1].strip()\n", - " \n", - " return {\n", - " \"ruling\": ruling,\n", - " \"confidence\": confidence,\n", - " \"justification\": justification\n", - " }\n", - " \n", - " except Exception as e:\n", - " return {\n", - " \"ruling\": \"ERROR\",\n", - " \"confidence\": 0,\n", - " \"justification\": f\"Error assessing Sharia compliance: {str(e)}\"\n", - " }\n", - "\n", - "# Test Sharia assessment\n", - "print(\"\\nā˜Ŗļø Testing Sharia compliance assessment...\")\n", - "test_sharia = assess_sharia(test_symbol)\n", - "print(f\"\\nSharia Assessment for {test_symbol}:\")\n", - "print(f\"Ruling: {test_sharia['ruling']}\")\n", - "print(f\"Confidence: {test_sharia['confidence']}%\")\n", - "print(f\"Justification: {test_sharia['justification']}\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 6. Charting Tool\n", - "\n", - "This function creates interactive price charts using Matplotlib for visualization in the Gradio interface.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "šŸ“Š Creating test chart...\n" - ] - }, - { - "data": { - "image/png": "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1ADwXiVqGHivEtWN7IJiXInNBAA4WBiimUnN60ndvz+lUmmlPaV4HxPVHd5fOjj7Xmk5OTmIioqCg4ODtkMhIiIiIiLSqnM306BSl9SP8rGvWXkTIiJdolM9pebOnYvhw4fD1dUV8fHx+PDDDyGTyTBx4kQAQGJiIhITE8WeU8HBwVAoFHBxcYGlpaU2QyciIiIiIqpTp6Luij/fL3JORNSQ6VRSKjY2FhMnTkRqaipsbGzQo0cPnD17FjY2NgCAb7/9VqNoea9evQAAGzZswNSpU7URMhERERERUb04FVmSlJJKAC97JqWIqOHTqaTU5s2bK12/cOFCLFy4sH6CISIiIiIi0hHJ2QW4npQDAGjrZAFjA5mWIyIienw6XVOKiIiIiIiIgNORD6aO7+FhpcVIiIhqD5NSREREREREOu7+0D0A6N7SWouREBHVHialiIiIiIiIdJggCGJSSq4nRUfXZlqOiIiodjApRUREREREpMNup+YhPrMAANDZzRKG+qwnRUSNA5NSREREREREOkxj6J4Hh+4RUePBpBQREREREZEO00xKscg5ETUeTEoRERERERHpKJVawJmbJTPvmRnqoXVzcy1HRERUe5iUIiIiIiIi0lGh8VnIyCsGAAS0tIZMKtFyREREtYdJKSIiIiIiIh11KopD94io8WJSioiIiIiISEexyDkRNWZMShEREREREemgQqUK/91OAwA4mBvC3dpEyxEREdUuJqWIiIiIiIh00KXoDBQUqwGU9JKSSFhPiogaFyaliIiIiIiIdJDm0D3WkyKixkdP2wEQERERERFRWaWLnAe01L16UhEREfV2Li8vr3o7FxHVH/aUIiIiIiIi0jFZBcW4EpMBAGhlawo7M0PtBkREVAeYlCIiIiIiItIx526mQS2U/MxZ94iosWJSioiIiIiISMdo1pNiUoqIGicmpYiIiIiIiHTM/aSUVAJ0bWGp5WiIiOoGk1JEREREREQ6JDmrADeScwAA7ZwtYGaor+WIiIjqBpNSREREREREOqT0rHvddXDWPSKi2sKkFBERERERkQ45FZkq/hzgYaXFSIiI6haTUkRERERERDpCEASxnpShvhQdXZppOSIiorrDpBQREREREZGOuHU3FwmZBQCAzm6WMNSXaTkiIqK6w6QUERERERGRjjgV9WDoXncP1pMiosaNSSkiIiIi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p59+WgkJCXr99dddnPzsKEoBAAAAAAC4seLiYm3YsEGDBg1ytFmtVg0aNEhr1qyp8jFr1qyptL8kDRky5Kz7m8HH7ACuZrfbJUlpaWkmJ6m9sw3Nqw/BwcFuncMZGQzDUHZ2toqLi2WxWM47g7Ny1FR1OeBeeF84l91u17Fjx1RcXCyrtXbfqfCaoCru8r5wlxx15U3nqrvkQDl3eT28JYc3fQZ2lxw4zVWviae/HqfqEllZWQoLC3O0+/v7y9/fv9K+R48eVVlZmaKioiq1R0VFaefOnVX2n56eXuX+6enpzojvFA2uKHX48GFJUp8+fUxOAgAAAAAAGrpu3bpV2p42bZqefPJJc8K4WIMrSsXHx+unn35SVFRUrb+9g3fJyclRly5dtH37doWGhpodB8BZcK4CnoFzFfAMnKuA+ex2u/bv368uXbrIx+d0eea3o6QkqVmzZrLZbI6BNqccPnxY0dHRVfYfHR19XvubocEVpXx8fHTRRReZHQNuJDs7W5IUExNTacgkAPfCuQp4Bs5VwDNwrgLuoXXr1jXaz8/PT71799bSpUt13XXXSSovai1dulT33ntvlY/p16+fli5dqsmTJzvalixZon79+tU1ttM0uKIUAAAAAACAp5kyZYrGjx+vCy+8UH369NGMGTOUl5enCRMmSJLGjRunmJgYPfvss5KkSZMm6bLLLtOLL76oa665RvPnz9f69ev19ttvm/k0KqEoBQAAAAAA4OZuvPFGHTlyRE888YTS09PVq1cvLV682LGY+f79+ystU5SYmKh58+bpscce01//+ld17NhRixYtOmMNKzNRlEKD5+/vr2nTplU5bxeA++BcBTwD5yrgGThXAc907733nnW63vLly89o++Mf/6g//vGP9Zyq9iyGYRhmhwAAAAAAAEDDwuXnAAAAAAAA4HIUpQAAAAAAAOByFKUAAAAAAADgchSl4DLPPvusLrroIoWGhioyMlLXXXedUlJSKu1TWFioe+65R02bNlVISIhuuOEGHT582HH/pk2bNGrUKLVq1UqBgYHq3LmzXnnllUp9LF++XBaL5Yyf9PT0avMZhqEnnnhCzZs3V2BgoAYNGqRffvnljP2++OILXXzxxQoMDFTjxo113XXXVdvv8uXLde2116p58+YKDg5Wr169NHfu3LPuP3/+fFkslnP2C9QXTz9Xz9avxWLRunXrqu17+fLlSkhIkL+/vzp06KDZs2dXun/FihUaNmyYWrRoIYvFokWLFlXbH1CfOFfPfq6WlZXp8ccfV2xsrAIDA9W+fXs9/fTTYilVmKGhnqtpaWkaPXq0LrjgAlmtVk2ePPmMfWbPnn1GnwEBAdXmBeBdKErBZb7//nvdc889+vHHH7VkyRKVlJRo8ODBysvLc+xz//3363//+58WLlyo77//Xr/++qtGjBjhuH/Dhg2KjIzUhx9+qG3btunRRx/V1KlT9frrr59xvJSUFKWlpTl+IiMjq833j3/8Q6+++qpmzpyptWvXKjg4WEOGDFFhYaFjn08++URjx47VhAkTtGnTJq1atUqjR4+utt/Vq1erR48e+uSTT7R582ZNmDBB48aN0+eff37Gvnv37tVf/vIXDRgwoNo+gfrk6edqYmJipf7S0tJ02223KTY2VhdeeOFZ+01NTdU111yjyy+/XMnJyZo8ebJuu+02ff3114598vLy1LNnT73xxhs1/v8J1BfO1bOfq88//7z++c9/6vXXX9eOHTv0/PPP6x//+Idee+21Gv//BZyloZ6rRUVFioiI0GOPPaaePXuedb+wsLBKfe/bt6/avAC8jAGYJCMjw5BkfP/994ZhGEZmZqbh6+trLFy40LHPjh07DEnGmjVrztrP3XffbVx++eWO7e+++86QZJw4caLGWex2uxEdHW383//9n6MtMzPT8Pf3Nz766CPDMAyjpKTEiImJMd59990a93s2V199tTFhwoRKbaWlpUZiYqLx7rvvGuPHjzeuvfbaOh8HcAZPO1d/q7i42IiIiDCeeuqpavt+6KGHjK5du1Zqu/HGG40hQ4ZUub8k49NPP61xdqC+ca6ePlevueYa409/+lOlfUaMGGGMGTOmxs8BqC8N5Vyt6LLLLjMmTZp0RvusWbOMRo0a1bgfAN6HkVIwTVZWliSpSZMmksq/ASopKdGgQYMc+3Tq1EmtW7fWmjVrqu3nVB8V9erVS82bN9fvfvc7rVq1qtosqampSk9Pr3TsRo0a6eKLL3YcOykpSYcOHZLValV8fLyaN2+uoUOHauvWrTV/0tVkfuqppxQZGalbb731vPsD6pOnnau/9d///lfHjh3ThAkTqu17zZo1lfqVpCFDhlT7nAB3wrl6ut/ExEQtXbpUP//8s6TyqU8rV67U0KFDq+0bcIWGcq7WVG5urtq0aaNWrVrp2muv1bZt25zSLwDP4GN2ADRMdrtdkydP1iWXXKJu3bpJktLT0+Xn56fw8PBK+0ZFRZ11Lvzq1au1YMECffHFF4625s2ba+bMmbrwwgtVVFSkd999VwMHDtTatWuVkJBQZT+n+o+Kijrrsffs2SNJevLJJ/XSSy+pbdu2evHFFzVw4ED9/PPPVX4oqMrHH3+sdevW6a233nK0rVy5Uu+9956Sk5Nr1AfgKp54rv7We++9pyFDhqhly5bVPtf09PQq+83OzlZBQYECAwOrfTxgJs7VyufqI488ouzsbHXq1Ek2m01lZWX6+9//rjFjxlTbN1DfGtK5WhNxcXF6//331aNHD2VlZemFF15QYmKitm3b5pT+Abg/ilIwxT333KOtW7dq5cqVte5j69atuvbaazVt2jQNHjzY0R4XF6e4uDjHdmJionbv3q2XX35Zc+bM0dy5czVx4kTH/V999ZVsNts5j2e32yVJjz76qG644QZJ0qxZs9SyZUstXLhQEydOVNeuXR3z4AcMGKCvvvqqUh/fffedJkyYoHfeeUddu3aVJOXk5Gjs2LF655131KxZs1r+3wDqhyeeqxUdPHhQX3/9tT7++ONK7SEhIY7bN998s2bOnHm+TwtwK5yrlX388ceaO3eu5s2bp65duzrWnmrRooXGjx9/XtkAZ+Jcraxfv37q169fpcydO3fWW2+9paeffvq8sgHwTBSl4HL33nuvPv/8c61YsaLSNyDR0dEqLi5WZmZmpW+KDh8+rOjo6Ep9bN++XVdeeaXuuOMOPfbYY+c8Zp8+fRy//IcPH66LL77YcV9MTIzS0tIcx2revHmlY/fq1UuSHO1dunRx3O/v76927dpp//79kqQvv/xSJSUlknTGqIrvv/9ew4YN08svv6xx48Y52nfv3q29e/dq2LBhjrZTBTAfHx+lpKSoffv253yOgLN56rla0axZs9S0aVMNHz68UnvFUYlhYWGO51XxSken+g0LC2OUFNwa5+qZ5+qDDz6oRx55RDfddJMkqXv37tq3b5+effZZilIwTUM7V2vD19dX8fHx2rVrV637AOBZKErBZQzD0H333adPP/1Uy5cvV2xsbKX7e/fuLV9fXy1dutQxEiklJUX79++v9A3Ktm3bdMUVV2j8+PH6+9//XqNjJycnO37RhoaGKjQ0tNL9sbGxio6O1tKlSx2/gLOzs7V27Vrdddddjnz+/v5KSUlR//79JUklJSXau3ev2rRpI0mO//7W8uXL9fvf/17PP/+87rjjjkr3derUSVu2bKnU9thjjyknJ0evvPKKWrVqVaPnCDiLp5+rFZ/HrFmzNG7cOPn6+la6r0OHDmccu1+/fvryyy8rtS1ZsqTScwLcCefqab89V/Pz82W1Vl461WazOb70AVypoZ6rtVFWVqYtW7bo6quvdkp/ADyAiYuso4G56667jEaNGhnLly830tLSHD/5+fmOfe68806jdevWxrJly4z169cb/fr1M/r16+e4f8uWLUZERIRx8803V+ojIyPDsc/LL79sLFq0yPjll1+MLVu2GJMmTTKsVqvx7bffVpvvueeeM8LDw43PPvvM2Lx5s3HttdcasbGxRkFBgWOfSZMmGTExMcbXX39t7Ny507j11luNyMhI4/jx42ftd9myZUZQUJAxderUSpmPHTt21sdw9T2YyRvOVcMwjG+//daQZOzYsaNGz3vPnj1GUFCQ8eCDDxo7duww3njjDcNmsxmLFy927JOTk2Ns3LjR2LhxoyHJeOmll4yNGzca+/btq9ExAGfiXD37uTp+/HgjJibG+Pzzz43U1FTjP//5j9GsWTPjoYceqtExAGdqqOeqYRiO35m9e/c2Ro8ebWzcuNHYtm2b4/7p06cbX3/9tbF7925jw4YNxk033WQEBARU2geAd6MoBZeRVOXPrFmzHPsUFBQYd999t9G4cWMjKCjIuP766420tDTH/dOmTauyjzZt2jj2ef7554327dsbAQEBRpMmTYyBAwcay5YtO2c+u91uPP7440ZUVJTh7+9vXHnllUZKSkqlfYqLi40HHnjAiIyMNEJDQ41BgwYZW7durbbf8ePHV5n5sssuq/YxFKVgFm84Vw3DMEaNGmUkJiae13P/7rvvjF69ehl+fn5Gu3btKj3nU/dX9bzGjx9/XscBnIFz9eznanZ2tjFp0iSjdevWRkBAgNGuXTvj0UcfNYqKis7rOIAzNORz9VyZJ0+ebLRu3drw8/MzoqKijKuvvtpISko6r2MA8GwWwzAMJwy4AgAAAAAAAGrMeu5dAAAAAAAAAOeiKAUAAAAAAACXoygFAAAAAAAAl6MoBQAAAAAAAJejKAUAAAAAAACXoygFAAAAAAAAl6MoBQAAAAAAAJejKAUAAAAAAACXoygFAAAAAAAAl6MoBQAAGpTZs2fLYrE4fgICAtSiRQsNGTJEr776qnJycmrV7+rVq/Xkk08qMzPTuYEBAAC8FEUpAADQID311FOaM2eO/vnPf+q+++6TJE2ePFndu3fX5s2bz7u/1atXa/r06RSlAAAAasjH7AAAAABmGDp0qC688ELH9tSpU7Vs2TL9/ve/1/Dhw7Vjxw4FBgaamBAAAMC7MVIKAADgpCuuuEKPP/649u3bpw8//FCStHnzZt1yyy1q166dAgICFB0drT/96U86duyY43FPPvmkHnzwQUlSbGysY2rg3r17Hft8+OGH6t27twIDA9WkSRPddNNNOnDggEufHwAAgDuhKAUAAFDB2LFjJUnffPONJGnJkiXas2ePJkyYoNdee0033XST5s+fr6uvvlqGYUiSRowYoVGjRkmSXn75Zc2ZM0dz5sxRRESEJOnvf/+7xo0bp44dO+qll17S5MmTtXTpUl166aVM9wMAAA0W0/cAAAAqaNmypRo1aqTdu3dLku6++2498MADlfbp27evRo0apZUrV2rAgAHq0aOHEhIS9NFHH+m6665T27ZtHfvu27dP06ZN09/+9jf99a9/dbSPGDFC8fHxevPNNyu1AwAANBSMlAIAAPiNkJAQx1X4Kq4rVVhYqKNHj6pv376SpKSkpHP29Z///Ed2u10jR47U0aNHHT/R0dHq2LGjvvvuu/p5EgAAAG6OkVIAAAC/kZubq8jISEnS8ePHNX36dM2fP18ZGRmV9svKyjpnX7/88osMw1DHjh2rvN/X17fugQEAADwQRSkAAIAKDh48qKysLHXo0EGSNHLkSK1evVoPPvigevXqpZCQENntdl111VWy2+3n7M9ut8tiseirr76SzWY74/6QkBCnPwcAAABPQFEKAACggjlz5kiShgwZohMnTmjp0qWaPn26nnjiCcc+v/zyyxmPs1gsVfbXvn17GYah2NhYXXDBBfUTGgAAwAOxphQAAMBJy5Yt09NPP63Y2FiNGTPGMbLp1FX2TpkxY8YZjw0ODpakM66mN2LECNlsNk2fPv2MfgzD0LFjx5z3BAAAADwII6UAAECD9NVXX2nnzp0qLS3V4cOHtWzZMi1ZskRt2rTRf//7XwUEBCggIECXXnqp/vGPf6ikpEQxMTH65ptvlJqaekZ/vXv3liQ9+uijuummm+Tr66thw4apffv2+tvf/qapU6dq7969uu666xQaGqrU1FR9+umnuuOOO/SXv/zF1U8fAADAdBSlAABAg3RqOp6fn5+aNGmi7t27a8aMGZowYYJCQ0Md+82bN0/33Xef3njjDRmGocGDB+urr75SixYtKvV30UUX6emnn9bMmTO1ePFi2e12paamKjg4WI888oguuOACvfzyy5o+fbokqVWrVho8eLCGDx/uuicNAADgRizGb8eRAwAAAAAAAPWMNaUAAAAAAADgchSlAAAAAAAA4HIUpQAAAAAAAOByFKUAAAAAAADgchSlAAAAAAAA4HIUpQAAAAAAAOByFKUAAAAAAADgchSlAAAAAAAA4HIUpQAAAAAAAOByFKUAAAAAAADgchSlAAAAAAAA4HIUpQAAAAAAAOByFKUAAAAAAADgcv8PRt05QdKqU10AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "def plot_price(df, symbol):\n", - " \"\"\"\n", - " Create a price chart using Matplotlib\n", - " \n", - " Args:\n", - " df (pandas.DataFrame): Historical stock data\n", - " symbol (str): Stock ticker symbol\n", - " \n", - " Returns:\n", - " matplotlib.figure.Figure: Price chart figure\n", - " \"\"\"\n", - " if df.empty:\n", - " # Create empty figure with error message\n", - " fig, ax = plt.subplots(figsize=(12, 6))\n", - " ax.text(0.5, 0.5, f'No data available for {symbol}', \n", - " horizontalalignment='center', verticalalignment='center',\n", - " transform=ax.transAxes, fontsize=16)\n", - " ax.set_title(f'Stock Price Chart - {symbol}')\n", - " return fig\n", - " \n", - " try:\n", - " # Create figure and axis\n", - " fig, ax = plt.subplots(figsize=(12, 6))\n", - " \n", - " # Plot closing price\n", - " ax.plot(df.index, df['Close'], linewidth=2, label='Close Price', color='#1f77b4')\n", - " \n", - " # Add volume as secondary axis\n", - " ax2 = ax.twinx()\n", - " ax2.bar(df.index, df['Volume'], alpha=0.3, color='gray', label='Volume')\n", - " \n", - " # Formatting\n", - " ax.set_title(f'Stock Price Chart - {symbol}', fontsize=16, fontweight='bold')\n", - " ax.set_xlabel('Date', fontsize=12)\n", - " ax.set_ylabel('Price ($)', fontsize=12)\n", - " ax2.set_ylabel('Volume', fontsize=12)\n", - " \n", - " # Add grid\n", - " ax.grid(True, alpha=0.3)\n", - " \n", - " # Format dates on x-axis\n", - " ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))\n", - " ax.xaxis.set_major_locator(mdates.WeekdayLocator(interval=1))\n", - " plt.xticks(rotation=45)\n", - " \n", - " # Add legends\n", - " ax.legend(loc='upper left')\n", - " ax2.legend(loc='upper right')\n", - " \n", - " # Add price statistics\n", - " current_price = df['Close'].iloc[-1]\n", - " price_change = df['Close'].iloc[-1] - df['Close'].iloc[0]\n", - " price_change_pct = (price_change / df['Close'].iloc[0]) * 100\n", - " \n", - " stats_text = f'Current: ${current_price:.2f} | Change: ${price_change:.2f} ({price_change_pct:+.2f}%)'\n", - " ax.text(0.02, 0.98, stats_text, transform=ax.transAxes, \n", - " bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8),\n", - " verticalalignment='top', fontsize=10)\n", - " \n", - " # Tight layout\n", - " plt.tight_layout()\n", - " \n", - " return fig\n", - " \n", - " except Exception as e:\n", - " # Create error figure\n", - " fig, ax = plt.subplots(figsize=(12, 6))\n", - " ax.text(0.5, 0.5, f'Error creating chart: {str(e)}', \n", - " horizontalalignment='center', verticalalignment='center',\n", - " transform=ax.transAxes, fontsize=16)\n", - " ax.set_title(f'Stock Price Chart - {symbol}')\n", - " return fig\n", - "\n", - "# Test the plotting function\n", - "if not test_data.empty:\n", - " print(\"\\nšŸ“Š Creating test chart...\")\n", - " test_fig = plot_price(test_data, test_symbol)\n", - " plt.show()\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 7. Gradio Chat Interface\n", - "\n", - "This section creates the main Gradio interface with a two-column layout for stock analysis and Sharia compliance assessment.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "šŸš€ Creating Gradio interface...\n", - "āœ… Interface created successfully!\n", - "🌐 Launch the interface by running: demo.launch()\n" - ] - } - ], - "source": [ - "def analyze_stock(symbol):\n", - " \"\"\"\n", - " Main analysis function that combines all tools\n", - " \n", - " Args:\n", - " symbol (str): Stock ticker symbol\n", - " \n", - " Returns:\n", - " tuple: (trade_advice, sharia_dict, price_chart)\n", - " \"\"\"\n", - " if not symbol or not symbol.strip():\n", - " return (\"Please enter a valid stock symbol.\", {}, None)\n", - " \n", - " symbol = symbol.strip().upper()\n", - " \n", - " try:\n", - " # Update status\n", - " status_message = f\"šŸ”„ Analyzing {symbol}...\"\n", - " print(status_message)\n", - " \n", - " # Fetch data for multiple periods\n", - " periods = [\"1mo\", \"1y\", \"5y\"]\n", - " summaries = {}\n", - " \n", - " for period in periods:\n", - " print(f\"šŸ“ˆ Fetching {period} data...\")\n", - " df = fetch_history(symbol, period, \"1d\")\n", - " if not df.empty:\n", - " summaries[period] = summarize(df)\n", - " else:\n", - " summaries[period] = {\"error\": f\"No data for {period}\"}\n", - " \n", - " # Get 1-month data for chart\n", - " df_1mo = fetch_history(symbol, \"1mo\", \"1d\")\n", - " \n", - " # Get trade advice\n", - " print(\"šŸ¤– Getting AI trade advice...\")\n", - " trade_advice = get_trade_advice(symbol, summaries)\n", - " \n", - " # Get Sharia assessment\n", - " print(\"ā˜Ŗļø Assessing Sharia compliance...\")\n", - " sharia_assessment = assess_sharia(symbol)\n", - " \n", - " # Create price chart\n", - " print(\"šŸ“Š Creating price chart...\")\n", - " price_chart = plot_price(df_1mo, symbol)\n", - " \n", - " print(f\"āœ… Analysis complete for {symbol}\")\n", - " \n", - " return (trade_advice, sharia_assessment, price_chart)\n", - " \n", - " except Exception as e:\n", - " error_msg = f\"āŒ Error analyzing {symbol}: {str(e)}\"\n", - " print(error_msg)\n", - " return (error_msg, {\"error\": str(e)}, None)\n", - "\n", - "# Create Gradio Interface\n", - "def create_interface():\n", - " \"\"\"Create and return the Gradio interface\"\"\"\n", - " \n", - " with gr.Blocks(title=\"Stock Analysis & Sharia Compliance\", theme=gr.themes.Soft()) as interface:\n", - " \n", - " # Header\n", - " gr.Markdown(\"\"\"\n", - " # šŸ“ˆ Stock Analysis & Sharia Compliance Tool\n", - " \n", - " **Get comprehensive stock analysis with AI-powered trade recommendations and Islamic Sharia compliance assessment.**\n", - " \n", - " *Enter a stock ticker (e.g., AAPL, MSFT, GOOGL) and click Analyze to get started.*\n", - " \"\"\")\n", - " \n", - " with gr.Row():\n", - " # Left Column - Inputs and Results\n", - " with gr.Column(scale=1):\n", - " gr.Markdown(\"### šŸ“Š Stock Analysis\")\n", - " \n", - " # Input section\n", - " with gr.Group():\n", - " ticker_input = gr.Textbox(\n", - " label=\"Stock Ticker Symbol\",\n", - " placeholder=\"Enter ticker (e.g., AAPL, MSFT, GOOGL)\",\n", - " value=\"AAPL\"\n", - " )\n", - " analyze_button = gr.Button(\"šŸ” Analyze Stock\", variant=\"primary\", size=\"lg\")\n", - " \n", - " # Trade advice output\n", - " with gr.Group():\n", - " gr.Markdown(\"### šŸ¤– AI Trade Recommendation\")\n", - " trade_advice_output = gr.Textbox(\n", - " label=\"Trade Advice\",\n", - " lines=8,\n", - " placeholder=\"AI trade recommendation will appear here...\"\n", - " )\n", - " \n", - " # Sharia compliance output\n", - " with gr.Group():\n", - " gr.Markdown(\"### ā˜Ŗļø Sharia Compliance Assessment\")\n", - " sharia_output = gr.JSON(\n", - " label=\"Sharia Ruling\",\n", - " value={\"ruling\": \"Not analyzed\", \"confidence\": 0, \"justification\": \"Click Analyze to assess\"}\n", - " )\n", - " \n", - " # Right Column - Chart\n", - " with gr.Column(scale=1):\n", - " gr.Markdown(\"### šŸ“ˆ Price Chart (1 Month)\")\n", - " chart_output = gr.Plot(\n", - " label=\"Stock Price Chart\",\n", - " value=None\n", - " )\n", - " \n", - " # Examples section\n", - " with gr.Row():\n", - " gr.Markdown(\"\"\"\n", - " ### šŸ’” Example Tickers to Try:\n", - " - **AAPL** - Apple Inc. (Technology)\n", - " - **MSFT** - Microsoft Corporation (Technology) \n", - " - **BRK-B** - Berkshire Hathaway (Conglomerate)\n", - " - **JNJ** - Johnson & Johnson (Healthcare)\n", - " - **BAC** - Bank of America (Banking - may be Haram)\n", - " - **KO** - Coca-Cola (Beverages)\n", - " \n", - " *Note: Add \".CA\" suffix for Canadian stocks (e.g., \"SHOP.TO\" for Toronto Stock Exchange)*\n", - " \"\"\")\n", - " \n", - " # Wire up the interface\n", - " analyze_button.click(\n", - " fn=analyze_stock,\n", - " inputs=[ticker_input],\n", - " outputs=[trade_advice_output, sharia_output, chart_output],\n", - " show_progress=True\n", - " )\n", - " \n", - " # Add example buttons\n", - " with gr.Row():\n", - " example_buttons = [\n", - " gr.Button(\"šŸ“± AAPL\", size=\"sm\"),\n", - " gr.Button(\"šŸ’» MSFT\", size=\"sm\"),\n", - " gr.Button(\"šŸ¦ BAC\", size=\"sm\"),\n", - " gr.Button(\"🄤 KO\", size=\"sm\")\n", - " ]\n", - " \n", - " # Wire example buttons\n", - " for button, ticker in zip(example_buttons, [\"AAPL\", \"MSFT\", \"BAC\", \"KO\"]):\n", - " button.click(\n", - " fn=lambda t=ticker: t,\n", - " outputs=[ticker_input]\n", - " )\n", - " \n", - " return interface\n", - "\n", - "# Create the interface\n", - "print(\"šŸš€ Creating Gradio interface...\")\n", - "demo = create_interface()\n", - "\n", - "print(\"āœ… Interface created successfully!\")\n", - "print(\"🌐 Launch the interface by running: demo.launch()\")\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 8. Launch the Interface\n", - "\n", - "Run the cell below to launch the Gradio interface. It will open in your browser and provide an interactive chat interface for stock analysis.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "šŸš€ Launching Stock Analysis & Sharia Compliance Interface...\n", - "šŸ“ Make sure you have set your OPENAI_API_KEY environment variable\n", - "🌐 The interface will open in your browser\n", - "* Running on local URL: http://0.0.0.0:7860\n", - "* Running on public URL: https://ebf42ba14d2f6c267b.gradio.live\n", - "\n", - "This share link expires in 1 week. For free permanent hosting and GPU upgrades, run `gradio deploy` from the terminal in the working directory to deploy to Hugging Face Spaces (https://huggingface.co/spaces)\n" - ] - }, - { - "data": { - "text/html": [ - "
" - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Launch the Gradio interface\n", - "if __name__ == \"__main__\":\n", - " print(\"šŸš€ Launching Stock Analysis & Sharia Compliance Interface...\")\n", - " print(\"šŸ“ Make sure you have set your OPENAI_API_KEY environment variable\")\n", - " print(\"🌐 The interface will open in your browser\")\n", - " \n", - " # Launch with sharing enabled for easy access\n", - " demo.launch(\n", - " share=True, # Creates a public link for sharing\n", - " server_name=\"0.0.0.0\", # Allow external access\n", - " show_error=True, # Show detailed error messages\n", - " quiet=False # Show startup logs\n", - " )\n" - ] - }, - { - "cell_type": "raw", - "metadata": { - "vscode": { - "languageId": "raw" - } - }, - "source": [ - "## 9. Usage Instructions & Requirements\n", - "\n", - "### šŸ“‹ Prerequisites\n", - "\n", - "Before running this notebook, make sure you have the following installed:\n", - "\n", - "```bash\n", - "pip install yfinance openai pandas matplotlib gradio requests beautifulsoup4 numpy\n", - "```\n", - "\n", - "### šŸ”‘ API Key Setup\n", - "\n", - "Set your OpenAI API key as an environment variable:\n", - "\n", - "```bash\n", - "export OPENAI_API_KEY=\"your-api-key-here\"\n", - "```\n", - "\n", - "Or in Python:\n", - "```python\n", - "import os\n", - "os.environ[\"OPENAI_API_KEY\"] = \"your-api-key-here\"\n", - "```\n", - "\n", - "### šŸš€ How to Use\n", - "\n", - "1. **Run all cells** in this notebook to initialize all functions\n", - "2. **Launch the interface** by running the launch cell\n", - "3. **Enter a stock ticker** (e.g., AAPL, MSFT, GOOGL)\n", - "4. **Click \"Analyze Stock\"** to get:\n", - " - AI-powered trade recommendations (BUY/HOLD/SELL)\n", - " - Sharia compliance assessment\n", - " - Interactive price chart\n", - "\n", - "### šŸ“Š Features\n", - "\n", - "- **Multi-period Analysis**: 1 month, 1 year, and 5 year data analysis\n", - "- **AI Trade Advice**: GPT-4o-mini powered recommendations with numerical justification\n", - "- **Sharia Compliance**: Islamic finance assessment with confidence scores\n", - "- **Interactive Charts**: Real-time price charts with volume data\n", - "- **Example Tickers**: Quick-access buttons for popular stocks\n", - "\n", - "### āš ļø Disclaimers\n", - "\n", - "- **Not Financial Advice**: This tool is for educational purposes only\n", - "- **Sharia Assessments**: Consult qualified Islamic scholars for authoritative rulings\n", - "- **Data Accuracy**: Stock data depends on yfinance API availability\n", - "- **API Costs**: OpenAI API calls will consume your credits\n", - "\n", - "### šŸ› ļø Troubleshooting\n", - "\n", - "- **No data found**: Check if the ticker symbol is correct\n", - "- **API errors**: Verify your OpenAI API key is set correctly\n", - "- **Chart issues**: Ensure matplotlib backend supports interactive plotting\n", - "- **Slow performance**: API calls may take 10-30 seconds depending on network\n", - "\n", - "Enjoy analyzing stocks with AI-powered insights and Sharia compliance! šŸš€šŸ“ˆā˜Ŗļø\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.18" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -}