{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# šŸ“ˆ DefeatBeta-API vs Yahoo Finance: Interactive Comparison\n", "\n", "Welcome to this interactive notebook where we'll explore the **DefeatBeta-API** - an open-source alternative to Yahoo Finance's market data APIs with higher reliability.\n", "\n", "## šŸŽÆ What You'll Learn\n", "\n", "- How to use DefeatBeta-API for financial data analysis\n", "- Compare data structures and methods with Yahoo Finance\n", "- Explore unique features like earnings transcripts and DCF valuation\n", "- Test practical trading analysis scenarios\n", "\n", "## šŸ“¦ Setup" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "[nltk_data] Error loading punkt_tab: \n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\u001b[38;5;10m______ __ _ ______ _ \n", "| _ \\ / _| | | | ___ \\ | | \n", "| | | |___| |_ ___ __ _| |_ | |_/ / ___| |_ __ _ \n", "| | | / _ \\ _/ _ \\/ _` | __| | ___ \\/ _ \\ __/ _` |\n", "| |/ / __/ || __/ (_| | |_ | |_/ / __/ || (_| |\n", "|___/ \\___|_| \\___|\\__,_|\\__| \\____/ \\___|\\__\\__,_|\u001b[0m\n", "\u001b[1;38;5;10mšŸ“ˆ:: Data Update Time ::\u001b[0m\t2026-04-17 \u001b[1;38;5;10m::\u001b[0m\n", "\u001b[1;38;5;10mšŸ“ˆ:: Software Version ::\u001b[0m\t0.0.45 \u001b[1;38;5;10m::\u001b[0m\n", "[persistent_cache] cache → /home/df/.cache/defeatbeta\n", "āœ… yfinance is installed\n", "āœ… DefeatBeta-API imported successfully\n", "Python version: 3.12.12\n" ] } ], "source": [ "# Import required libraries\n", "import pandas as pd\n", "import numpy as np\n", "import time\n", "import sys\n", "\n", "# DefeatBeta-API\n", "from defeatbeta_api.data.ticker import Ticker\n", "from persistent_cache import enable_persistent_cache\n", "enable_persistent_cache()\n", "\n", "# Yahoo Finance (for comparison)\n", "try:\n", " import yfinance as yf\n", " YFINANCE_AVAILABLE = True\n", " print(\"āœ… yfinance is installed\")\n", "except ImportError:\n", " YFINANCE_AVAILABLE = False\n", " print(\"āš ļø yfinance not installed - install with: uv add yfinance\")\n", "\n", "print(\"āœ… DefeatBeta-API imported successfully\")\n", "print(f\"Python version: {sys.version.split()[0]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸƒā€ā™€ļø 1. QUICK PERFORMANCE TEST" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "PERFORMANCE COMPARISON: Fetching Price Data\n", "============================================================\n", "\n", "āœ… DefeatBeta: 0.019s\n", " Data shape: (7897, 7)\n", "\n", "āœ… Yahoo Finance: 0.276s\n", " Data shape: (11433, 7)\n" ] } ], "source": [ "# Test query speed for both APIs\n", "symbol = 'AAPL'\n", "\n", "print(\"=\" * 60)\n", "print(\"PERFORMANCE COMPARISON: Fetching Price Data\")\n", "print(\"=\" * 60)\n", "\n", "# DefeatBeta\n", "start = time.time()\n", "db_ticker = Ticker(symbol)\n", "db_price = db_ticker.price()\n", "db_time = time.time() - start\n", "print(f\"\\nāœ… DefeatBeta: {db_time:.3f}s\")\n", "print(f\" Data shape: {db_price.shape}\")\n", "\n", "# Yahoo Finance\n", "if YFINANCE_AVAILABLE:\n", " start = time.time()\n", " yf_ticker = yf.Ticker(symbol)\n", " yf_price = yf_ticker.history(period='max')\n", " yf_time = time.time() - start\n", " print(f\"\\nāœ… Yahoo Finance: {yf_time:.3f}s\")\n", " print(f\" Data shape: {yf_price.shape}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ“Š 2. PRICE DATA COMPARISON" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "PRICE DATA STRUCTURE COMPARISON\n", "============================================================\n", "\n", "šŸ“Œ DEFEATBETA API:\n", " Type: DataFrame\n", " Columns: ['symbol', 'report_date', 'open', 'close', 'high', 'low', 'volume']\n", "\n", " Latest 3 rows:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_dateopenclosehighlowvolume
7887AAPL2026-04-06256.51258.86262.16256.4629329900
7888AAPL2026-04-07256.16253.50256.20245.7062148000
7889AAPL2026-04-08258.45258.90259.75256.5341032800
7890AAPL2026-04-09259.00260.49261.12256.0728121600
7891AAPL2026-04-10259.98260.48262.19259.0231291500
7892AAPL2026-04-13259.73259.20260.18256.6636234700
7893AAPL2026-04-14259.25258.83261.93257.1948370700
7894AAPL2026-04-15258.16266.43266.56257.8149913500
7895AAPL2026-04-16266.80263.40267.16261.2743323100
7896AAPL2026-04-17266.96270.23272.30266.7261314800
\n", "
" ], "text/plain": [ " symbol report_date open close high low volume\n", "7887 AAPL 2026-04-06 256.51 258.86 262.16 256.46 29329900\n", "7888 AAPL 2026-04-07 256.16 253.50 256.20 245.70 62148000\n", "7889 AAPL 2026-04-08 258.45 258.90 259.75 256.53 41032800\n", "7890 AAPL 2026-04-09 259.00 260.49 261.12 256.07 28121600\n", "7891 AAPL 2026-04-10 259.98 260.48 262.19 259.02 31291500\n", "7892 AAPL 2026-04-13 259.73 259.20 260.18 256.66 36234700\n", "7893 AAPL 2026-04-14 259.25 258.83 261.93 257.19 48370700\n", "7894 AAPL 2026-04-15 258.16 266.43 266.56 257.81 49913500\n", "7895 AAPL 2026-04-16 266.80 263.40 267.16 261.27 43323100\n", "7896 AAPL 2026-04-17 266.96 270.23 272.30 266.72 61314800" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ YAHOO FINANCE:\n", " Type: DataFrame\n", " Columns: ['Open', 'High', 'Low', 'Close', 'Volume', 'Dividends', 'Stock Splits']\n", "\n", " Latest 3 rows:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
OpenHighLowCloseVolumeDividendsStock Splits
Date
2026-04-13 00:00:00-04:00259.730011260.179993256.660004259.200012362347000.00.0
2026-04-14 00:00:00-04:00259.250000261.929993257.190002258.829987483707000.00.0
2026-04-15 00:00:00-04:00258.160004266.559998257.809998266.429993499135000.00.0
2026-04-16 00:00:00-04:00266.799988267.160004261.269989263.399994433231000.00.0
2026-04-17 00:00:00-04:00266.959991272.299988266.720001270.230011614362000.00.0
2026-04-20 00:00:00-04:00270.329987274.279999270.290009273.049988365902000.00.0
2026-04-21 00:00:00-04:00271.500000272.799988265.399994266.170013502098000.00.0
2026-04-22 00:00:00-04:00267.820007273.739990266.869995273.170013432492000.00.0
2026-04-23 00:00:00-04:00275.049988275.769989271.649994273.429993333996000.00.0
2026-04-24 00:00:00-04:00272.760010273.059998269.649994271.059998381245000.00.0
\n", "
" ], "text/plain": [ " Open High Low Close \\\n", "Date \n", "2026-04-13 00:00:00-04:00 259.730011 260.179993 256.660004 259.200012 \n", "2026-04-14 00:00:00-04:00 259.250000 261.929993 257.190002 258.829987 \n", "2026-04-15 00:00:00-04:00 258.160004 266.559998 257.809998 266.429993 \n", "2026-04-16 00:00:00-04:00 266.799988 267.160004 261.269989 263.399994 \n", "2026-04-17 00:00:00-04:00 266.959991 272.299988 266.720001 270.230011 \n", "2026-04-20 00:00:00-04:00 270.329987 274.279999 270.290009 273.049988 \n", "2026-04-21 00:00:00-04:00 271.500000 272.799988 265.399994 266.170013 \n", "2026-04-22 00:00:00-04:00 267.820007 273.739990 266.869995 273.170013 \n", "2026-04-23 00:00:00-04:00 275.049988 275.769989 271.649994 273.429993 \n", "2026-04-24 00:00:00-04:00 272.760010 273.059998 269.649994 271.059998 \n", "\n", " Volume Dividends Stock Splits \n", "Date \n", "2026-04-13 00:00:00-04:00 36234700 0.0 0.0 \n", "2026-04-14 00:00:00-04:00 48370700 0.0 0.0 \n", "2026-04-15 00:00:00-04:00 49913500 0.0 0.0 \n", "2026-04-16 00:00:00-04:00 43323100 0.0 0.0 \n", "2026-04-17 00:00:00-04:00 61436200 0.0 0.0 \n", "2026-04-20 00:00:00-04:00 36590200 0.0 0.0 \n", "2026-04-21 00:00:00-04:00 50209800 0.0 0.0 \n", "2026-04-22 00:00:00-04:00 43249200 0.0 0.0 \n", "2026-04-23 00:00:00-04:00 33399600 0.0 0.0 \n", "2026-04-24 00:00:00-04:00 38124500 0.0 0.0 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Compare price data structures\n", "print(\"=\" * 60)\n", "print(\"PRICE DATA STRUCTURE COMPARISON\")\n", "print(\"=\" * 60)\n", "\n", "print(\"\\nšŸ“Œ DEFEATBETA API:\")\n", "print(f\" Type: {type(db_price).__name__}\")\n", "print(f\" Columns: {list(db_price.columns)}\")\n", "print(f\"\\n Latest 3 rows:\")\n", "display(db_price.tail(10))\n", "\n", "if YFINANCE_AVAILABLE:\n", " print(\"\\nšŸ“Œ YAHOO FINANCE:\")\n", " print(f\" Type: {type(yf_price).__name__}\")\n", " print(f\" Columns: {list(yf_price.columns)}\")\n", " print(f\"\\n Latest 3 rows:\")\n", " display(yf_price.tail(10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ’° 3. VALUATION METRICS" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "VALUATION METRICS (with historical data!)\n", "============================================================\n", "\n", "šŸ“Œ TTM EPS History:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_datetailing_epsepsupdate_time
104NVDA2025-01-312.940.892026-04-18
105NVDA2025-04-303.100.762026-04-18
106NVDA2025-07-313.511.082026-04-18
107NVDA2025-10-314.041.302026-04-18
108NVDA2026-01-314.901.762026-04-18
\n", "
" ], "text/plain": [ " symbol report_date tailing_eps eps update_time\n", "104 NVDA 2025-01-31 2.94 0.89 2026-04-18\n", "105 NVDA 2025-04-30 3.10 0.76 2026-04-18\n", "106 NVDA 2025-07-31 3.51 1.08 2026-04-18\n", "107 NVDA 2025-10-31 4.04 1.30 2026-04-18\n", "108 NVDA 2026-01-31 4.90 1.76 2026-04-18" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ TTM P/E Ratio History:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_dateeps_report_dateclose_pricettm_epsttm_pe
6846NVDA2026-04-132026-01-31189.314.938.63
6847NVDA2026-04-142026-01-31196.514.940.10
6848NVDA2026-04-152026-01-31198.874.940.59
6849NVDA2026-04-162026-01-31198.354.940.48
6850NVDA2026-04-172026-01-31201.684.941.16
\n", "
" ], "text/plain": [ " symbol report_date eps_report_date close_price ttm_eps ttm_pe\n", "6846 NVDA 2026-04-13 2026-01-31 189.31 4.9 38.63\n", "6847 NVDA 2026-04-14 2026-01-31 196.51 4.9 40.10\n", "6848 NVDA 2026-04-15 2026-01-31 198.87 4.9 40.59\n", "6849 NVDA 2026-04-16 2026-01-31 198.35 4.9 40.48\n", "6850 NVDA 2026-04-17 2026-01-31 201.68 4.9 41.16" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ Market Capitalization History:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
report_dateclose_priceshares_outstandingmarket_capitalization
68462026-04-13189.312.430000e+104.600233e+12
68472026-04-14196.512.430000e+104.775193e+12
68482026-04-15198.872.430000e+104.832541e+12
68492026-04-16198.352.430000e+104.819905e+12
68502026-04-17201.682.430000e+104.900824e+12
\n", "
" ], "text/plain": [ " report_date close_price shares_outstanding market_capitalization\n", "6846 2026-04-13 189.31 2.430000e+10 4.600233e+12\n", "6847 2026-04-14 196.51 2.430000e+10 4.775193e+12\n", "6848 2026-04-15 198.87 2.430000e+10 4.832541e+12\n", "6849 2026-04-16 198.35 2.430000e+10 4.819905e+12\n", "6850 2026-04-17 201.68 2.430000e+10 4.900824e+12" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Explore valuation metrics - DefeatBeta provides HISTORICAL data\n", "symbol = 'NVDA' # NVIDIA for interesting metrics\n", "db_ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"VALUATION METRICS (with historical data!)\")\n", "print(\"=\" * 60)\n", "\n", "print(\"\\nšŸ“Œ TTM EPS History:\")\n", "ttm_eps = db_ticker.ttm_eps()\n", "display(ttm_eps.tail(5))\n", "\n", "print(\"\\nšŸ“Œ TTM P/E Ratio History:\")\n", "ttm_pe = db_ticker.ttm_pe()\n", "display(ttm_pe.tail(5))\n", "\n", "print(\"\\nšŸ“Œ Market Capitalization History:\")\n", "market_cap = db_ticker.market_capitalization()\n", "display(market_cap[['report_date', 'close_price', 'shares_outstanding', 'market_capitalization']].tail(5))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "============================================================\n", "YAHOO FINANCE: Current Valuation (from .info)\n", "============================================================\n", " trailingPE: 42.591003\n", " forwardPE: 18.530712\n", " marketCap: 5062002737152\n", " trailingEps: 4.89\n", " forwardEps: 11.23918\n" ] } ], "source": [ "# Compare with Yahoo Finance current values\n", "if YFINANCE_AVAILABLE:\n", " print(\"\\n\" + \"=\" * 60)\n", " print(\"YAHOO FINANCE: Current Valuation (from .info)\")\n", " print(\"=\" * 60)\n", " \n", " yf_ticker = yf.Ticker(symbol)\n", " info = yf_ticker.info\n", " \n", " valuation_keys = ['trailingPE', 'forwardPE', 'marketCap', 'trailingEps', 'forwardEps']\n", " for key in valuation_keys:\n", " if key in info:\n", " print(f\" {key}: {info[key]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ“‰ 4. FINANCIAL STATEMENTS" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "QUARTERLY INCOME STATEMENT\n", "============================================================\n", "\n", "šŸ“Œ Type: Statement\n", " Methods: .df(), .data(), .print_pretty_table()\n", "\n", "šŸ“Œ DataFrame Shape: (47, 17)\n", " Columns: TTM + 16 quarters\n", "\n", "šŸ“Œ KEY METRICS (TTM values):\n", " Total Revenue: $281.72B\n", " Gross Profit: $193.89B\n", " Operating Income: $128.53B\n", " Net Income Common Stockholders: $101.83B\n", " Diluted EPS: $10.32\n" ] } ], "source": [ "# Explore quarterly income statement\n", "symbol = 'MSFT'\n", "db_ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"QUARTERLY INCOME STATEMENT\")\n", "print(\"=\" * 60)\n", "\n", "# Get the Statement object\n", "income_stmt = db_ticker.quarterly_income_statement()\n", "print(f\"\\nšŸ“Œ Type: {type(income_stmt).__name__}\")\n", "print(f\" Methods: .df(), .data(), .print_pretty_table()\")\n", "\n", "# Get as DataFrame\n", "stmt_df = income_stmt.df()\n", "print(f\"\\nšŸ“Œ DataFrame Shape: {stmt_df.shape}\")\n", "print(f\" Columns: TTM + 16 quarters\")\n", "\n", "# Show key metrics\n", "key_metrics = [\n", " 'Total Revenue',\n", " 'Gross Profit',\n", " 'Operating Income',\n", " 'Net Income Common Stockholders',\n", " 'Diluted EPS'\n", "]\n", "\n", "print(\"\\nšŸ“Œ KEY METRICS (TTM values):\")\n", "for metric in key_metrics:\n", " if metric in stmt_df['Breakdown'].values:\n", " row = stmt_df[stmt_df['Breakdown'] == metric].iloc[0]\n", " value = float(row['TTM']) # Convert Decimal to float\n", " if abs(value) >= 1e9:\n", " print(f\" {metric}: ${value/1e9:.2f}B\")\n", " elif abs(value) >= 1e6:\n", " print(f\" {metric}: ${value/1e6:.2f}M\")\n", " else:\n", " print(f\" {metric}: ${value:.2f}\")\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ FORMATTED TABLE (first 10 line items):\n", "------------------------------------------------------------\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MetricTTM Value
0Total Revenue281724000000.0
1Operating Revenue281724000000.0
2Cost of Revenue87831000000.0
3Gross Profit193893000000.0
4Operating Expense65365000000.0
5Selling General and Administrative32877000000.0
6General & Administrative Expense7223000000.0
7Other G and A7223000000.0
8Selling & Marketing Expense25654000000.0
9Research & Development32488000000.0
\n", "
" ], "text/plain": [ " Metric TTM Value\n", "0 Total Revenue 281724000000.0\n", "1 Operating Revenue 281724000000.0\n", "2 Cost of Revenue 87831000000.0\n", "3 Gross Profit 193893000000.0\n", "4 Operating Expense 65365000000.0\n", "5 Selling General and Administrative 32877000000.0\n", "6 General & Administrative Expense 7223000000.0\n", "7 Other G and A 7223000000.0\n", "8 Selling & Marketing Expense 25654000000.0\n", "9 Research & Development 32488000000.0" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Try the pretty print version\n", "print(\"\\nšŸ“Œ FORMATTED TABLE (first 10 line items):\")\n", "print(\"-\" * 60)\n", "# Note: print_pretty_table() might be very wide, so let's show a subset\n", "subset = stmt_df.head(10)[['Breakdown', 'TTM']]\n", "subset.columns = ['Metric', 'TTM Value']\n", "display(subset)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ“ˆ 5. FINANCIAL RATIOS" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "FINANCIAL RATIOS (Historical Time Series)\n", "============================================================\n", "\n", "šŸ“Œ RETURN ON EQUITY (ROE):\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_datenet_income_common_stockholdersbeginning_stockholders_equityending_stockholders_equityavg_equityroe
0TSLA2023-09-301.851000e+095.113000e+105.346600e+105.229800e+100.0354
1TSLA2023-12-317.927000e+095.346600e+106.263400e+105.805000e+100.1366
2TSLA2024-03-311.432000e+096.263400e+106.437800e+106.350600e+100.0225
3TSLA2024-06-301.400000e+096.437800e+106.646800e+106.542300e+100.0214
4TSLA2024-09-302.173000e+096.646800e+106.993100e+106.819950e+100.0319
5TSLA2024-12-312.314000e+096.993100e+107.291300e+107.142200e+100.0324
6TSLA2025-03-314.090000e+087.291300e+107.465300e+107.378300e+100.0055
7TSLA2025-06-301.172000e+097.465300e+107.731400e+107.598350e+100.0154
8TSLA2025-09-301.373000e+097.731400e+107.997000e+107.864200e+100.0175
9TSLA2025-12-318.400000e+087.997000e+108.213700e+108.105350e+100.0104
\n", "
" ], "text/plain": [ " symbol report_date net_income_common_stockholders \\\n", "0 TSLA 2023-09-30 1.851000e+09 \n", "1 TSLA 2023-12-31 7.927000e+09 \n", "2 TSLA 2024-03-31 1.432000e+09 \n", "3 TSLA 2024-06-30 1.400000e+09 \n", "4 TSLA 2024-09-30 2.173000e+09 \n", "5 TSLA 2024-12-31 2.314000e+09 \n", "6 TSLA 2025-03-31 4.090000e+08 \n", "7 TSLA 2025-06-30 1.172000e+09 \n", "8 TSLA 2025-09-30 1.373000e+09 \n", "9 TSLA 2025-12-31 8.400000e+08 \n", "\n", " beginning_stockholders_equity ending_stockholders_equity avg_equity \\\n", "0 5.113000e+10 5.346600e+10 5.229800e+10 \n", "1 5.346600e+10 6.263400e+10 5.805000e+10 \n", "2 6.263400e+10 6.437800e+10 6.350600e+10 \n", "3 6.437800e+10 6.646800e+10 6.542300e+10 \n", "4 6.646800e+10 6.993100e+10 6.819950e+10 \n", "5 6.993100e+10 7.291300e+10 7.142200e+10 \n", "6 7.291300e+10 7.465300e+10 7.378300e+10 \n", "7 7.465300e+10 7.731400e+10 7.598350e+10 \n", "8 7.731400e+10 7.997000e+10 7.864200e+10 \n", "9 7.997000e+10 8.213700e+10 8.105350e+10 \n", "\n", " roe \n", "0 0.0354 \n", "1 0.1366 \n", "2 0.0225 \n", "3 0.0214 \n", "4 0.0319 \n", "5 0.0324 \n", "6 0.0055 \n", "7 0.0154 \n", "8 0.0175 \n", "9 0.0104 " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ RETURN ON INVESTED CAPITAL (ROIC):\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_dateebittax_rate_for_calcsnopatbeginning_invested_capitalending_invested_capitalavg_invested_capitalroic
0TSLA2022-09-30NaNNaNNaN3.952800e+10NaNNaNNaN
1TSLA2023-09-302.083000e+090.081.916360e+095.264900e+105.717000e+105.490950e+100.0349
2TSLA2023-12-312.252000e+090.211.779080e+095.717000e+106.729100e+106.223050e+100.0286
3TSLA2024-03-311.964000e+090.261.453360e+096.729100e+106.925200e+106.827150e+100.0213
4TSLA2024-06-301.873000e+090.211.479670e+096.925200e+107.383000e+107.154100e+100.0207
5TSLA2024-09-302.883000e+090.222.248740e+097.383000e+107.732100e+107.557550e+100.0298
6TSLA2024-12-312.862000e+090.162.404080e+097.732100e+108.079100e+107.905600e+100.0304
7TSLA2025-03-316.800000e+080.294.828000e+088.079100e+108.189700e+108.134400e+100.0059
8TSLA2025-06-301.635000e+090.231.258950e+098.189700e+108.427000e+108.308350e+100.0152
9TSLA2025-09-302.035000e+090.291.444850e+098.427000e+108.743100e+108.585050e+100.0168
10TSLA2025-12-311.266000e+090.289.115200e+088.743100e+109.029000e+108.886050e+100.0103
\n", "
" ], "text/plain": [ " symbol report_date ebit tax_rate_for_calcs nopat \\\n", "0 TSLA 2022-09-30 NaN NaN NaN \n", "1 TSLA 2023-09-30 2.083000e+09 0.08 1.916360e+09 \n", "2 TSLA 2023-12-31 2.252000e+09 0.21 1.779080e+09 \n", "3 TSLA 2024-03-31 1.964000e+09 0.26 1.453360e+09 \n", "4 TSLA 2024-06-30 1.873000e+09 0.21 1.479670e+09 \n", "5 TSLA 2024-09-30 2.883000e+09 0.22 2.248740e+09 \n", "6 TSLA 2024-12-31 2.862000e+09 0.16 2.404080e+09 \n", "7 TSLA 2025-03-31 6.800000e+08 0.29 4.828000e+08 \n", "8 TSLA 2025-06-30 1.635000e+09 0.23 1.258950e+09 \n", "9 TSLA 2025-09-30 2.035000e+09 0.29 1.444850e+09 \n", "10 TSLA 2025-12-31 1.266000e+09 0.28 9.115200e+08 \n", "\n", " beginning_invested_capital ending_invested_capital avg_invested_capital \\\n", "0 3.952800e+10 NaN NaN \n", "1 5.264900e+10 5.717000e+10 5.490950e+10 \n", "2 5.717000e+10 6.729100e+10 6.223050e+10 \n", "3 6.729100e+10 6.925200e+10 6.827150e+10 \n", "4 6.925200e+10 7.383000e+10 7.154100e+10 \n", "5 7.383000e+10 7.732100e+10 7.557550e+10 \n", "6 7.732100e+10 8.079100e+10 7.905600e+10 \n", "7 8.079100e+10 8.189700e+10 8.134400e+10 \n", "8 8.189700e+10 8.427000e+10 8.308350e+10 \n", "9 8.427000e+10 8.743100e+10 8.585050e+10 \n", "10 8.743100e+10 9.029000e+10 8.886050e+10 \n", "\n", " roic \n", "0 NaN \n", "1 0.0349 \n", "2 0.0286 \n", "3 0.0213 \n", "4 0.0207 \n", "5 0.0298 \n", "6 0.0304 \n", "7 0.0059 \n", "8 0.0152 \n", "9 0.0168 \n", "10 0.0103 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Explore financial ratios with historical data\n", "symbol = 'TSLA' # Tesla for interesting ratios\n", "db_ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"FINANCIAL RATIOS (Historical Time Series)\")\n", "print(\"=\" * 60)\n", "\n", "print(\"\\nšŸ“Œ RETURN ON EQUITY (ROE):\")\n", "roe = db_ticker.roe()\n", "display(roe)\n", "\n", "print(\"\\nšŸ“Œ RETURN ON INVESTED CAPITAL (ROIC):\")\n", "roic = db_ticker.roic()\n", "display(roic)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ WEIGHTED AVERAGE COST OF CAPITAL (WACC):\n", " Columns: ['symbol', 'report_date', 'market_capitalization', 'exchange_rate', 'total_debt', 'total_debt_usd', 'interest_expense', 'interest_expense_usd', 'pretax_income', 'pretax_income_usd', 'tax_provision', 'tax_provision_usd', 'tax_rate_for_calcs', 'sp500_cagr_end', 'sp500_10y_cagr', 'treasure_10y_yield', 'beta_5y', 'weight_of_debt', 'weight_of_equity', 'cost_of_debt', 'cost_of_equity', 'wacc']\n", "\n", " Latest calculation components:\n", " Market Cap: $3967.28B\n", " Beta (5Y): 1.0636\n", " S&P 500 10Y CAGR: 12.87%\n", " Treasury 10Y Yield: 4.26%\n", " Weight of Debt: 0.0272\n", " Weight of Equity: 0.9728\n", " Cost of Debt: 0.0090\n", " Cost of Equity: 0.1342\n", "\n", " ⭐ WACC: 0.1308 (13.08%\n" ] } ], "source": [ "# WACC - Weighted Average Cost of Capital\n", "print(\"\\nšŸ“Œ WEIGHTED AVERAGE COST OF CAPITAL (WACC):\")\n", "wacc = db_ticker.wacc()\n", "print(f\" Columns: {list(wacc.columns)}\")\n", "print(f\"\\n Latest calculation components:\")\n", "latest_wacc = wacc.iloc[-1]\n", "print(f\" Market Cap: ${float(latest_wacc['market_capitalization'])/1e9:.2f}B\")\n", "print(f\" Beta (5Y): {float(latest_wacc['beta_5y']):.4f}\")\n", "print(f\" S&P 500 10Y CAGR: {float(latest_wacc['sp500_10y_cagr']):.2%}\")\n", "print(f\" Treasury 10Y Yield: {float(latest_wacc['treasure_10y_yield']):.2%}\")\n", "print(f\" Weight of Debt: {float(latest_wacc['weight_of_debt']):.4f}\")\n", "print(f\" Weight of Equity: {float(latest_wacc['weight_of_equity']):.4f}\")\n", "print(f\" Cost of Debt: {float(latest_wacc['cost_of_debt']):.4f}\")\n", "print(f\" Cost of Equity: {float(latest_wacc['cost_of_equity']):.4f}\")\n", "print(f\"\\n ⭐ WACC: {float(latest_wacc['wacc']):.4f} ({float(latest_wacc['wacc']):.2%}\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ“Š 6. GROWTH & MARGIN METRICS" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "GROWTH & MARGIN METRICS\n", "============================================================\n", "\n", "šŸ“Œ QUARTERLY REVENUE YoY GROWTH:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_daterevenueprev_year_revenueyoy_growth
5NVDA2024-04-302.604400e+10NaNNaN
6NVDA2024-07-313.004000e+101.350700e+101.2240
7NVDA2024-10-313.508200e+101.812000e+100.9361
8NVDA2025-01-313.933100e+102.210300e+100.7794
9NVDA2025-04-304.406200e+102.604400e+100.6918
10NVDA2025-07-314.674300e+103.004000e+100.5560
11NVDA2025-10-315.700600e+103.508200e+100.6249
12NVDA2026-01-316.812700e+103.933100e+100.7321
\n", "
" ], "text/plain": [ " symbol report_date revenue prev_year_revenue yoy_growth\n", "5 NVDA 2024-04-30 2.604400e+10 NaN NaN\n", "6 NVDA 2024-07-31 3.004000e+10 1.350700e+10 1.2240\n", "7 NVDA 2024-10-31 3.508200e+10 1.812000e+10 0.9361\n", "8 NVDA 2025-01-31 3.933100e+10 2.210300e+10 0.7794\n", "9 NVDA 2025-04-30 4.406200e+10 2.604400e+10 0.6918\n", "10 NVDA 2025-07-31 4.674300e+10 3.004000e+10 0.5560\n", "11 NVDA 2025-10-31 5.700600e+10 3.508200e+10 0.6249\n", "12 NVDA 2026-01-31 6.812700e+10 3.933100e+10 0.7321" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ QUARTERLY EPS YoY GROWTH:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_dateepsprev_year_epsyoy_growth
101NVDA2024-04-300.600.086.5000
102NVDA2024-07-310.670.251.6800
103NVDA2024-10-310.780.371.1081
104NVDA2025-01-310.890.490.8163
105NVDA2025-04-300.760.600.2667
106NVDA2025-07-311.080.670.6119
107NVDA2025-10-311.300.780.6667
108NVDA2026-01-311.760.890.9775
\n", "
" ], "text/plain": [ " symbol report_date eps prev_year_eps yoy_growth\n", "101 NVDA 2024-04-30 0.60 0.08 6.5000\n", "102 NVDA 2024-07-31 0.67 0.25 1.6800\n", "103 NVDA 2024-10-31 0.78 0.37 1.1081\n", "104 NVDA 2025-01-31 0.89 0.49 0.8163\n", "105 NVDA 2025-04-30 0.76 0.60 0.2667\n", "106 NVDA 2025-07-31 1.08 0.67 0.6119\n", "107 NVDA 2025-10-31 1.30 0.78 0.6667\n", "108 NVDA 2026-01-31 1.76 0.89 0.9775" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Explore growth metrics\n", "symbol = 'NVDA'\n", "db_ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"GROWTH & MARGIN METRICS\")\n", "print(\"=\" * 60)\n", "\n", "print(\"\\nšŸ“Œ QUARTERLY REVENUE YoY GROWTH:\")\n", "rev_growth = db_ticker.quarterly_revenue_yoy_growth()\n", "display(rev_growth.tail(8))\n", "\n", "print(\"\\nšŸ“Œ QUARTERLY EPS YoY GROWTH:\")\n", "eps_growth = db_ticker.quarterly_eps_yoy_growth()\n", "display(eps_growth.tail(8))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ QUARTERLY GROSS MARGIN:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_dategross_profittotal_revenuegross_margin
11NVDA2025-01-312.872300e+103.933100e+100.7303
12NVDA2025-04-302.666800e+104.406200e+100.6052
13NVDA2025-07-313.385300e+104.674300e+100.7242
14NVDA2025-10-314.184900e+105.700600e+100.7341
15NVDA2026-01-315.109300e+106.812700e+100.7500
\n", "
" ], "text/plain": [ " symbol report_date gross_profit total_revenue gross_margin\n", "11 NVDA 2025-01-31 2.872300e+10 3.933100e+10 0.7303\n", "12 NVDA 2025-04-30 2.666800e+10 4.406200e+10 0.6052\n", "13 NVDA 2025-07-31 3.385300e+10 4.674300e+10 0.7242\n", "14 NVDA 2025-10-31 4.184900e+10 5.700600e+10 0.7341\n", "15 NVDA 2026-01-31 5.109300e+10 6.812700e+10 0.7500" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ QUARTERLY NET MARGIN:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_datenet_income_common_stockholderstotal_revenuenet_margin
11NVDA2025-01-312.209100e+103.933100e+100.5617
12NVDA2025-04-301.877500e+104.406200e+100.4261
13NVDA2025-07-312.642200e+104.674300e+100.5653
14NVDA2025-10-313.191000e+105.700600e+100.5598
15NVDA2026-01-314.296000e+106.812700e+100.6306
\n", "
" ], "text/plain": [ " symbol report_date net_income_common_stockholders total_revenue \\\n", "11 NVDA 2025-01-31 2.209100e+10 3.933100e+10 \n", "12 NVDA 2025-04-30 1.877500e+10 4.406200e+10 \n", "13 NVDA 2025-07-31 2.642200e+10 4.674300e+10 \n", "14 NVDA 2025-10-31 3.191000e+10 5.700600e+10 \n", "15 NVDA 2026-01-31 4.296000e+10 6.812700e+10 \n", "\n", " net_margin \n", "11 0.5617 \n", "12 0.4261 \n", "13 0.5653 \n", "14 0.5598 \n", "15 0.6306 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Margin metrics\n", "print(\"\\nšŸ“Œ QUARTERLY GROSS MARGIN:\")\n", "gross_margin = db_ticker.quarterly_gross_margin()\n", "display(gross_margin.tail(5))\n", "\n", "print(\"\\nšŸ“Œ QUARTERLY NET MARGIN:\")\n", "net_margin = db_ticker.quarterly_net_margin()\n", "display(net_margin.tail(5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸŽÆ 7. UNIQUE FEATURES: EARNINGS TRANSCRIPTS" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "EARNINGS CALL TRANSCRIPTS (Unique to DefeatBeta!)\n", "============================================================\n", "\n", "šŸ“Œ Available transcripts: 82 quarters\n", " From FY2005 Q4 to FY2026 Q1\n", "\n", "šŸ“Œ MOST RECENT TRANSCRIPTS:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
fiscal_yearfiscal_quarterreport_date
77202512025-01-30
78202522025-05-01
79202532025-07-31
80202542025-10-30
81202612026-01-29
\n", "
" ], "text/plain": [ " fiscal_year fiscal_quarter report_date\n", "77 2025 1 2025-01-30\n", "78 2025 2 2025-05-01\n", "79 2025 3 2025-07-31\n", "80 2025 4 2025-10-30\n", "81 2026 1 2026-01-29" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Access earnings call transcripts\n", "symbol = 'AAPL'\n", "db_ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"EARNINGS CALL TRANSCRIPTS (Unique to DefeatBeta!)\")\n", "print(\"=\" * 60)\n", "\n", "transcripts = db_ticker.earning_call_transcripts()\n", "transcript_list = transcripts.get_transcripts_list()\n", "\n", "print(f\"\\nšŸ“Œ Available transcripts: {len(transcript_list)} quarters\")\n", "print(f\" From FY{transcript_list.iloc[0]['fiscal_year']} Q{transcript_list.iloc[0]['fiscal_quarter']} to FY{transcript_list.iloc[-1]['fiscal_year']} Q{transcript_list.iloc[-1]['fiscal_quarter']}\")\n", "\n", "print(\"\\nšŸ“Œ MOST RECENT TRANSCRIPTS:\")\n", "display(transcript_list[['fiscal_year', 'fiscal_quarter', 'report_date']].tail(5))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ SAMPLE: Q4 2025 EARNINGS CALL\n", " Type: DataFrame\n", " Total paragraphs: 77\n", " Speakers: 15\n", "\n", " šŸ“ FIRST 3 PARAGRAPHS:\n", "\n", " [Suhasini Chandramouli]:\n", " Good afternoon, and welcome to the Apple Q4 Fiscal Year 2025 Earnings Conference Call. My name is Suhasini Chandramouli, Director of Investor Relation...\n", "\n", " [Timothy Cook]:\n", " Thank you, Suhasini. Good afternoon, everyone, and thanks for joining the call. Today, Apple is proud to report $102.5 billion in revenue, up 8% from ...\n", "\n", " [Kevan Parekh]:\n", " Thanks, Tim, and good afternoon, everyone. Our revenue of $102.5 billion was up 8% year-over-year and is a new September quarter record. We set some t...\n" ] } ], "source": [ "# Get a specific transcript\n", "print(\"\\nšŸ“Œ SAMPLE: Q4 2025 EARNINGS CALL\")\n", "q4_2025 = transcripts.get_transcript(2025, 4)\n", "\n", "if q4_2025 is not None and len(q4_2025) > 0:\n", " print(f\" Type: {type(q4_2025).__name__}\")\n", " print(f\" Total paragraphs: {len(q4_2025)}\")\n", " print(f\" Speakers: {q4_2025['speaker'].nunique()}\")\n", " \n", " print(\"\\n šŸ“ FIRST 3 PARAGRAPHS:\")\n", " for idx, row in q4_2025.head(3).iterrows():\n", " speaker = row['speaker']\n", " content = row['content'][:150] + \"...\" if len(row['content']) > 150 else row['content']\n", " print(f\"\\n [{speaker}]:\")\n", " print(f\" {content}\")" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ AVAILABLE AI METHODS:\n", " • transcripts.analyze_financial_metrics_change_for_this_quarter_with_ai()\n", " • transcripts.analyze_financial_metrics_forecast_for_future_with_ai()\n", " • transcripts.summarize_key_financial_data_with_ai()\n", "\n", "āš ļø NOTE: AI methods require OPENAI_API_KEY to be set in environment\n", " Set with: export OPENAI_API_KEY=your_key_here\n" ] } ], "source": [ "# AI-powered analysis (requires OpenAI API key)\n", "print(\"\\nšŸ“Œ AVAILABLE AI METHODS:\")\n", "ai_methods = [m for m in dir(transcripts) if 'ai' in m.lower() or 'analyze' in m.lower()]\n", "for method in ai_methods:\n", " print(f\" • transcripts.{method}()\")\n", "\n", "print(\"\\nāš ļø NOTE: AI methods require OPENAI_API_KEY to be set in environment\")\n", "print(\" Set with: export OPENAI_API_KEY=your_key_here\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸŒ 8. REVENUE BREAKDOWN (Unique Feature!)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "REVENUE BREAKDOWN BY SEGMENT\n", "============================================================\n", "\n", "šŸ“Œ Columns: ['symbol', 'report_date', 'Mac', 'Services', 'Wearables, Home and Accessories', 'iPad', 'iPhone']\n", "\n", "šŸ“Œ Latest Quarter (2025-12-31):\n", " Mac: $8.39B\n", " Services: $30.01B\n", " Wearables, Home and Accessories: $11.49B\n", " iPad: $8.60B\n", " iPhone: $85.27B\n", "\n", " TOTAL: $143.76B\n" ] } ], "source": [ "# Revenue by segment - unique to DefeatBeta!\n", "symbol = 'AAPL'\n", "db_ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"REVENUE BREAKDOWN BY SEGMENT\")\n", "print(\"=\" * 60)\n", "\n", "revenue_segment = db_ticker.revenue_by_segment()\n", "print(f\"\\nšŸ“Œ Columns: {list(revenue_segment.columns)}\")\n", "print(f\"\\nšŸ“Œ Latest Quarter ({revenue_segment.iloc[-1]['report_date']}):\")\n", "\n", "latest = revenue_segment.iloc[-1]\n", "total = 0\n", "for col in revenue_segment.columns[2:]: # Skip symbol and report_date\n", " value = latest[col]\n", " if pd.notna(value):\n", " value = float(value) # Convert Decimal to float\n", " print(f\" {col}: ${value/1e9:.2f}B\")\n", " total += value\n", "print(f\"\\n TOTAL: ${total/1e9:.2f}B\")\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "šŸ“Œ REVENUE BY GEOGRAPHY:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolreport_dateAmericasEuropeGreater ChinaJapanRest of Asia Pacific
20AAPL2025-06-304.119800e+102.401400e+101.536900e+105.782000e+097.673000e+09
21AAPL2025-09-304.419200e+102.870300e+101.449300e+106.636000e+098.442000e+09
22AAPL2025-12-315.852900e+103.814600e+102.552600e+109.413000e+091.214200e+10
\n", "
" ], "text/plain": [ " symbol report_date Americas Europe Greater China \\\n", "20 AAPL 2025-06-30 4.119800e+10 2.401400e+10 1.536900e+10 \n", "21 AAPL 2025-09-30 4.419200e+10 2.870300e+10 1.449300e+10 \n", "22 AAPL 2025-12-31 5.852900e+10 3.814600e+10 2.552600e+10 \n", "\n", " Japan Rest of Asia Pacific \n", "20 5.782000e+09 7.673000e+09 \n", "21 6.636000e+09 8.442000e+09 \n", "22 9.413000e+09 1.214200e+10 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Revenue by geography\n", "print(\"\\nšŸ“Œ REVENUE BY GEOGRAPHY:\")\n", "revenue_geo = db_ticker.revenue_by_geography()\n", "display(revenue_geo.tail(3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ“‹ 9. DCF VALUATION (Automated!)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "AUTOMATED DCF VALUATION\n", "============================================================\n", "\n", "šŸ“Œ Running DCF analysis...\n" ] }, { "data": { "text/html": [ "\n", " \n", "
\n", " \n", " ā¬‡ļø Download AAPL DCF.xlsx\n", " \n", "
\n", "
\n", "
\n", "
\n", "
\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", " Return type: dict\n", " Keys: ['file_path', 'description']\n", " Description: DCF Valuation Analysis for AAPL\n", " Excel file: AAPL.xlsx\n", "\n", "āš ļø NOTE: DCF generates a professional Excel spreadsheet with:\n", " • WACC calculations\n", " • 10-year cash flow projections\n", " • Enterprise value and fair price\n", " • Buy/Sell recommendations\n" ] } ], "source": [ "# Automated DCF Valuation\n", "symbol = 'AAPL'\n", "db_ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"AUTOMATED DCF VALUATION\")\n", "print(\"=\" * 60)\n", "\n", "print(\"\\nšŸ“Œ Running DCF analysis...\")\n", "dcf_result = db_ticker.dcf()\n", "\n", "print(f\"\\n Return type: {type(dcf_result).__name__}\")\n", "if isinstance(dcf_result, dict):\n", " print(f\" Keys: {list(dcf_result.keys())}\")\n", " print(f\" Description: {dcf_result.get('description', 'N/A')}\")\n", " if 'file_path' in dcf_result:\n", " print(f\" Excel file: {dcf_result['file_path']}\")\n", "\n", "print(\"\\nāš ļø NOTE: DCF generates a professional Excel spreadsheet with:\")\n", "print(\" • WACC calculations\")\n", "print(\" • 10-year cash flow projections\")\n", "print(\" • Enterprise value and fair price\")\n", "print(\" • Buy/Sell recommendations\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ” 10. EXPLORE YOUR OWN STOCK" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "EXPLORING: GOOGL\n", "============================================================\n", "\n", "šŸ“Œ CURRENT PRICE DATA:\n", " Latest Close: $341.68\n", " Date: 2026-04-17\n", " Volume: 25,519,000\n", "\n", "šŸ“Œ VALUATION:\n", " TTM P/E: 31.61\n", " Market Cap: $4133.30B\n", "\n", "šŸ“Œ PROFITABILITY:\n", " ROE: 8.59%\n", " WACC: 13.93%\n", "\n", "šŸ“Œ GROWTH:\n", " Revenue YoY Growth: 18.00%\n" ] } ], "source": [ "# Interactive stock analysis - change the symbol!\n", "SYMBOL = 'GOOGL' # ā¬…ļø CHANGE THIS TO ANY STOCK SYMBOL\n", "\n", "print(\"=\" * 60)\n", "print(f\"EXPLORING: {SYMBOL}\")\n", "print(\"=\" * 60)\n", "\n", "ticker = Ticker(SYMBOL)\n", "\n", "# Basic stats\n", "price_data = ticker.price()\n", "latest = price_data.iloc[-1]\n", "\n", "print(f\"\\nšŸ“Œ CURRENT PRICE DATA:\")\n", "print(f\" Latest Close: ${float(latest['close']):.2f}\")\n", "print(f\" Date: {latest['report_date']}\")\n", "print(f\" Volume: {int(latest['volume']):,}\")\n", "\n", "# Valuation\n", "ttm_pe = ticker.ttm_pe()\n", "if not ttm_pe.empty:\n", " print(f\"\\nšŸ“Œ VALUATION:\")\n", " print(f\" TTM P/E: {float(ttm_pe.iloc[-1]['ttm_pe']):.2f}\")\n", "\n", "market_cap = ticker.market_capitalization()\n", "if not market_cap.empty:\n", " mcap = float(market_cap.iloc[-1]['market_capitalization'])\n", " print(f\" Market Cap: ${mcap/1e9:.2f}B\")\n", "\n", "# Ratios\n", "roe = ticker.roe()\n", "if not roe.empty:\n", " print(f\"\\nšŸ“Œ PROFITABILITY:\")\n", " print(f\" ROE: {float(roe.iloc[-1]['roe']):.2%}\")\n", "\n", "wacc = ticker.wacc()\n", "if not wacc.empty:\n", " print(f\" WACC: {float(wacc.iloc[-1]['wacc']):.2%}\")\n", "\n", "# Growth\n", "growth = ticker.quarterly_revenue_yoy_growth()\n", "if not growth.empty:\n", " print(f\"\\nšŸ“Œ GROWTH:\")\n", " print(f\" Revenue YoY Growth: {float(growth.iloc[-1]['yoy_growth']):.2%}\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## 🧪 11. STOCK COMPARISON" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "STOCK COMPARISON\n", "============================================================\n", "\n", "šŸ“Œ COMPARISON TABLE:\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
PriceP/EMarket CapROERev GrowthGross Margin
Symbol
AAPL270.2334.21$3967.3B52.0%15.7%48.2%
MSFT422.7926.46$3139.5B10.2%16.7%68.0%
GOOGL341.6831.61$4133.3B8.6%18.0%59.8%
NVDA201.6841.16$4900.8B31.1%73.2%75.0%
\n", "
" ], "text/plain": [ " Price P/E Market Cap ROE Rev Growth Gross Margin\n", "Symbol \n", "AAPL 270.23 34.21 $3967.3B 52.0% 15.7% 48.2%\n", "MSFT 422.79 26.46 $3139.5B 10.2% 16.7% 68.0%\n", "GOOGL 341.68 31.61 $4133.3B 8.6% 18.0% 59.8%\n", "NVDA 201.68 41.16 $4900.8B 31.1% 73.2% 75.0%" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Compare multiple stocks\n", "stocks = ['AAPL', 'MSFT', 'GOOGL', 'NVDA'] # ā¬…ļø CHANGE THESE\n", "\n", "print(\"=\" * 60)\n", "print(\"STOCK COMPARISON\")\n", "print(\"=\" * 60)\n", "\n", "comparison_data = []\n", "\n", "for symbol in stocks:\n", " try:\n", " ticker = Ticker(symbol)\n", " \n", " metrics = {'Symbol': symbol}\n", " \n", " # Price\n", " price = ticker.price()\n", " if not price.empty:\n", " metrics['Price'] = float(price.iloc[-1]['close'])\n", " \n", " # Valuation\n", " ttm_pe = ticker.ttm_pe()\n", " if not ttm_pe.empty:\n", " metrics['P/E'] = float(ttm_pe.iloc[-1]['ttm_pe'])\n", " \n", " market_cap = ticker.market_capitalization()\n", " if not market_cap.empty:\n", " metrics['Market Cap'] = float(market_cap.iloc[-1]['market_capitalization'])\n", " \n", " # Profitability\n", " roe = ticker.roe()\n", " if not roe.empty:\n", " metrics['ROE'] = float(roe.iloc[-1]['roe'])\n", " \n", " # Growth\n", " growth = ticker.quarterly_revenue_yoy_growth()\n", " if not growth.empty:\n", " metrics['Rev Growth'] = float(growth.iloc[-1]['yoy_growth'])\n", " \n", " # Margins\n", " gross_margin = ticker.quarterly_gross_margin()\n", " if not gross_margin.empty:\n", " metrics['Gross Margin'] = float(gross_margin.iloc[-1]['gross_margin'])\n", " \n", " comparison_data.append(metrics)\n", " \n", " except Exception as e:\n", " print(f\"āš ļø Error loading {symbol}: {e}\")\n", "\n", "df = pd.DataFrame(comparison_data)\n", "df.set_index('Symbol', inplace=True)\n", "\n", "# Format Market Cap in billions\n", "df['Market Cap'] = df['Market Cap'].apply(lambda x: f\"${x/1e9:.1f}B\" if pd.notna(x) else 'N/A')\n", "df['Rev Growth'] = df['Rev Growth'].apply(lambda x: f\"{x:.1%}\" if pd.notna(x) else 'N/A')\n", "df['Gross Margin'] = df['Gross Margin'].apply(lambda x: f\"{x:.1%}\" if pd.notna(x) else 'N/A')\n", "df['ROE'] = df['ROE'].apply(lambda x: f\"{x:.1%}\" if pd.notna(x) else 'N/A')\n", "\n", "print(\"\\nšŸ“Œ COMPARISON TABLE:\")\n", "display(df)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ“š 12. COMPLETE METHOD REFERENCE" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "============================================================\n", "COMPLETE API METHOD REFERENCE\n", "============================================================\n", "\n", "šŸ’¹ Price & Volume:\n", " • ticker.price()\n", "\n", "šŸ“Š Valuation:\n", " • ticker.market_capitalization()\n", " • ticker.pb_ratio()\n", " • ticker.peg_ratio()\n", " • ticker.ps_ratio()\n", " • ticker.ttm_eps()\n", " • ticker.ttm_pe()\n", "\n", "šŸ“ˆ Financial Ratios:\n", " • ticker.asset_turnover()\n", " • ticker.beta()\n", " • ticker.equity_multiplier()\n", " • ticker.roa()\n", " • ticker.roe()\n", " • ticker.roic()\n", " • ticker.wacc()\n", "\n", "šŸ“‹ Income Statement:\n", " • ticker.annual_income_statement()\n", " • ticker.quarterly_income_statement()\n", "\n", "āš–ļø Balance Sheet:\n", " • ticker.annual_balance_sheet()\n", " • ticker.quarterly_balance_sheet()\n", "\n", "šŸ’µ Cash Flow:\n", " • ticker.annual_cash_flow()\n", " • ticker.quarterly_cash_flow()\n", "\n", "šŸ“‰ Growth Metrics:\n", " • ticker.annual_ebitda_yoy_growth()\n", " • ticker.annual_fcf_yoy_growth()\n", " • ticker.annual_net_income_yoy_growth()\n", " • ticker.annual_operating_income_yoy_growth()\n", " • ticker.annual_revenue_yoy_growth()\n", " • ticker.quarterly_ebitda_yoy_growth()\n", " • ticker.quarterly_eps_yoy_growth()\n", " • ticker.quarterly_fcf_yoy_growth()\n", " • ticker.quarterly_net_income_yoy_growth()\n", " • ticker.quarterly_operating_income_yoy_growth()\n", " • ticker.quarterly_revenue_yoy_growth()\n", " • ticker.quarterly_ttm_eps_yoy_growth()\n", "\n", "šŸ“Š Margin Metrics:\n", " • ticker.annual_ebitda_margin()\n", " • ticker.annual_fcf_margin()\n", " • ticker.annual_gross_margin()\n", " • ticker.annual_net_margin()\n", " • ticker.annual_operating_margin()\n", " • ticker.quarterly_ebitda_margin()\n", " • ticker.quarterly_fcf_margin()\n", " • ticker.quarterly_gross_margin()\n", " • ticker.quarterly_net_margin()\n", " • ticker.quarterly_operating_margin()\n", "\n", "šŸŽ™ļø Special Data:\n", " • ticker.dividends()\n", " • ticker.earning_call_transcripts()\n", " • ticker.news()\n", " • ticker.sec_filing()\n", " • ticker.splits()\n", "\n", "šŸŒ Revenue Breakdown:\n", " • ticker.revenue_by_geography()\n", " • ticker.revenue_by_product()\n", " • ticker.revenue_by_segment()\n", "\n", "šŸ­ Industry Metrics:\n", " • ticker.industry_asset_turnover()\n", " • ticker.industry_equity_multiplier()\n", " • ticker.industry_pb_ratio()\n", " • ticker.industry_ps_ratio()\n", " • ticker.industry_quarterly_ebitda_margin()\n", " • ticker.industry_quarterly_gross_margin()\n", " • ticker.industry_quarterly_net_margin()\n", " • ticker.industry_roa()\n", " • ticker.industry_roe()\n", " • ticker.industry_ttm_pe()\n", "\n", "ā„¹ļø Info & Calendar:\n", " • ticker.calendar()\n", " • ticker.currency()\n", " • ticker.info()\n", " • ticker.officers()\n", " • ticker.shares()\n" ] } ], "source": [ "# List all available methods\n", "symbol = 'AAPL'\n", "ticker = Ticker(symbol)\n", "\n", "print(\"=\" * 60)\n", "print(\"COMPLETE API METHOD REFERENCE\")\n", "print(\"=\" * 60)\n", "\n", "all_methods = [m for m in dir(ticker) if not m.startswith('_')]\n", "\n", "categories = {\n", " 'šŸ’¹ Price & Volume': ['price'],\n", " 'šŸ“Š Valuation': ['ttm_eps', 'ttm_pe', 'market_capitalization', 'ps_ratio', 'pb_ratio', 'peg_ratio'],\n", " 'šŸ“ˆ Financial Ratios': ['roe', 'roic', 'roa', 'wacc', 'beta', 'equity_multiplier', 'asset_turnover'],\n", " 'šŸ“‹ Income Statement': ['quarterly_income_statement', 'annual_income_statement'],\n", " 'āš–ļø Balance Sheet': ['quarterly_balance_sheet', 'annual_balance_sheet'],\n", " 'šŸ’µ Cash Flow': ['quarterly_cash_flow', 'annual_cash_flow'],\n", " 'šŸ“‰ Growth Metrics': [m for m in all_methods if 'yoy_growth' in m.lower()],\n", " 'šŸ“Š Margin Metrics': [m for m in all_methods if 'margin' in m.lower() and 'industry' not in m.lower()],\n", " 'šŸŽ™ļø Special Data': ['earning_call_transcripts', 'news', 'sec_filing', 'dividends', 'splits'],\n", " 'šŸŒ Revenue Breakdown': ['revenue_by_segment', 'revenue_by_product', 'revenue_by_geography'],\n", " 'šŸ­ Industry Metrics': [m for m in all_methods if 'industry' in m.lower()],\n", " 'ā„¹ļø Info & Calendar': ['info', 'calendar', 'currency', 'shares', 'officers']\n", "}\n", "\n", "for category, methods in categories.items():\n", " matching = [m for m in methods if m in all_methods]\n", " if matching:\n", " print(f\"\\n{category}:\")\n", " for method in sorted(matching):\n", " print(f\" • ticker.{method}()\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸŽ“ EXERCISES TO TRY" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Exercise 1: Find Undervalued Stocks\n", "Screen for stocks with P/E < 20 but ROE > 15%\n", "\n", "### Exercise 2: Growth Stock Analysis\n", "Compare NVDA vs AMD on revenue growth, margins, and profitability\n", "\n", "### Exercise 3: DCF Valuation\n", "Run DCF on 3 different stocks and compare their fair value estimates\n", "\n", "### Exercise 4: Revenue Mix Analysis\n", "Analyze how Apple's revenue mix has shifted from hardware to services\n", "\n", "### Exercise 5: Earnings Transcript Mining\n", "Extract key topics and sentiment from recent earnings calls" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## šŸ“– SUMMARY" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### DefeatBeta-API vs Yahoo Finance\n", "\n", "| Feature | DefeatBeta | Yahoo Finance |\n", "|---------|------------|---------------|\n", "| **Rate Limits** | āœ… None | āŒ Yes |\n", "| **Historical Data** | āœ… Full | āœ… Full |\n", "| **Financial Ratios** | āœ… Time series | āš ļø Current only |\n", "| **Earnings Transcripts** | āœ… Yes | āŒ No |\n", "| **Revenue Segmentation** | āœ… Yes | āŒ No |\n", "| **DCF Valuation** | āœ… Automated | āŒ No |\n", "| **Real-time Data** | āŒ Daily batch | āœ… 15min delayed |\n", "| **Query Speed** | ⚔ Fast (DuckDB) | 🐢 Variable |\n", "\n", "### When to Use Each\n", "- **DefeatBeta**: Historical analysis, financial modeling, backtesting, DCF\n", "- **Yahoo Finance**: Real-time data, analyst consensus, quick lookups" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "sym = \"AAPL\"\n", "dbt = Ticker(sym)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['__class__',\n", " '__delattr__',\n", " '__dict__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__getstate__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__init_subclass__',\n", " '__le__',\n", " '__lt__',\n", " '__module__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " '__weakref__',\n", " '_add_dcf_template_section',\n", " '_add_dcf_value_section',\n", " '_add_discount_rate_section',\n", " '_add_growth_estimates_section',\n", " '_add_key_metrics_display',\n", " '_calculate_yoy_growth',\n", " '_dataframe_to_stock_statements',\n", " '_generate_margin',\n", " '_get_finance_values_map',\n", " '_quarterly_book_value_of_equity',\n", " '_quarterly_eps_yoy_growth',\n", " '_query_data',\n", " '_query_data2',\n", " '_revenue_by_breakdown',\n", " '_statement',\n", " 'annual_balance_sheet',\n", " 'annual_cash_flow',\n", " 'annual_ebitda_margin',\n", " 'annual_ebitda_yoy_growth',\n", " 'annual_fcf_margin',\n", " 'annual_fcf_yoy_growth',\n", " 'annual_gross_margin',\n", " 'annual_income_statement',\n", " 'annual_net_income_yoy_growth',\n", " 'annual_net_margin',\n", " 'annual_operating_income_yoy_growth',\n", " 'annual_operating_margin',\n", " 'annual_revenue_yoy_growth',\n", " 'asset_turnover',\n", " 'beta',\n", " 'calendar',\n", " 'company_meta',\n", " 'config',\n", " 'currency',\n", " 'dcf',\n", " 'dividends',\n", " 'download_data_performance',\n", " 'duckdb_client',\n", " 'earning_call_transcripts',\n", " 'equity_multiplier',\n", " 'http_proxy',\n", " 'huggingface_client',\n", " 'industry_asset_turnover',\n", " 'industry_equity_multiplier',\n", " 'industry_pb_ratio',\n", " 'industry_ps_ratio',\n", " 'industry_quarterly_ebitda_margin',\n", " 'industry_quarterly_gross_margin',\n", " 'industry_quarterly_net_margin',\n", " 'industry_roa',\n", " 'industry_roe',\n", " 'industry_ttm_pe',\n", " 'info',\n", " 'log_level',\n", " 'market_capitalization',\n", " 'news',\n", " 'officers',\n", " 'pb_ratio',\n", " 'peg_ratio',\n", " 'price',\n", " 'ps_ratio',\n", " 'quarterly_balance_sheet',\n", " 'quarterly_cash_flow',\n", " 'quarterly_ebitda_margin',\n", " 'quarterly_ebitda_yoy_growth',\n", " 'quarterly_eps_yoy_growth',\n", " 'quarterly_fcf_margin',\n", " 'quarterly_fcf_yoy_growth',\n", " 'quarterly_gross_margin',\n", " 'quarterly_income_statement',\n", " 'quarterly_net_income_yoy_growth',\n", " 'quarterly_net_margin',\n", " 'quarterly_operating_income_yoy_growth',\n", " 'quarterly_operating_margin',\n", " 'quarterly_revenue_yoy_growth',\n", " 'quarterly_ttm_eps_yoy_growth',\n", " 'revenue_by_geography',\n", " 'revenue_by_product',\n", " 'revenue_by_segment',\n", " 'roa',\n", " 'roe',\n", " 'roic',\n", " 'sec_filing',\n", " 'shares',\n", " 'splits',\n", " 'ticker',\n", " 'treasure',\n", " 'ttm_eps',\n", " 'ttm_fcf',\n", " 'ttm_net_income_common_stockholders',\n", " 'ttm_pe',\n", " 'ttm_revenue',\n", " 'wacc']" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(dbt)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symboladdresscitycountryphonezipindustrysectorlong_business_summaryfull_time_employeesweb_sitereport_date
0AAPLOne Apple Park WayCupertinoUnited States(408) 996-101095014Consumer ElectronicsTechnologyApple Inc. designs, manufactures, and markets ...150000https://www.apple.com2026-04-18
\n", "
" ], "text/plain": [ " symbol address city country phone zip \\\n", "0 AAPL One Apple Park Way Cupertino United States (408) 996-1010 95014 \n", "\n", " industry sector \\\n", "0 Consumer Electronics Technology \n", "\n", " long_business_summary full_time_employees \\\n", "0 Apple Inc. designs, manufactures, and markets ... 150000 \n", "\n", " web_site report_date \n", "0 https://www.apple.com 2026-04-18 " ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dbt.info()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "dbt" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "yft = yf.ticker.Ticker(sym)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['__class__',\n", " '__delattr__',\n", " '__dict__',\n", " '__dir__',\n", " '__doc__',\n", " '__eq__',\n", " '__format__',\n", " '__ge__',\n", " '__getattribute__',\n", " '__getstate__',\n", " '__gt__',\n", " '__hash__',\n", " '__init__',\n", " '__init_subclass__',\n", " '__le__',\n", " '__lt__',\n", " '__module__',\n", " '__ne__',\n", " '__new__',\n", " '__reduce__',\n", " '__reduce_ex__',\n", " '__repr__',\n", " '__setattr__',\n", " '__sizeof__',\n", " '__str__',\n", " '__subclasshook__',\n", " '__weakref__',\n", " '_analysis',\n", " '_data',\n", " '_download_options',\n", " '_earnings',\n", " '_earnings_dates',\n", " '_expirations',\n", " '_fast_info',\n", " '_fetch_ticker_tz',\n", " '_financials',\n", " '_fundamentals',\n", " '_funds_data',\n", " '_get_earnings_dates_using_scrape',\n", " '_get_earnings_dates_using_screener',\n", " '_get_ticker_tz',\n", " '_holders',\n", " '_isin',\n", " '_lazy_load_price_history',\n", " '_message_handler',\n", " '_news',\n", " '_options2df',\n", " '_price_history',\n", " '_quote',\n", " '_shares',\n", " '_tz',\n", " '_underlying',\n", " 'actions',\n", " 'analyst_price_targets',\n", " 'balance_sheet',\n", " 'balancesheet',\n", " 'calendar',\n", " 'capital_gains',\n", " 'cash_flow',\n", " 'cashflow',\n", " 'dividends',\n", " 'earnings',\n", " 'earnings_dates',\n", " 'earnings_estimate',\n", " 'earnings_history',\n", " 'eps_revisions',\n", " 'eps_trend',\n", " 'fast_info',\n", " 'financials',\n", " 'funds_data',\n", " 'get_actions',\n", " 'get_analyst_price_targets',\n", " 'get_balance_sheet',\n", " 'get_balancesheet',\n", " 'get_calendar',\n", " 'get_capital_gains',\n", " 'get_cash_flow',\n", " 'get_cashflow',\n", " 'get_dividends',\n", " 'get_earnings',\n", " 'get_earnings_dates',\n", " 'get_earnings_estimate',\n", " 'get_earnings_history',\n", " 'get_eps_revisions',\n", " 'get_eps_trend',\n", " 'get_fast_info',\n", " 'get_financials',\n", " 'get_funds_data',\n", " 'get_growth_estimates',\n", " 'get_history_metadata',\n", " 'get_income_stmt',\n", " 'get_incomestmt',\n", " 'get_info',\n", " 'get_insider_purchases',\n", " 'get_insider_roster_holders',\n", " 'get_insider_transactions',\n", " 'get_institutional_holders',\n", " 'get_isin',\n", " 'get_major_holders',\n", " 'get_mutualfund_holders',\n", " 'get_news',\n", " 'get_recommendations',\n", " 'get_recommendations_summary',\n", " 'get_revenue_estimate',\n", " 'get_sec_filings',\n", " 'get_shares',\n", " 'get_shares_full',\n", " 'get_splits',\n", " 'get_sustainability',\n", " 'get_upgrades_downgrades',\n", " 'get_valuation_measures',\n", " 'growth_estimates',\n", " 'history',\n", " 'history_metadata',\n", " 'income_stmt',\n", " 'incomestmt',\n", " 'info',\n", " 'insider_purchases',\n", " 'insider_roster_holders',\n", " 'insider_transactions',\n", " 'institutional_holders',\n", " 'isin',\n", " 'live',\n", " 'major_holders',\n", " 'mutualfund_holders',\n", " 'news',\n", " 'option_chain',\n", " 'options',\n", " 'quarterly_balance_sheet',\n", " 'quarterly_balancesheet',\n", " 'quarterly_cash_flow',\n", " 'quarterly_cashflow',\n", " 'quarterly_earnings',\n", " 'quarterly_financials',\n", " 'quarterly_income_stmt',\n", " 'quarterly_incomestmt',\n", " 'recommendations',\n", " 'recommendations_summary',\n", " 'revenue_estimate',\n", " 'sec_filings',\n", " 'session',\n", " 'shares',\n", " 'splits',\n", " 'sustainability',\n", " 'ticker',\n", " 'ttm_cash_flow',\n", " 'ttm_cashflow',\n", " 'ttm_financials',\n", " 'ttm_income_stmt',\n", " 'ttm_incomestmt',\n", " 'upgrades_downgrades',\n", " 'valuation',\n", " 'ws']" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir(yft)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "import vectorbt as vbt\n", "data = Ticker(\"AAPL\")\n", "price = data.price().close" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "fast_ma = vbt.MA.run(price, 10)\n", "slow_ma = vbt.MA.run(price, 50)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "entries = fast_ma.ma_crossed_above(slow_ma)\n", "exits = slow_ma.ma_crossed_above(fast_ma)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "pf = vbt.Portfolio.from_signals(price, entries, exits, init_cash=100)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "np.float64(24134.667890761524)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pf.total_profit()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "df = data.price()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "# Move the 'report_date' column into the Index position\n", "df['report_date'] = pd.to_datetime(df['report_date'])\n", "df = df.set_index('report_date')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/df/scratch/trading/learn-trading/.venv/lib/python3.12/site-packages/vectorbt/data/base.py:535: UserWarning: Symbols have mismatching index. Dropping missing data points.\n", " data = cls.align_index(data, missing=missing_index)\n" ] }, { "data": { "application/vnd.plotly.v1+json": { "config": { "plotlyServerURL": "https://plot.ly" }, "data": [ { "mode": "markers", "name": "BTC-USD", "showlegend": true, "type": "scatter", "uid": "67aa9626-ac1b-42c0-a099-a328b49dec1c", "x": { "bdata": "CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZA==", "dtype": "i1" }, "y": { "bdata": "mK+UtOtqP0CuriPoT8szQIPwAEludVRA0xWeEGcPR0B7ZgSGdPw8QC6BJHCzoz5ANwxYwoLmOUCsGGPJO0Q8QNValYvRsSZAU19+kQcFKkAzPoxaHCYuQEinlOf0CSlAjbz+GDw5O0BK7rBdneM4QIHFzYytHT9A+w7yM2w4M0B+OVaaQRwgQIS+XEoBFidAe6qXi4NZBEAyQnWGlsA4QKBGRSUNyh9An3CYHWZKJUC8sFrwKB8VQAXSlAMHdShAdiQSlDDxIUDF2eoSmZcnQJnJg7UhsiFAl9wziuibKkDPoAU6Q/oUQEm0ZSOE8CNAy0HQuZ47KUA38jMaMjYgQKbzz73VjyBAT7ndADplHkBeC1GBgvMkQGgEOYUWJBJAy4X1+AmpBUDVLkwee0EKQAbEb4ovHBFAbNSj/R1dEkAHk0TJ2hsXQNAmwCtLbBNAXUV6z2ruG0D4q1QZxQAVQDj53fEekSNATxiMWbMzDkBL9m2Z4uYfQETRdEADOyBAt9NxUoFsGUDHBMVOsgYWQDEG466+QghAF8bkh6+FI0AoIcHtJP0XQBwjLe8nWiZAGWUkVwPpG0DNWALOhU8LQCJq4VT4kRFAcvK7f4qzD0CJo2FHcVQwQDkzpILCVxJA2wJW/+n7IkCVVjlTvDYjQNMN3ShU0gtAxrkHlw2ZIUCo9aZU7tUQQI3AimKP5xRAVpySzUt2CUB1KxSOX6QjQOxSkltS+gRAMHDw5jgbHUBhugiL8IYTQF+M/wYV6RVAi3I+XeMyA0CCVDJB2csSQMvj3gsVaRdA4XU5epM3A0D5beo8/BccQPXXbHs9pSVAr0MFgzSsGkA6tPc38MkZQNeWAqmwvQdA483JLopcBUB2nojO+S0CQOFGF2UKsBJA+e6G3NQkDUCM7oGijaQWQPr1I5x3NhJAHNBghB8JJUCGWEGmGaEOQIOisDRH+wZAVSGYKt1f/z8=", "dtype": "f8" } }, { "mode": "markers", "name": "ETH-USD", "showlegend": true, "type": "scatter", "uid": "7748b161-109f-4585-95c5-260ab9ff8b64", "x": { "bdata": "CgsMDQ4PEBESExQVFhcYGRobHB0eHyAhIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaW1xdXl9gYWJjZA==", "dtype": "i1" }, "y": { "bdata": "6iVfN8g8M0BCy/opnOZNQMSfb5TRlThAGWkY3uj2VEC042UXuo5HQGPDYY010/m/t+TUlO2/SkDRDD1Kh14SQBEiVhtL2URAkbm/lI0/CUC1MPC1d18jQD2HRQgqCypAp12SkVInIkAWIztTc245QKp/xnTX8U1AHSSJJV7rPkCBLpn23DsgQKdGI6LddTFA3DKwD9tk8j9S8wGzM6cwQEuuJcjfxD1A0mjJQmqTLEA6WWWAge4fQJRIlmfGZfU/Avbcy0WKIUAu0c7vfw8jQP14+wJQriZA18AKYXYOQ0DASrWG3fYbQBBhBRRgpfc/Z4qw3g/GI0AM93GHPcYRQCUsgMzydhJAfX4LSG7NJ0BeYs0EDqsxQIAuJDbW3C1A8/3U698vFEAMAosDAUg1QAuAbLXH2SdAh8/znL5wE0D/sYa5o9QGQKlhGfoKCCNAS3jaJsCkEkDQ00OcmbkZQKHxMlaRIxdAszYGx4IqPUAd5+tZCBogQKw/DcbC9xVA1H8GTF/JAUAe5clNIY4UQGGsxRyEzRBAphJvh8nJF0CXA/6ZGJgPQJnACzqdjB9AUmfugSOHBkA88O4HSTvjP4TJuQspoRZAcX2qUYD5QEBboZSl8GklQCC0nA8ASzhACDtmHTO2E0DVriQW7ocnQMc6UioPxh5A+4+oINKOJECKDQ+0I9cxQPc/M/zISjBAWpO8SRHAF0AzypxrpckUQIenNJ+usAFAGnfiuOn7HECALvrCi74LQGMwEGiD7gdATyDCmm9+IEDxW24DXC8gQNujJ8m1/RVAlQRk1eMc4T/sZpSOl58JQKUb4ria4wlAUgblBtzvC0AQ0oG8fKIHQCLPC9E3lRBAFHXhUbemG0Dt1qDrPi0HQOChYlK0HhFAcI8bE35YBEDsiy0swLH+P8v+Qv+QABFAVZtlZ/1VG0CxT3ljTE0aQJ/OaOajJPg/Cb5sKRH4HUA=", "dtype": "f8" } } ], "layout": { "height": 350, "legend": { "orientation": "h", "traceorder": "normal", "x": 1, "xanchor": "right", "y": 1.02, "yanchor": "bottom" }, "margin": { "b": 30, "l": 30, "r": 30, "t": 30 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "histogram": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#1f77b4", "#ff7f0e", "#2ca02c", "#dc3912", "#9467bd", "#8c564b", "#e377c2", "#7f7f7f", "#bcbd22", "#17becf" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "width": 700, "xaxis": { "title": { "text": "randnx_n" } }, "yaxis": { "title": { "text": "mean_expectancy" } } } }, "image/png": "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" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "symbols = [\"BTC-USD\", \"ETH-USD\"]\n", "data = vbt.YFData.download(symbols, missing_index=\"drop\")\n", "price = data.get(\"Close\")\n", "\n", "n = np.random.randint(10, 101, size=1000).tolist()\n", "pf = vbt.Portfolio.from_random_signals(price, n=n, init_cash=100, seed=42)\n", "\n", "mean_expectancy = pf.trades.expectancy().groupby([\"randnx_n\", \"symbol\"]).mean()\n", "fig = mean_expectancy.unstack().vbt.scatterplot(xaxis_title=\"randnx_n\", yaxis_title=\"mean_expectancy\")\n", "fig.show()" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idxsymbolciknamefinancial_currency
00NVDA1045810.0NVIDIA CORPUSD
11GOOGL1652044.0Alphabet Inc.USD
22AAPL320193.0Apple Inc.USD
33MSFT789019.0MICROSOFT CORPUSD
44AMZN1018724.0AMAZON COM INCUSD
..................
10396extra_5USMVNaNiShares MSCI USA Min Vol Factor ETFUSD
10397extra_6IWMNaNiShares Russell 2000 ETFUSD
10398extra_7VTVNaNVanguard Value ETFUSD
10399extra_8TLTNaNiShares 20+ Year Treasury Bond ETFUSD
10400extra_9JNKNaNSPDR Bloomberg High Yield Bond ETFUSD
\n", "

10401 rows Ɨ 5 columns

\n", "
" ], "text/plain": [ " idx symbol cik name \\\n", "0 0 NVDA 1045810.0 NVIDIA CORP \n", "1 1 GOOGL 1652044.0 Alphabet Inc. \n", "2 2 AAPL 320193.0 Apple Inc. \n", "3 3 MSFT 789019.0 MICROSOFT CORP \n", "4 4 AMZN 1018724.0 AMAZON COM INC \n", "... ... ... ... ... \n", "10396 extra_5 USMV NaN iShares MSCI USA Min Vol Factor ETF \n", "10397 extra_6 IWM NaN iShares Russell 2000 ETF \n", "10398 extra_7 VTV NaN Vanguard Value ETF \n", "10399 extra_8 TLT NaN iShares 20+ Year Treasury Bond ETF \n", "10400 extra_9 JNK NaN SPDR Bloomberg High Yield Bond ETF \n", "\n", " financial_currency \n", "0 USD \n", "1 USD \n", "2 USD \n", "3 USD \n", "4 USD \n", "... ... \n", "10396 USD \n", "10397 USD \n", "10398 USD \n", "10399 USD \n", "10400 USD \n", "\n", "[10401 rows x 5 columns]" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from defeatbeta_api.data.company_meta import CompanyMeta\n", "\n", "meta = CompanyMeta()\n", "pd.DataFrame(meta.get_all_companies_info())" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (3999457017.py, line 1)", "output_type": "error", "traceback": [ "\u001b[0;36m Cell \u001b[0;32mIn[64], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m dbt.\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "dbt." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.12.12" } }, "nbformat": 4, "nbformat_minor": 4 }