Files
learn-trading/defeatbeta_tutorial.ipynb
tomatocream b5bf689e72 docs: add API references, mapping corrections, and verification script
- Add yfinance.org and defeatbeta-api.org reference docs
- Fix defeatbeta_mapping.org: deprecated yfinance property names
  (quarterly_financials→quarterly_income_stmt, financials→income_stmt),
  longName vs longBusinessSummary conceptual mismatch, cashflow note typo
- Add Mapping Limitations section with live verification results (AAPL):
  DuckDB 1.4.3 incompatibility, format differences, coverage gaps
- Add docs/test_mapping.py as runnable mapping verification script
- Add offline.py, persistent_cache.py, download_data.py, warmup_cache.py
  for offline/cached defeatbeta usage
- Add aapl_yfinance.py exploration script and quant.py scaffold
- Add .envrc (uv layout) and update pyproject.toml + uv.lock

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-26 15:33:21 +08:00

4587 lines
190 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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: <urlopen error [SSL:\n",
"[nltk_data] CERTIFICATE_VERIFY_FAILED] certificate verify failed:\n",
"[nltk_data] unable to get local issuer certificate (_ssl.c:1010)>\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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>open</th>\n",
" <th>close</th>\n",
" <th>high</th>\n",
" <th>low</th>\n",
" <th>volume</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>7887</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-06</td>\n",
" <td>256.51</td>\n",
" <td>258.86</td>\n",
" <td>262.16</td>\n",
" <td>256.46</td>\n",
" <td>29329900</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7888</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-07</td>\n",
" <td>256.16</td>\n",
" <td>253.50</td>\n",
" <td>256.20</td>\n",
" <td>245.70</td>\n",
" <td>62148000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7889</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-08</td>\n",
" <td>258.45</td>\n",
" <td>258.90</td>\n",
" <td>259.75</td>\n",
" <td>256.53</td>\n",
" <td>41032800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7890</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-09</td>\n",
" <td>259.00</td>\n",
" <td>260.49</td>\n",
" <td>261.12</td>\n",
" <td>256.07</td>\n",
" <td>28121600</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7891</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-10</td>\n",
" <td>259.98</td>\n",
" <td>260.48</td>\n",
" <td>262.19</td>\n",
" <td>259.02</td>\n",
" <td>31291500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7892</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-13</td>\n",
" <td>259.73</td>\n",
" <td>259.20</td>\n",
" <td>260.18</td>\n",
" <td>256.66</td>\n",
" <td>36234700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7893</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-14</td>\n",
" <td>259.25</td>\n",
" <td>258.83</td>\n",
" <td>261.93</td>\n",
" <td>257.19</td>\n",
" <td>48370700</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7894</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-15</td>\n",
" <td>258.16</td>\n",
" <td>266.43</td>\n",
" <td>266.56</td>\n",
" <td>257.81</td>\n",
" <td>49913500</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7895</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-16</td>\n",
" <td>266.80</td>\n",
" <td>263.40</td>\n",
" <td>267.16</td>\n",
" <td>261.27</td>\n",
" <td>43323100</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7896</th>\n",
" <td>AAPL</td>\n",
" <td>2026-04-17</td>\n",
" <td>266.96</td>\n",
" <td>270.23</td>\n",
" <td>272.30</td>\n",
" <td>266.72</td>\n",
" <td>61314800</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Open</th>\n",
" <th>High</th>\n",
" <th>Low</th>\n",
" <th>Close</th>\n",
" <th>Volume</th>\n",
" <th>Dividends</th>\n",
" <th>Stock Splits</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2026-04-13 00:00:00-04:00</th>\n",
" <td>259.730011</td>\n",
" <td>260.179993</td>\n",
" <td>256.660004</td>\n",
" <td>259.200012</td>\n",
" <td>36234700</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-14 00:00:00-04:00</th>\n",
" <td>259.250000</td>\n",
" <td>261.929993</td>\n",
" <td>257.190002</td>\n",
" <td>258.829987</td>\n",
" <td>48370700</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-15 00:00:00-04:00</th>\n",
" <td>258.160004</td>\n",
" <td>266.559998</td>\n",
" <td>257.809998</td>\n",
" <td>266.429993</td>\n",
" <td>49913500</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-16 00:00:00-04:00</th>\n",
" <td>266.799988</td>\n",
" <td>267.160004</td>\n",
" <td>261.269989</td>\n",
" <td>263.399994</td>\n",
" <td>43323100</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-17 00:00:00-04:00</th>\n",
" <td>266.959991</td>\n",
" <td>272.299988</td>\n",
" <td>266.720001</td>\n",
" <td>270.230011</td>\n",
" <td>61436200</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-20 00:00:00-04:00</th>\n",
" <td>270.329987</td>\n",
" <td>274.279999</td>\n",
" <td>270.290009</td>\n",
" <td>273.049988</td>\n",
" <td>36590200</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-21 00:00:00-04:00</th>\n",
" <td>271.500000</td>\n",
" <td>272.799988</td>\n",
" <td>265.399994</td>\n",
" <td>266.170013</td>\n",
" <td>50209800</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-22 00:00:00-04:00</th>\n",
" <td>267.820007</td>\n",
" <td>273.739990</td>\n",
" <td>266.869995</td>\n",
" <td>273.170013</td>\n",
" <td>43249200</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-23 00:00:00-04:00</th>\n",
" <td>275.049988</td>\n",
" <td>275.769989</td>\n",
" <td>271.649994</td>\n",
" <td>273.429993</td>\n",
" <td>33399600</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2026-04-24 00:00:00-04:00</th>\n",
" <td>272.760010</td>\n",
" <td>273.059998</td>\n",
" <td>269.649994</td>\n",
" <td>271.059998</td>\n",
" <td>38124500</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>tailing_eps</th>\n",
" <th>eps</th>\n",
" <th>update_time</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>104</th>\n",
" <td>NVDA</td>\n",
" <td>2025-01-31</td>\n",
" <td>2.94</td>\n",
" <td>0.89</td>\n",
" <td>2026-04-18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>105</th>\n",
" <td>NVDA</td>\n",
" <td>2025-04-30</td>\n",
" <td>3.10</td>\n",
" <td>0.76</td>\n",
" <td>2026-04-18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>106</th>\n",
" <td>NVDA</td>\n",
" <td>2025-07-31</td>\n",
" <td>3.51</td>\n",
" <td>1.08</td>\n",
" <td>2026-04-18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>107</th>\n",
" <td>NVDA</td>\n",
" <td>2025-10-31</td>\n",
" <td>4.04</td>\n",
" <td>1.30</td>\n",
" <td>2026-04-18</td>\n",
" </tr>\n",
" <tr>\n",
" <th>108</th>\n",
" <td>NVDA</td>\n",
" <td>2026-01-31</td>\n",
" <td>4.90</td>\n",
" <td>1.76</td>\n",
" <td>2026-04-18</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>eps_report_date</th>\n",
" <th>close_price</th>\n",
" <th>ttm_eps</th>\n",
" <th>ttm_pe</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>6846</th>\n",
" <td>NVDA</td>\n",
" <td>2026-04-13</td>\n",
" <td>2026-01-31</td>\n",
" <td>189.31</td>\n",
" <td>4.9</td>\n",
" <td>38.63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6847</th>\n",
" <td>NVDA</td>\n",
" <td>2026-04-14</td>\n",
" <td>2026-01-31</td>\n",
" <td>196.51</td>\n",
" <td>4.9</td>\n",
" <td>40.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6848</th>\n",
" <td>NVDA</td>\n",
" <td>2026-04-15</td>\n",
" <td>2026-01-31</td>\n",
" <td>198.87</td>\n",
" <td>4.9</td>\n",
" <td>40.59</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6849</th>\n",
" <td>NVDA</td>\n",
" <td>2026-04-16</td>\n",
" <td>2026-01-31</td>\n",
" <td>198.35</td>\n",
" <td>4.9</td>\n",
" <td>40.48</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6850</th>\n",
" <td>NVDA</td>\n",
" <td>2026-04-17</td>\n",
" <td>2026-01-31</td>\n",
" <td>201.68</td>\n",
" <td>4.9</td>\n",
" <td>41.16</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>report_date</th>\n",
" <th>close_price</th>\n",
" <th>shares_outstanding</th>\n",
" <th>market_capitalization</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>6846</th>\n",
" <td>2026-04-13</td>\n",
" <td>189.31</td>\n",
" <td>2.430000e+10</td>\n",
" <td>4.600233e+12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6847</th>\n",
" <td>2026-04-14</td>\n",
" <td>196.51</td>\n",
" <td>2.430000e+10</td>\n",
" <td>4.775193e+12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6848</th>\n",
" <td>2026-04-15</td>\n",
" <td>198.87</td>\n",
" <td>2.430000e+10</td>\n",
" <td>4.832541e+12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6849</th>\n",
" <td>2026-04-16</td>\n",
" <td>198.35</td>\n",
" <td>2.430000e+10</td>\n",
" <td>4.819905e+12</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6850</th>\n",
" <td>2026-04-17</td>\n",
" <td>201.68</td>\n",
" <td>2.430000e+10</td>\n",
" <td>4.900824e+12</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Metric</th>\n",
" <th>TTM Value</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>Total Revenue</td>\n",
" <td>281724000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Operating Revenue</td>\n",
" <td>281724000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Cost of Revenue</td>\n",
" <td>87831000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Gross Profit</td>\n",
" <td>193893000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Operating Expense</td>\n",
" <td>65365000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Selling General and Administrative</td>\n",
" <td>32877000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>General &amp; Administrative Expense</td>\n",
" <td>7223000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>Other G and A</td>\n",
" <td>7223000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Selling &amp; Marketing Expense</td>\n",
" <td>25654000000.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>Research &amp; Development</td>\n",
" <td>32488000000.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>net_income_common_stockholders</th>\n",
" <th>beginning_stockholders_equity</th>\n",
" <th>ending_stockholders_equity</th>\n",
" <th>avg_equity</th>\n",
" <th>roe</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>TSLA</td>\n",
" <td>2023-09-30</td>\n",
" <td>1.851000e+09</td>\n",
" <td>5.113000e+10</td>\n",
" <td>5.346600e+10</td>\n",
" <td>5.229800e+10</td>\n",
" <td>0.0354</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>TSLA</td>\n",
" <td>2023-12-31</td>\n",
" <td>7.927000e+09</td>\n",
" <td>5.346600e+10</td>\n",
" <td>6.263400e+10</td>\n",
" <td>5.805000e+10</td>\n",
" <td>0.1366</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>TSLA</td>\n",
" <td>2024-03-31</td>\n",
" <td>1.432000e+09</td>\n",
" <td>6.263400e+10</td>\n",
" <td>6.437800e+10</td>\n",
" <td>6.350600e+10</td>\n",
" <td>0.0225</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>TSLA</td>\n",
" <td>2024-06-30</td>\n",
" <td>1.400000e+09</td>\n",
" <td>6.437800e+10</td>\n",
" <td>6.646800e+10</td>\n",
" <td>6.542300e+10</td>\n",
" <td>0.0214</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>TSLA</td>\n",
" <td>2024-09-30</td>\n",
" <td>2.173000e+09</td>\n",
" <td>6.646800e+10</td>\n",
" <td>6.993100e+10</td>\n",
" <td>6.819950e+10</td>\n",
" <td>0.0319</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>TSLA</td>\n",
" <td>2024-12-31</td>\n",
" <td>2.314000e+09</td>\n",
" <td>6.993100e+10</td>\n",
" <td>7.291300e+10</td>\n",
" <td>7.142200e+10</td>\n",
" <td>0.0324</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>TSLA</td>\n",
" <td>2025-03-31</td>\n",
" <td>4.090000e+08</td>\n",
" <td>7.291300e+10</td>\n",
" <td>7.465300e+10</td>\n",
" <td>7.378300e+10</td>\n",
" <td>0.0055</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>TSLA</td>\n",
" <td>2025-06-30</td>\n",
" <td>1.172000e+09</td>\n",
" <td>7.465300e+10</td>\n",
" <td>7.731400e+10</td>\n",
" <td>7.598350e+10</td>\n",
" <td>0.0154</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>TSLA</td>\n",
" <td>2025-09-30</td>\n",
" <td>1.373000e+09</td>\n",
" <td>7.731400e+10</td>\n",
" <td>7.997000e+10</td>\n",
" <td>7.864200e+10</td>\n",
" <td>0.0175</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>TSLA</td>\n",
" <td>2025-12-31</td>\n",
" <td>8.400000e+08</td>\n",
" <td>7.997000e+10</td>\n",
" <td>8.213700e+10</td>\n",
" <td>8.105350e+10</td>\n",
" <td>0.0104</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>ebit</th>\n",
" <th>tax_rate_for_calcs</th>\n",
" <th>nopat</th>\n",
" <th>beginning_invested_capital</th>\n",
" <th>ending_invested_capital</th>\n",
" <th>avg_invested_capital</th>\n",
" <th>roic</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>TSLA</td>\n",
" <td>2022-09-30</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>3.952800e+10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>TSLA</td>\n",
" <td>2023-09-30</td>\n",
" <td>2.083000e+09</td>\n",
" <td>0.08</td>\n",
" <td>1.916360e+09</td>\n",
" <td>5.264900e+10</td>\n",
" <td>5.717000e+10</td>\n",
" <td>5.490950e+10</td>\n",
" <td>0.0349</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>TSLA</td>\n",
" <td>2023-12-31</td>\n",
" <td>2.252000e+09</td>\n",
" <td>0.21</td>\n",
" <td>1.779080e+09</td>\n",
" <td>5.717000e+10</td>\n",
" <td>6.729100e+10</td>\n",
" <td>6.223050e+10</td>\n",
" <td>0.0286</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>TSLA</td>\n",
" <td>2024-03-31</td>\n",
" <td>1.964000e+09</td>\n",
" <td>0.26</td>\n",
" <td>1.453360e+09</td>\n",
" <td>6.729100e+10</td>\n",
" <td>6.925200e+10</td>\n",
" <td>6.827150e+10</td>\n",
" <td>0.0213</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>TSLA</td>\n",
" <td>2024-06-30</td>\n",
" <td>1.873000e+09</td>\n",
" <td>0.21</td>\n",
" <td>1.479670e+09</td>\n",
" <td>6.925200e+10</td>\n",
" <td>7.383000e+10</td>\n",
" <td>7.154100e+10</td>\n",
" <td>0.0207</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>TSLA</td>\n",
" <td>2024-09-30</td>\n",
" <td>2.883000e+09</td>\n",
" <td>0.22</td>\n",
" <td>2.248740e+09</td>\n",
" <td>7.383000e+10</td>\n",
" <td>7.732100e+10</td>\n",
" <td>7.557550e+10</td>\n",
" <td>0.0298</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>TSLA</td>\n",
" <td>2024-12-31</td>\n",
" <td>2.862000e+09</td>\n",
" <td>0.16</td>\n",
" <td>2.404080e+09</td>\n",
" <td>7.732100e+10</td>\n",
" <td>8.079100e+10</td>\n",
" <td>7.905600e+10</td>\n",
" <td>0.0304</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>TSLA</td>\n",
" <td>2025-03-31</td>\n",
" <td>6.800000e+08</td>\n",
" <td>0.29</td>\n",
" <td>4.828000e+08</td>\n",
" <td>8.079100e+10</td>\n",
" <td>8.189700e+10</td>\n",
" <td>8.134400e+10</td>\n",
" <td>0.0059</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>TSLA</td>\n",
" <td>2025-06-30</td>\n",
" <td>1.635000e+09</td>\n",
" <td>0.23</td>\n",
" <td>1.258950e+09</td>\n",
" <td>8.189700e+10</td>\n",
" <td>8.427000e+10</td>\n",
" <td>8.308350e+10</td>\n",
" <td>0.0152</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>TSLA</td>\n",
" <td>2025-09-30</td>\n",
" <td>2.035000e+09</td>\n",
" <td>0.29</td>\n",
" <td>1.444850e+09</td>\n",
" <td>8.427000e+10</td>\n",
" <td>8.743100e+10</td>\n",
" <td>8.585050e+10</td>\n",
" <td>0.0168</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>TSLA</td>\n",
" <td>2025-12-31</td>\n",
" <td>1.266000e+09</td>\n",
" <td>0.28</td>\n",
" <td>9.115200e+08</td>\n",
" <td>8.743100e+10</td>\n",
" <td>9.029000e+10</td>\n",
" <td>8.886050e+10</td>\n",
" <td>0.0103</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>revenue</th>\n",
" <th>prev_year_revenue</th>\n",
" <th>yoy_growth</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>NVDA</td>\n",
" <td>2024-04-30</td>\n",
" <td>2.604400e+10</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>NVDA</td>\n",
" <td>2024-07-31</td>\n",
" <td>3.004000e+10</td>\n",
" <td>1.350700e+10</td>\n",
" <td>1.2240</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>NVDA</td>\n",
" <td>2024-10-31</td>\n",
" <td>3.508200e+10</td>\n",
" <td>1.812000e+10</td>\n",
" <td>0.9361</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>NVDA</td>\n",
" <td>2025-01-31</td>\n",
" <td>3.933100e+10</td>\n",
" <td>2.210300e+10</td>\n",
" <td>0.7794</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>NVDA</td>\n",
" <td>2025-04-30</td>\n",
" <td>4.406200e+10</td>\n",
" <td>2.604400e+10</td>\n",
" <td>0.6918</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10</th>\n",
" <td>NVDA</td>\n",
" <td>2025-07-31</td>\n",
" <td>4.674300e+10</td>\n",
" <td>3.004000e+10</td>\n",
" <td>0.5560</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>NVDA</td>\n",
" <td>2025-10-31</td>\n",
" <td>5.700600e+10</td>\n",
" <td>3.508200e+10</td>\n",
" <td>0.6249</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>NVDA</td>\n",
" <td>2026-01-31</td>\n",
" <td>6.812700e+10</td>\n",
" <td>3.933100e+10</td>\n",
" <td>0.7321</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>eps</th>\n",
" <th>prev_year_eps</th>\n",
" <th>yoy_growth</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>101</th>\n",
" <td>NVDA</td>\n",
" <td>2024-04-30</td>\n",
" <td>0.60</td>\n",
" <td>0.08</td>\n",
" <td>6.5000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>102</th>\n",
" <td>NVDA</td>\n",
" <td>2024-07-31</td>\n",
" <td>0.67</td>\n",
" <td>0.25</td>\n",
" <td>1.6800</td>\n",
" </tr>\n",
" <tr>\n",
" <th>103</th>\n",
" <td>NVDA</td>\n",
" <td>2024-10-31</td>\n",
" <td>0.78</td>\n",
" <td>0.37</td>\n",
" <td>1.1081</td>\n",
" </tr>\n",
" <tr>\n",
" <th>104</th>\n",
" <td>NVDA</td>\n",
" <td>2025-01-31</td>\n",
" <td>0.89</td>\n",
" <td>0.49</td>\n",
" <td>0.8163</td>\n",
" </tr>\n",
" <tr>\n",
" <th>105</th>\n",
" <td>NVDA</td>\n",
" <td>2025-04-30</td>\n",
" <td>0.76</td>\n",
" <td>0.60</td>\n",
" <td>0.2667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>106</th>\n",
" <td>NVDA</td>\n",
" <td>2025-07-31</td>\n",
" <td>1.08</td>\n",
" <td>0.67</td>\n",
" <td>0.6119</td>\n",
" </tr>\n",
" <tr>\n",
" <th>107</th>\n",
" <td>NVDA</td>\n",
" <td>2025-10-31</td>\n",
" <td>1.30</td>\n",
" <td>0.78</td>\n",
" <td>0.6667</td>\n",
" </tr>\n",
" <tr>\n",
" <th>108</th>\n",
" <td>NVDA</td>\n",
" <td>2026-01-31</td>\n",
" <td>1.76</td>\n",
" <td>0.89</td>\n",
" <td>0.9775</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>gross_profit</th>\n",
" <th>total_revenue</th>\n",
" <th>gross_margin</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>NVDA</td>\n",
" <td>2025-01-31</td>\n",
" <td>2.872300e+10</td>\n",
" <td>3.933100e+10</td>\n",
" <td>0.7303</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>NVDA</td>\n",
" <td>2025-04-30</td>\n",
" <td>2.666800e+10</td>\n",
" <td>4.406200e+10</td>\n",
" <td>0.6052</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>NVDA</td>\n",
" <td>2025-07-31</td>\n",
" <td>3.385300e+10</td>\n",
" <td>4.674300e+10</td>\n",
" <td>0.7242</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>NVDA</td>\n",
" <td>2025-10-31</td>\n",
" <td>4.184900e+10</td>\n",
" <td>5.700600e+10</td>\n",
" <td>0.7341</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>NVDA</td>\n",
" <td>2026-01-31</td>\n",
" <td>5.109300e+10</td>\n",
" <td>6.812700e+10</td>\n",
" <td>0.7500</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>net_income_common_stockholders</th>\n",
" <th>total_revenue</th>\n",
" <th>net_margin</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>11</th>\n",
" <td>NVDA</td>\n",
" <td>2025-01-31</td>\n",
" <td>2.209100e+10</td>\n",
" <td>3.933100e+10</td>\n",
" <td>0.5617</td>\n",
" </tr>\n",
" <tr>\n",
" <th>12</th>\n",
" <td>NVDA</td>\n",
" <td>2025-04-30</td>\n",
" <td>1.877500e+10</td>\n",
" <td>4.406200e+10</td>\n",
" <td>0.4261</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>NVDA</td>\n",
" <td>2025-07-31</td>\n",
" <td>2.642200e+10</td>\n",
" <td>4.674300e+10</td>\n",
" <td>0.5653</td>\n",
" </tr>\n",
" <tr>\n",
" <th>14</th>\n",
" <td>NVDA</td>\n",
" <td>2025-10-31</td>\n",
" <td>3.191000e+10</td>\n",
" <td>5.700600e+10</td>\n",
" <td>0.5598</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>NVDA</td>\n",
" <td>2026-01-31</td>\n",
" <td>4.296000e+10</td>\n",
" <td>6.812700e+10</td>\n",
" <td>0.6306</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>fiscal_year</th>\n",
" <th>fiscal_quarter</th>\n",
" <th>report_date</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>77</th>\n",
" <td>2025</td>\n",
" <td>1</td>\n",
" <td>2025-01-30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>78</th>\n",
" <td>2025</td>\n",
" <td>2</td>\n",
" <td>2025-05-01</td>\n",
" </tr>\n",
" <tr>\n",
" <th>79</th>\n",
" <td>2025</td>\n",
" <td>3</td>\n",
" <td>2025-07-31</td>\n",
" </tr>\n",
" <tr>\n",
" <th>80</th>\n",
" <td>2025</td>\n",
" <td>4</td>\n",
" <td>2025-10-30</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>2026</td>\n",
" <td>1</td>\n",
" <td>2026-01-29</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>report_date</th>\n",
" <th>Americas</th>\n",
" <th>Europe</th>\n",
" <th>Greater China</th>\n",
" <th>Japan</th>\n",
" <th>Rest of Asia Pacific</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>AAPL</td>\n",
" <td>2025-06-30</td>\n",
" <td>4.119800e+10</td>\n",
" <td>2.401400e+10</td>\n",
" <td>1.536900e+10</td>\n",
" <td>5.782000e+09</td>\n",
" <td>7.673000e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>AAPL</td>\n",
" <td>2025-09-30</td>\n",
" <td>4.419200e+10</td>\n",
" <td>2.870300e+10</td>\n",
" <td>1.449300e+10</td>\n",
" <td>6.636000e+09</td>\n",
" <td>8.442000e+09</td>\n",
" </tr>\n",
" <tr>\n",
" <th>22</th>\n",
" <td>AAPL</td>\n",
" <td>2025-12-31</td>\n",
" <td>5.852900e+10</td>\n",
" <td>3.814600e+10</td>\n",
" <td>2.552600e+10</td>\n",
" <td>9.413000e+09</td>\n",
" <td>1.214200e+10</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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",
" <script src=\"https://apis.google.com/js/platform.js\" async defer></script>\n",
" <div style=\"margin-top: 12px;\">\n",
" <a href=\"AAPL.xlsx\" download=\"AAPL_DCF.xlsx\"\n",
" style=\"font-size:16px; margin-right:20px; display:inline-block;\">\n",
" ⬇️ Download AAPL DCF.xlsx\n",
" </a>\n",
" <div id=\"drive-button-AAPL\" style=\"display:inline-block;\">\n",
" <div class=\"g-savetodrive\"\n",
" data-src=\"\"\n",
" data-filename=\"AAPL_DCF.xlsx\"\n",
" data-sitename=\"DefeatBeta DCF Analysis\">\n",
" </div>\n",
" </div>\n",
" </div>\n",
" <script>\n",
" (function() {\n",
" // Get the current page URL and construct the full file URL\n",
" var baseUrl = window.location.origin + window.location.pathname.replace(/\\/[^/]*$/, '');\n",
" var fileUrl = baseUrl + '/files/AAPL.xlsx';\n",
"\n",
" // Update the data-src attribute with the full URL\n",
" var saveButton = document.querySelector('#drive-button-AAPL .g-savetodrive');\n",
" if (saveButton) {\n",
" saveButton.setAttribute('data-src', fileUrl);\n",
"\n",
" // Reload the Google Drive button to apply the new URL\n",
" if (typeof gapi !== 'undefined' && gapi.savetodrive) {\n",
" gapi.savetodrive.go('#drive-button-AAPL');\n",
" }\n",
" }\n",
" })();\n",
" </script>\n",
" "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Price</th>\n",
" <th>P/E</th>\n",
" <th>Market Cap</th>\n",
" <th>ROE</th>\n",
" <th>Rev Growth</th>\n",
" <th>Gross Margin</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Symbol</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>AAPL</th>\n",
" <td>270.23</td>\n",
" <td>34.21</td>\n",
" <td>$3967.3B</td>\n",
" <td>52.0%</td>\n",
" <td>15.7%</td>\n",
" <td>48.2%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>MSFT</th>\n",
" <td>422.79</td>\n",
" <td>26.46</td>\n",
" <td>$3139.5B</td>\n",
" <td>10.2%</td>\n",
" <td>16.7%</td>\n",
" <td>68.0%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>GOOGL</th>\n",
" <td>341.68</td>\n",
" <td>31.61</td>\n",
" <td>$4133.3B</td>\n",
" <td>8.6%</td>\n",
" <td>18.0%</td>\n",
" <td>59.8%</td>\n",
" </tr>\n",
" <tr>\n",
" <th>NVDA</th>\n",
" <td>201.68</td>\n",
" <td>41.16</td>\n",
" <td>$4900.8B</td>\n",
" <td>31.1%</td>\n",
" <td>73.2%</td>\n",
" <td>75.0%</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>symbol</th>\n",
" <th>address</th>\n",
" <th>city</th>\n",
" <th>country</th>\n",
" <th>phone</th>\n",
" <th>zip</th>\n",
" <th>industry</th>\n",
" <th>sector</th>\n",
" <th>long_business_summary</th>\n",
" <th>full_time_employees</th>\n",
" <th>web_site</th>\n",
" <th>report_date</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>AAPL</td>\n",
" <td>One Apple Park Way</td>\n",
" <td>Cupertino</td>\n",
" <td>United States</td>\n",
" <td>(408) 996-1010</td>\n",
" <td>95014</td>\n",
" <td>Consumer Electronics</td>\n",
" <td>Technology</td>\n",
" <td>Apple Inc. designs, manufactures, and markets ...</td>\n",
" <td>150000</td>\n",
" <td>https://www.apple.com</td>\n",
" <td>2026-04-18</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"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": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>idx</th>\n",
" <th>symbol</th>\n",
" <th>cik</th>\n",
" <th>name</th>\n",
" <th>financial_currency</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>NVDA</td>\n",
" <td>1045810.0</td>\n",
" <td>NVIDIA CORP</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1</td>\n",
" <td>GOOGL</td>\n",
" <td>1652044.0</td>\n",
" <td>Alphabet Inc.</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2</td>\n",
" <td>AAPL</td>\n",
" <td>320193.0</td>\n",
" <td>Apple Inc.</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>3</td>\n",
" <td>MSFT</td>\n",
" <td>789019.0</td>\n",
" <td>MICROSOFT CORP</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>4</td>\n",
" <td>AMZN</td>\n",
" <td>1018724.0</td>\n",
" <td>AMAZON COM INC</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10396</th>\n",
" <td>extra_5</td>\n",
" <td>USMV</td>\n",
" <td>NaN</td>\n",
" <td>iShares MSCI USA Min Vol Factor ETF</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10397</th>\n",
" <td>extra_6</td>\n",
" <td>IWM</td>\n",
" <td>NaN</td>\n",
" <td>iShares Russell 2000 ETF</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10398</th>\n",
" <td>extra_7</td>\n",
" <td>VTV</td>\n",
" <td>NaN</td>\n",
" <td>Vanguard Value ETF</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10399</th>\n",
" <td>extra_8</td>\n",
" <td>TLT</td>\n",
" <td>NaN</td>\n",
" <td>iShares 20+ Year Treasury Bond ETF</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" <tr>\n",
" <th>10400</th>\n",
" <td>extra_9</td>\n",
" <td>JNK</td>\n",
" <td>NaN</td>\n",
" <td>SPDR Bloomberg High Yield Bond ETF</td>\n",
" <td>USD</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>10401 rows × 5 columns</p>\n",
"</div>"
],
"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
}