JCN Financial Wiki
Complete reference for the JCN Financial Investment Dashboard β architecture, metrics, data, and methodology.
Overview
What is JCN Financial?
JCN Financial is a production-grade investment dashboard that provides real-time portfolio tracking, deep fundamental stock analysis, and institutional-quality data infrastructure. Built for serious investors who need survivorship-bias-free data, point-in-time accuracy, and comprehensive fundamental screening across the top 1,500 US equities by market capitalization.
The platform manages three distinct investment portfolios (Persistent Value, Olivia Growth, Pure Alpha), each with unique strategies, and offers a full Stock Analysis screener with 10 analytical modules covering price performance, per-share data, quality metrics, financial statements, growth rates, valuation, and composite quality scoring.
Technology Stack
| Layer | Technology | Purpose |
|---|---|---|
| Frontend | Next.js 14, React 18, Tailwind CSS | SSR, routing, responsive UI |
| Charts | ECharts 6.0, Recharts | Interactive charts, radar, line graphs |
| UI Kit | Tremor v3, Radix UI | Dashboard components, accessible primitives |
| Backend | FastAPI (Python) | Serverless API on Vercel |
| Database | MotherDuck (DuckDB cloud) | Analytical warehouse β prices, fundamentals, scores |
| Data | EODHD API | EOD prices, fundamentals, bulk downloads |
| Hosting | Vercel Pro | Serverless deploy, 300s function timeout |
| Caching | SWR, localStorage, /tmp | Multi-layer: browser β serverless β DB |
Architecture
The application follows a serverless architecture deployed on Vercel. The Next.js frontend communicates with Python FastAPI serverless functions via /api/* routes. All market data lives in MotherDuck (cloud DuckDB), organized into production tables under thePROD_EODHD database.
Browser (React)
ββ Next.js SSR / Client
ββ /api/* routes (Vercel Serverless)
ββ FastAPI (Python)
ββ Cache: /tmp (Vercel ephemeral)
ββ MotherDuck (DuckDB Cloud)
ββ PROD_EODHD (production)
ββ DEV_EODHD_DATA (staging)Dashboard Pages
Dashboard (Heatmap + Charts)
The main dashboard page features a full-width TradingView stock market heatmap showing real-time sector and stock performance with color-coded daily percentage changes. Above the heatmap, three equally spaced TradingView Advanced Chart widgets display daily candle charts for SPY (S&P 500), QQQ (Nasdaq 100), and ACWI (All Country World Index) β providing instant macro context. Charts use white backgrounds with volume bars hidden for a clean presentation.
Persistent Value Portfolio
A 21-holding portfolio focused on high-quality, durable compounders with strong competitive moats, consistent free cash flow generation, and long-term capital appreciation. Holdings include ASML, COST, AVGO, MA, FICO, SPGI, V, AAPL, NFLX, and others. Uses SPMO as the benchmark ETF.
Features: real-time performance table with YTD/1Y/3Y/5Y returns, market-cap-weighted allocation pie chart, SPY benchmark comparison with alpha calculation, historical price charts, JCN 5-factor score grid, and quality radar charts. All data loads from MotherDuck with 4-layer cache.
Olivia Growth Portfolio
A 20-holding growth-oriented portfolio emphasizing high-momentum technology and infrastructure names. Holdings include GOOG, AMZN, META, NVDA, AMD, CRWD, PLTR, SHOP, and others. Uses QGRW as the benchmark ETF. Identical architecture to Persistent Value.
Pure Alpha Portfolio
A concentrated 10-holding high-conviction portfolio designed for maximum alpha generation. Holdings: GEV, GOOG, NVDA, TSLA, PWR, AXON, LRCX, MELI, MU, NFLX. Benchmarked directly against SPY.
Stock Analysis Screener
Deep single-stock fundamental analysis page with 10 analytical modules. Limited to the top 1,500 US stocks by current market capitalization. Features smart search with autocomplete, recent search history pills (localStorage, max 10), and animated progress bar.
Default symbol: NVDA (loaded automatically). All modules always visible. Data fetched in a single API call and cached 30 minutes in both browser and server.
| # | Module | Description |
|---|---|---|
| 1 | Stock Info Header | Company name, sector, P/E, Forward P/E, Div Yield, Beta, ROE, Analyst Target |
| 2 | Price vs SPY | 5-year chart indexed to 100. Stock (blue) vs SPY (gray) |
| 3 | Per Share Data | 14 metrics over 10+ years: Revenue/Share, EPS, FCF/Share, Book Value, Yields |
| 4 | Quality Metrics | 17 ratios: Margins, Returns, Leverage, Efficiency |
| 5 | Income Statement | Hierarchical P&L with expandable parent-child rows |
| 6 | Balance Sheet | Assets, Liabilities, Equity with 3-level hierarchy |
| 7 | Cash Flows | Operating, Investing, Financing sub-items. Free Cash Flow. |
| 8 | Growth Rates | YoY growth, 12 metrics, heatmap coloring |
| 9 | Valuation Ratios | 9 valuation metrics + analyst consensus bar |
| 10 | JCN Scores | 6-dimension composite scoring (0-100) with radar chart |
Stock Screener
A FinViz-style stock screener that filters the ~3,000 stock investable universe using preset dropdown filters β no manual value input required. Organized into 7 filter tabs: Descriptive (market cap, sector), JCN Scores (5 factor composites + 8 blend composites), Valuation (P/E, PEG, P/B, P/S, EV/EBITDA, dividend yield), Growth (revenue and earnings growth), Profitability (margins, ROE, ROA), Momentum (daily/YTD/YoY changes, beta, and all AF/FIP/System momentum sub-components), and Fundamentals (debt/equity, current ratio, interest coverage).
Results display in a TanStack Table v8 with full sorting on any column, a column picker to show/hide fields, and CSV export. Right-clicking any cell opens a context menu with three options: Analysis (opens the stock in Stock Analysis in a new tab), Add to Watchlist (saves to localStorage), and Grok (placeholder for future AI analysis). Filter and table state are persisted in sessionStorage so navigating away and back preserves the screener exactly as the user left it.
The screener API (POST /api/screener) uses a dynamic SQL query builder with a whitelisted field map to prevent SQL injection. It JOINs across 8 MotherDuck tables using inline subqueries (not CTEs, which fail on MotherDuck). Results are cached in /tmp with a 5-minute TTL. The API is 100% read-only and never writes to any production table.
Watchlist
A personal watchlist page where users can track stocks of interest. Symbols can be added manually via a ticker input field or from the Screener context menu. The watchlist is stored in localStorage (no database writes required) and syncs across components via a custom watchlist-change event.
The watchlist table displays enriched data fetched from the screener API: company name, sector, market cap, price, daily/YTD/YoY percentage changes, and five JCN factor scores (Value, Quality, Growth, Momentum, JCN Full Composite). Users can sort by any column, remove individual symbols, clear all with a confirmation dialog, export to CSV, or open any symbol in Stock Analysis via a new-tab link. An empty state guides new users to add symbols from the input field or the Screener page.
Data Sync Pipeline
A 4-stage automated data pipeline that ingests daily EOD prices from EODHD, validates data quality, promotes to production, and rebuilds composite scores. Each stage is idempotent and safe to re-run. See the Sync Pipeline section for details.
Market Analysis
A deep-dive into the full investable universe. Shows every stock in the top 1,500 by market cap with all JCN factor scores side-by-side in a single searchable, sortable table. Use this page to screen across the entire market simultaneously β no individual stock lookups needed. See the Sector Analysis Module Guide section for a full breakdown of all the analytical tables on the related Sector Analysis page.
Sector Analysis
The top-down macro analysis hub. Contains 9 modules covering every dimension of sector rotation analysis: fundamental score history over 8 quarters, price momentum via ETF heatmaps and Relative Rotation Graphs, convergence signals that pair fundamental trends with price leadership, and granular breakdowns by GICS industry group. See the Sector Analysis Module Guide section below for a plain-English explanation of every module.
Sector Analysis β Module Guide
The Sector Analysis page is designed around one core question: where are the best risk-adjusted opportunities in the market right now? Each module answers a different dimension of that question. Together they give you a complete top-down view β from broad market health, to which sectors have the best fundamentals, to which sectors have the strongest price momentum, to where fundamentals and price are moving in the same direction.
1. Market Overview Cards
Eight headline numbers summarising the entire investable universe at a glance. These are computed from all ~3,000 stocks in the JCN universe, not just the ones in your portfolio.
- Total Stocks β how many stocks are currently in the investable universe.
- Sectors β number of distinct GICS sectors represented.
- Median Composite β the midpoint JCN composite score across the whole universe. 50 = exactly average. Above 50 = above-average universe quality.
- Median Quality / Momentum / Growth β same median concept per factor.
- Median YTD% β the midpoint year-to-date return across all stocks. Positive = more than half the universe is up for the year.
- % Near 52-Week High β what fraction of stocks are within 10% of their 52-week high. A high reading signals broad market strength.
2. Sector Fundamental Score History β 8 Quarters
Shows how the median JCN scores for each sector have changed over the past two years, broken into calendar quarters. This is the single most important table for identifying whether a sector's fundamentals are getting better or worse over time β not just where they stand today.
How to read it: Each row is a sector. Each column is a quarter (Q2β24 through Q1β26). The cell shows the median score for that quarter. Green cells = strong scores. Red cells = weak scores. Use the score selector buttons at the top right to switch between Composite, Quality, Growth, Momentum, Value, and Financial Strength.
- Trend arrow β computed from a linear regression across all 8 quarters. ββ means the score is rising consistently, ββ means consistently falling, β means flat. The number next to it (e.g. +0.4/Q) is how many points the score is moving per quarter on average.
- 8Q Delta β simple difference between today's score and the score from 8 quarters ago. A large positive number means the sector has meaningfully improved over two years.
- Click to expand β clicking any row opens an ECharts line chart showing all 6 factor scores for that sector across all 8 quarters. This lets you see which specific factors are driving the trend.
What to look for: Sectors showing consistently rising composite scores (β or ββ) with improving quality and growth are accumulating fundamental strength. Sectors showing ββ trends, especially in quality or financial strength, are deteriorating fundamentally regardless of where the stock prices are.
3. Fundamental + Price Momentum Convergence Matrix
This is the highest-value analytical table on the page. It takes the 8-quarter fundamental trend from the history table and pairs it with the price momentum signal from the Relative Rotation Graph (RRG) to generate a single sector-level signal. The idea: the best opportunities come when both fundamentals and price are moving in the same direction.
The four signals:
- CONFIRM β Fundamentals improving AND price is in the Leading or Improving RRG quadrant. Both signals agree. This is the highest-conviction setup β the sector has the wind at its back from both a business quality and market momentum perspective.
- EARLY β Fundamentals improving but price momentum is still lagging or weakening. The business is getting better but the market has not yet priced it in. This is a potential early entry signal β watch for the RRG quadrant to start improving.
- DIVERGE β Fundamentals are deteriorating but price is still strong (Leading or Weakening RRG). The stock prices are running ahead of the business reality. This is a late-cycle risk warning. The price strength may not be sustainable if fundamentals continue to weaken.
- AVOID β Both fundamentals and price momentum are negative. No edge. The sector is in a confirmed downtrend on both dimensions β either reduce exposure or avoid entirely.
The vs Prior Q column shows whether the latest composite score improved or deteriorated vs the previous quarter β useful for spotting turning points in real time. The RS-Ratio column (from the RRG) shows how far above or below 100 the sector is β above 100 = outperforming SPY, below 100 = underperforming SPY.
4. Sector Score Summary
A snapshot of today's median JCN scores for all 11 GICS sectors plus a MARKET row showing the universe median. Each score is a percentile rank from 0β100 against the full ~3,000 stock investable universe. A score of 75 means the median stock in that sector is in the 75th percentile of the universe for that factor. The MARKET row is always pinned at the bottom regardless of sort order.
Click any column header to sort sectors by that score. The table shows: Composite (overall), QARP (Quality at a Reasonable Price), GARP (Growth at a Reasonable Price), QualityΓMomentum, Fortress (balance sheet strength), plus the five individual factor scores.
5. Quintile Distribution
Goes deeper than the median by showing the full spread of scores within each sector. A sector might have a high median but also have extremely wide dispersion β meaning some stocks are exceptional while others are very weak. This table shows Q1 (bottom 20%), Q2, Median, Q4, Q5 (top 80%), Mean, and Standard Deviation.
Why this matters: A tight spread (low Std Dev) means most stocks in the sector score similarly β the sector is homogeneous and a sector-level call is reliable. A wide spread means there is high stock-picking opportunity within the sector β the sector average does not tell the full story.
Use the Metric selector dropdown to switch the table between Composite, Quality, Momentum, Growth, Value, Financial Strength, ROIC, Gross Margin, Net Debt/EBITDA, QualityΓMomentum, and Fortress.
6. Sector Momentum Dashboard
A detailed breakdown of price momentum strength per sector, going well beyond a simple YTD return. Each column measures a different dimension of how prices are trending.
- Momentum Score β the JCN composite momentum score (percentile vs universe).
- AF Composite β Absolute/FIP momentum composite. Measures raw return strength across multiple lookback periods (3M, 6M, 9M, 12M).
- FIP 12M β Frog-in-the-Pan score. Measures the quality of the price path, not just the end return. A high FIP means returns were earned smoothly in small increments (strong trend). A low FIP means gains came in a few large jumps (weaker trend quality).
- System Score β trend linearity. How straight and consistent the price trend has been over 5 years.
- % Pos YTD β what fraction of stocks in the sector are up year-to-date. Above 50% = broad sector advance, not just a few large caps pulling up the average.
- % Above 50% Range β what fraction of stocks are in the upper half of their 52-week trading range.
- % Near 52-Week High β what fraction of stocks are within 10% of their 52-week high. A high reading = sector is broadly strong.
- Median YTD% / Median 1Yr% β actual return figures for context.
7. Industry Group Tables
Three tables mirroring the sector Score Summary, Quintile Distribution, and Momentum Dashboard β but broken down to the GICS industry group level rather than the broader sector. Industries with fewer than 5 stocks are excluded. This is useful for identifying pockets of strength or weakness within a sector. For example, within Financials: Banks may be Leading while Insurance is Lagging.
All three tables have a Sector column so you can quickly see which parent sector each industry belongs to, and sort across the full industry universe by any score or momentum metric.
8. ETF Rotation Heatmaps
Three side-by-side heatmap tables showing actual ETF price returns for sector, industry, and factor ETFs. Unlike the JCN scores which measure fundamental quality, these tables measure what the market is doing with its money right now. Columns are return periods: 1W, 1M, 3M, 6M, YTD, 1Y, 3Y, 5Y.
Color coding: Deep green = strong positive return. Deep red = strong negative return. The intensity of the color scales with the magnitude β you can immediately see at a glance which sectors and time periods are hot or cold.
Absolute vs vs SPY toggle: Switch between viewing raw returns (e.g. XLK up +12% YTD) and relative returns vs the S&P 500 (e.g. XLK up +5% vs SPY YTD). The vs SPY view shows you which sectors are actually beating the benchmark β important because in a rising market everything looks green.
Acceleration/Deceleration badge: Each ETF row shows either β Accel or β Decel. This compares the average of short-term returns (1W + 1M) against the average of long-term returns (3M + 6M). If recent returns are faster than the longer-term average, momentum is accelerating. If recent returns are slower, momentum is decelerating. The number next to the badge (e.g. +3.9pp) shows by how much in percentage points.
- Sector ETF Rotation β the 11 SPDR XL sector ETFs (XLK, XLV, XLF, XLY, XLP, XLE, XLI, XLB, XLU, XLRE, XLC) plus SPY, QQQ, and IWM benchmarks pinned at the bottom.
- Industry ETF Deep Dive β 35 sub-sector ETFs including SOXX (Semiconductors), IBB (Biotech), KBE (Banks), OIH (Oil Services), GLD (Gold), JETS (Airlines), and many more, each tagged with its parent sector.
- Factor ETF Rotation β 30 ETFs grouped by factor style: Momentum (MTUM, QMOM), Quality (QUAL, SPHQ), Value (VLUE, IWD, VTV), Growth (IWF, VUG), Low Volatility (USMV, SPLV), Dividend (SCHD, VYM, HDV), Small Cap (IWM, IJR, VBR), Multi-Factor (GSLC, JPUS). This table tells you which investment style the market is currently rewarding.
RS Rank β each ETF is ranked 1 (strongest) to last within its group by YTD return. In vs SPY mode the rank switches to SPY-relative YTD. The top 3 ranks are highlighted in green.
9. Relative Rotation Graph (RRG)
Created by Julius de Kempenaer, the RRG is a scatter plot that shows all 11 GICS sector ETFs in a single view, making sector rotation immediately visible. Each dot represents a sector. The dot's position tells you two things at once: how it's performing relative to SPY (x-axis) and whether that relative performance is getting stronger or weaker (y-axis). The trail behind each dot shows the path it traveled over the selected time period.
The two axes:
- X-axis β RS-Ratio: Is this sector beating SPY right now? Above 100 = outperforming SPY. Below 100 = underperforming. The further right, the stronger the outperformance.
- Y-axis β RS-Momentum: Is the outperformance getting bigger or smaller? Above 100 = the relative performance is accelerating. Below 100 = it's fading. The further up, the stronger the acceleration.
The four quadrants:
- Leading (top-right, green) β beating SPY and the outperformance is still accelerating. This is where you want to be overweight. The sector has both a strong trend AND strong momentum behind that trend.
- Weakening (bottom-right, yellow) β still beating SPY but the outperformance is starting to fade. The trend is intact but momentum is turning. Watch closely β it may rotate to Lagging soon.
- Lagging (bottom-left, red) β underperforming SPY and the gap is getting worse. Avoid or underweight. Unless you have a specific contrarian thesis, there is no edge here.
- Improving (top-left, blue) β still underperforming SPY but momentum is turning positive. This is the early recovery signal. The sector is still in a relative downtrend but the rate of deterioration is slowing and reversing. Watch for a cross into Leading.
The clockwise rotation: Sectors naturally move through quadrants in a clockwise direction over a full cycle: Leading β Weakening β Lagging β Improving β Leading. The trail length shows how far a sector has traveled. A long trail = high velocity (the sector is rotating quickly). A short trail = low velocity (stable position).
Trail length toggle: 3M (13 weekly points), 6M (26 points), or 1Y (52 points). All three are pre-loaded β switching is instant with no additional data fetch. The 6M view is usually the most useful for identifying current rotation trends without too much noise.
How it's calculated: Uses weekly adjusted-close prices for all 11 XL sector ETFs vs SPY. RS-Ratio is computed as the normalized ratio of a 10-week EMA to a 40-week EMA of the price-relative (ETF/SPY). RS-Momentum is the rate of change of RS-Ratio over 4 weeks, also normalized. Both axes are scaled so that 100 = exactly in line with SPY and the standard deviation is approximately 10 points, making sectors comparable on the same scale.
Using RRG with the Convergence Matrix: The RRG quadrant is one of the two inputs to the Convergence Matrix signal. When you see a sector moving from Improving into Leading on the RRG while the Fundamental History table shows a rising composite score trend, the Convergence Matrix will generate a CONFIRM signal β both dimensions aligned.
Portfolio Metrics
Performance Table
Each portfolio page displays a performance table showing every holding with current price, daily change, and period returns. Prices come from EODHD real-time API (15-min delayed) or MotherDuck historical data.
| Metric | Formula | Description |
|---|---|---|
| Current Price | EODHD real-time or latest adjusted_close | Most recent price, 15-min delayed max |
| Daily Change % | (close_today - close_yesterday) / close_yesterday * 100 | Percentage move from prior close |
| YTD Return | (price_now - price_jan1) / price_jan1 * 100 | Year-to-date total return |
| 1Y Return | (price_now - price_1yr_ago) / price_1yr_ago * 100 | Trailing 12-month return |
| 3Y Return | (price_now - price_3yr_ago) / price_3yr_ago * 100 | Trailing 3-year cumulative return |
| 5Y Return | (price_now - price_5yr_ago) / price_5yr_ago * 100 | Trailing 5-year cumulative return |
Allocation
Portfolio allocation is displayed as a pie chart, categorized by market cap tier: Mega Cap (above $200B), Large Cap ($10B-$200B), Mid Cap ($2B-$10B), Small Cap (below $2B), and ETF. Allocation weights are equal-weight by default.
Benchmarks and Alpha
Each portfolio is benchmarked against SPY (S&P 500 ETF) and a portfolio-specific ETF. Alpha is calculated as the excess return of the portfolio over SPY for each time period.
Alpha Calculation
Alpha = Portfolio Return - SPY Return
Calculated for YTD, 1Y, 3Y, and 5Y periods. Positive alpha indicates outperformance.
JCN Factor Scores
Each stock in a portfolio receives five composite factor scores (0-100), computed monthly from fundamental data and stored in dedicated score tables in MotherDuck. These scores power the radar charts and fundamentals grid on each portfolio page.
| Score | DB Column | Methodology |
|---|---|---|
| Value Score | value_score_composite | Ranks stocks by valuation attractiveness. Combines P/E, P/B, P/S, EV/EBITDA, and FCF yield relative to sector peers. Lower valuations score higher. |
| Quality Score | quality_score_composite | Measures business quality via gross margin stability, ROE consistency, earnings quality (accruals), and balance sheet strength. |
| Growth Score | growth_score_composite | Evaluates revenue growth, earnings growth, and forward estimates. Combines trailing 3Y CAGR with analyst consensus forward growth. |
| Financial Strength | finstr_score_composite | Assesses balance sheet health: current ratio, debt-to-equity, interest coverage, Altman Z-score components, and cash flow adequacy. |
| Momentum Score | momentum_score_composite | Price momentum signal based on 12-1 month return (skip most recent month). Captures intermediate-term trend persistence. |
Score Normalization
score = round((clamped_value - low) / (high - low) * 100)
Each raw metric is clamped to [low, high] bounds, then linearly scaled to 0-100. A score of 50 indicates median performance.
Stock Analysis Metrics
Every metric displayed in the Stock Analysis screener is computed server-side from PROD_EOD_Fundamentals quarterly data, aggregated into annual figures. P&L and Cash Flow items are summed across quarters; Balance Sheet items use the latest quarter in each calendar year.
Per Share Data (Module 3)
Annual per-share metrics calculated by dividing aggregate financials by shares outstanding. Shares use bs_commonStockSharesOutstanding (quarterly historical), falling back to shares_outstanding (snapshot) if unavailable.
| Metric | Formula | Description |
|---|---|---|
| Revenue/Share | is_totalRevenue / shares | Total annual revenue divided by shares outstanding |
| EPS | is_netIncome / shares | Earnings per share β net income allocated to each share |
| FCF/Share | cf_freeCashFlow / shares | Free cash flow per share β cash available after capex |
| EBITDA/Share | is_ebitda / shares | Earnings before interest, taxes, depreciation, amortization per share |
| Book Value/Share | bs_totalStockholderEquity / shares | Net asset value per share (equity / shares) |
| Operating CF/Share | cf_totalCashFromOperatingActivities / shares | Cash from operations per share |
| Dividend/Share | -cf_dividendsPaid / shares | Annual dividend paid per share (dividends are negative in cash flow) |
| Buyback Yield | -cf_salePurchaseOfStock / market_cap | Share repurchases as a percentage of market cap |
| Dividend Yield | -cf_dividendsPaid / market_cap | Annual dividends as a percentage of market cap |
| Total Return Yield | (-dividends + -buybacks) / market_cap | Combined shareholder yield from dividends and buybacks |
| Shares Outstanding | bs_commonStockSharesOutstanding / 1M | Total shares outstanding in millions |
| Revenue ($M) | is_totalRevenue / 1M | Total annual revenue in millions |
| Net Income ($M) | is_netIncome / 1M | Total annual net income in millions |
| Free Cash Flow ($M) | cf_freeCashFlow / 1M | Annual free cash flow in millions |
Quality Metrics (Module 4)
Annual quality ratios measuring profitability, returns on capital, leverage, and operational efficiency. All computed from aggregated annual data.
| Metric | Formula | Description |
|---|---|---|
| Gross Margin | is_grossProfit / is_totalRevenue | Revenue retained after cost of goods sold. Higher = stronger pricing power. |
| Operating Margin | is_operatingIncome / is_totalRevenue | Profitability from core operations after operating expenses. |
| Net Margin | is_netIncome / is_totalRevenue | Bottom-line profitability after all expenses, interest, and taxes. |
| EBITDA Margin | is_ebitda / is_totalRevenue | Cash earnings margin before non-cash charges and financing. |
| FCF Margin | cf_freeCashFlow / is_totalRevenue | Free cash flow as percentage of revenue. Measures cash conversion. |
| ROIC | is_netIncome / (equity + longTermDebt) | Return on invested capital. Measures efficiency of capital allocation. |
| ROE | is_netIncome / bs_totalStockholderEquity | Return on equity. Profit generated per dollar of shareholder equity. |
| ROA | is_netIncome / bs_totalAssets | Return on assets. Profit generated per dollar of total assets. |
| ROCE | is_operatingIncome / (equity + longTermDebt) | Return on capital employed. Operating profit on invested capital. |
| Debt/Equity | bs_totalLiab / bs_totalStockholderEquity | Total leverage ratio. Higher = more leveraged balance sheet. |
| LT Debt/Equity | bs_longTermDebt / bs_totalStockholderEquity | Long-term debt leverage. Excludes short-term obligations. |
| Current Ratio | bs_totalCurrentAssets / bs_totalCurrentLiabilities | Short-term liquidity. Above 1.0 = can cover near-term obligations. |
| Interest Coverage | is_operatingIncome / is_interestExpense | Ability to service debt. Higher = more comfortable debt burden. |
| Asset Turnover | is_totalRevenue / bs_totalAssets | Revenue generated per dollar of assets. Measures asset efficiency. |
| CapEx/Revenue | abs(cf_capitalExpenditures) / is_totalRevenue | Capital intensity. How much revenue is reinvested in fixed assets. |
| FCF Conversion | cf_freeCashFlow / is_netIncome | How much net income converts to free cash flow. Above 1.0 = high quality. |
| Cash Conversion | cf_operatingCashFlow / is_netIncome | Operating cash flow relative to reported earnings. Earnings quality check. |
Financial Statements (Modules 5-7)
Income Statement, Balance Sheet, and Cash Flows are displayed as hierarchical tables with expandable parent-child rows. All values are shown in millions ($M). Quarterly data is aggregated into annual: P&L and Cash Flow items are summed, Balance Sheet items use the latest quarter.
Revenue
β Cost of Revenue
Gross Profit
Operating Expenses
β R&D
β SG&A
β D&A
Operating Income
Interest Expense
Income Before Tax
Income Tax
EBITDA
Net IncomeTotal Assets
β Current Assets
β β Cash & Equivalents
β β Short-Term Investments
β β Net Receivables
β β Inventory
β Non-Current Assets
β PP&E
β Goodwill
β Intangibles
β Long-Term Investments
Total Liabilities
β Current Liabilities
β β Accounts Payable
β β Short-Term Debt
β Non-Current Liabilities
β Long-Term Debt
Stockholder Equity
β Common Stock
β Retained Earnings
β Treasury Stock
Net Debt
Shares OutstandingOperating Cash Flow
β Net Income
β D&A
β Stock-Based Comp
β Working Capital Changes
Investing Cash Flow
β Capital Expenditures
β Investments
Financing Cash Flow
β Dividends Paid
β Share Buybacks/Issuance
β Net Borrowings
Free Cash Flow
Net Change in CashGrowth Rates (Module 8)
Year-over-year growth rates for 12 key financial metrics. Computed as percentage change from the prior year. Displayed with heatmap coloring: deep green for high growth, red for contraction, gray for null.
YoY Growth Rate
growth_pct = (current_year - prior_year) / abs(prior_year) * 100
Null if either year is missing or prior year is zero. Absolute value in denominator handles negative base values.
Tracked metrics: Revenue, Gross Profit, Operating Income, EBITDA, Net Income, EPS, Free Cash Flow, Operating Cash Flow, Total Assets, Stockholder Equity, Long-Term Debt, Dividends Paid.
Valuation Ratios (Module 9)
Current snapshot valuation multiples from EODHD. These are point-in-time values (not historical per quarter) and represent the latest available data for each stock.
| Metric | Formula | Description |
|---|---|---|
| P/E Ratio | price / EPS (trailing) | Price relative to trailing 12-month earnings |
| Forward P/E | price / forward EPS estimate | Price relative to consensus forward earnings estimate |
| PEG Ratio | P/E / earnings growth rate | P/E adjusted for growth. Below 1.0 suggests undervaluation relative to growth. |
| Price/Book | price / book value per share | Market price relative to net asset value. Below 1.0 = trading below book. |
| Price/Sales | market_cap / revenue_ttm | Market cap relative to trailing revenue. Lower = cheaper on revenue basis. |
| EV/EBITDA | enterprise_value / ebitda | Enterprise value per unit of operating cash earnings. Standard M&A metric. |
| EV/Revenue | enterprise_value / revenue_ttm | Enterprise value per unit of revenue. Capital-structure-neutral valuation. |
| Trailing P/E | price / trailing EPS | Price to trailing earnings (may differ from standard P/E by data source). |
| Dividend Yield | annual_dividend / price | Annual dividend as percentage of current share price. |
JCN Factor Scores (Module 10)
Five precomputed composite factor scores fetched from PROD score tables (computed monthly). Each score is 0-100. The JCN Composite is the simple average of all five factor scores. Displayed as score cards and a 5-axis radar chart.
| Score | Source Table | What it Measures |
|---|---|---|
| Value | PROD_OBQ_Value_Scores | Ranks stocks by valuation attractiveness (P/E, P/B, EV/EBITDA, etc.) |
| Quality | PROD_OBQ_Quality_Scores | Business quality via margins, ROE, earnings stability |
| Financial Strength | PROD_OBQ_FinStr_Scores | Balance sheet health, debt coverage, liquidity |
| Growth | PROD_OBQ_Growth_Scores | Revenue growth, earnings growth, forward estimates |
| Momentum | PROD_OBQ_Momentum_Scores | Price momentum signal based on relative strength |
| JCN Composite | Average of all 5 | Overall factor score = (V + Q + FS + G + M) / 5 |
JCN Composite Score
jcn_composite = (value + quality + financial_strength + growth + momentum) / 5
Each factor score is precomputed monthly from fundamental data and stored in PROD score tables (PROD_OBQ_*_Scores). The JCN Composite is the simple average of all five.
JCN Score Methodology
The JCN scoring system evaluates every stock in the investable universe across five fundamental dimensions: Value, Quality, Growth, Financial Strength, and Momentum. Each factor is computed monthly using a proprietary 3-way scoring system that combines cross-sectional, sector-relative, and historical self-relative rankings. The five individual scores are then blended into eight composite presets for different investment strategies.
Investable Universe
Scores are computed only for stocks in the JCN Investable Universe β the top 3,000 US equities by market capitalization, reconstituted annually on the last trading day of May. This mirrors the Russell 3000 reconstitution methodology used by FTSE Russell.
| Parameter | Value |
|---|---|
| Universe Size | Top 3,000 by market cap |
| Rank Day | Last trading day of May each year |
| Effective Period | July 1 through June 30 of the following year |
| DQ Filters | Market cap $10M - $5T, adjusted close $0.01 - $500K |
| Pre-2003 Handling | All available stocks scored (no universe filter) |
| Table | PROD_OBQ_Investable_Universe (67,528 rows, 2003-2025) |
3-Way Scoring System
Each of the five factor scores uses three independent scoring dimensions, combined into a single composite. This multi-lens approach prevents a stock from scoring well simply because its entire sector is cheap or because it happens to be in a historically low-quality industry.
Composite Formula
composite = Universe Score (40%) + Sector Score (40%) + History Score (20%)
All three dimensions use PERCENT_RANK() to produce 0-100 scores. The composite is a weighted average of the three.
| Dimension | Weight | Description |
|---|---|---|
| Universe | 40% | Cross-sectional percentile rank vs. all ~3,000 stocks in the same month. A stock scoring 90 is in the top 10% of the entire investable universe. |
| Sector | 40% | Same percentile rank but within GICS sector peers only (minimum 3 peers). Captures relative standing within an industry β is this tech stock cheap vs. other tech stocks? |
| History | 20% | Percentile rank against the stock's own 8+ quarter history (rolling window). Is this stock cheap relative to its own historical norms? |
Fallback rules: if a sector has fewer than 3 peers, weights shift to Universe 60% + History 40%. If historical data has fewer than 8 quarters, weights shift to Universe 50% + Sector 50%.
Value Score
Measures how attractively priced a stock is relative to its fundamentals. Lower valuation ratios produce higher scores (inverted ranking). The weighting emphasizes cash-flow-based measures over accounting earnings.
| Metric | Weight | Direction | Description |
|---|---|---|---|
| P/FCF (TTM) | 30% | Lower is better | Price to Free Cash Flow. Cash yield to shareholders β hardest metric to manipulate. |
| EV/EBITDA (TTM) | 25% | Lower is better | Enterprise value to operating earnings. Capital-structure-neutral. Standard M&A metric. |
| P/E (TTM) | 20% | Lower is better | Price to trailing earnings. The classic valuation metric, included for universality. |
| P/S (TTM) | 15% | Lower is better | Price to sales. Useful for pre-profit or cyclically depressed companies. |
| P/B (MRQ) | 10% | Lower is better | Price to book value. Asset-based valuation floor, most relevant for financials and industrials. |
P/FCF receives the highest weight because free cash flow is the purest measure of economic value available to shareholders. Unlike earnings, FCF is difficult to inflate through accounting choices. EV/EBITDA is capital-structure-neutral, allowing fair comparison between levered and unlevered firms β the standard metric in M&A valuation. P/E is included for universality but downweighted due to susceptibility to one-time charges and accounting distortions. The value factor draws directly from the HML (High Minus Low) factor identified by Fama & French (1992).
Quality Score
Measures business quality through profitability, capital efficiency, and earnings reliability. Higher values indicate better quality. The weighting emphasizes asset-level profitability measures that academic research has shown to be the most predictive of future returns.
| Metric | Weight | Description |
|---|---|---|
| Gross Profitability (GPA) | 20% | Gross Profit / Total Assets. The Novy-Marx (2013) quality factor β shown to be as powerful as book-to-market in predicting returns. |
| ROIC | 20% | Return on Invested Capital. Net Income / (Equity + Long-Term Debt). Measures how efficiently management allocates capital. |
| ROA | 15% | Return on Assets. Asset-level profitability, independent of capital structure. |
| FCF Margin | 15% | Free Cash Flow / Revenue. How much revenue converts to actual cash available to shareholders. |
| Gross Margin | 10% | Pricing power and cost structure durability. |
| Operating Margin | 10% | Core business profitability after operating expenses. |
| Earnings Quality | 10% | (Operating CF - Net Income) / Total Assets. Detects accrual manipulation β companies where reported earnings exceed actual cash flows score lower. |
The Earnings Quality metric is a Sloan (1996) accruals-based signal: companies where cash flow consistently trails reported earnings tend to have lower future returns, as the accrual component eventually reverses. GPA at 20% weight follows Novy-Marx (2013), who showed gross profitability scaled by assets has strong return-predictive power and is negatively correlated with value β making it an excellent complement in a multi-factor model.
Growth Score
Measures multi-period earnings, revenue, and cash flow growth using blended compound annual growth rates (CAGRs). Equal-weighted across four per-share growth metrics, each blending three lookback periods to balance recent acceleration with durable compounding.
| Metric | Weight | Description |
|---|---|---|
| Revenue/Share Growth | 25% | Top-line growth on a per-share basis. Adjusts for dilution from share issuance. |
| EPS Growth | 25% | Earnings per share growth. Bottom-line compounding. |
| FCF/Share Growth | 25% | Free cash flow per share growth. Cash-based confirmation of earnings growth. |
| Equity/Share Growth | 25% | Book value per share growth. Equity compounding, a proxy for intrinsic value accumulation. |
Period Blending
Blended = 1Y CAGR (40%) + 3Y CAGR (35%) + 5Y CAGR (25%)
Emphasizes recent acceleration while rewarding durable multi-year compounders. Growth rates are winsorized at +/-200% to prevent outliers from distorting rankings.
All growth metrics are computed on a per-share basis to penalize companies that grow revenue by diluting shareholders through stock issuance. The per-share normalization ensures that only genuine organic growth (or efficient capital deployment) is rewarded.
Financial Strength Score
Measures balance sheet health, debt serviceability, and liquidity. Equal-weighted across six metrics covering both stock measures (balance sheet ratios) and flow measures (coverage ratios). Draws from Altman Z-score principles (Altman, 1968) and Piotroski F-score methodology (Piotroski, 2000).
| Metric | Weight | Direction | Description |
|---|---|---|---|
| Interest Coverage | 16.7% | Higher is better | Operating Income / Interest Expense. Can the company comfortably service its debt? |
| FCF / Debt | 16.7% | Higher is better | Free Cash Flow / Total Debt. How quickly could the company repay all debt from cash flow? |
| Net Debt / EBITDA | 16.7% | Lower is better | Net leverage ratio. Years to repay net debt from operating earnings. Below 2x is healthy. |
| Debt / Assets | 16.7% | Lower is better | Total leverage ratio. What fraction of total assets is financed by debt? |
| Cash / Assets | 16.7% | Higher is better | Liquidity buffer as a fraction of total assets. |
| Working Capital / Assets | 16.7% | Higher is better | Short-term financial cushion. Positive working capital = current assets exceed current liabilities. |
Equal weighting ensures no single dimension (leverage, liquidity, or coverage) dominates the score. The mix captures both point-in-time balance sheet health and ongoing cash flow adequacy. Companies with zero debt naturally score high on debt-related metrics but still need strong liquidity and working capital to score well overall.
Momentum Score
Measures price trend strength and persistence from weekly return data. Unlike the other four factor scores which use monthly fundamental data, Momentum is computed weekly from adjusted closing prices.
| Component | Weight | Description |
|---|---|---|
| AF Momentum | ~40% | Average of 3-month, 6-month, and 12-month cumulative returns. Captures intermediate-term trend persistence. Based on the classic Jegadeesh & Titman (1993) momentum factor. |
| FIP Score | ~40% | 180-day directional price strength. Measures sustained trending behavior with less noise than raw returns by filtering short-term reversals. |
| SystemScore | ~20% | 5-year avg annual return multiplied by R-cubed (cube of R-squared to 5-year trend line). Rewards strong AND consistent long-term trends. The R-cubed term aggressively penalizes high-return stocks with erratic paths. |
SystemScore
SystemScore = (5yr_avg_annual_return) * (R_squared ^ 3)
R-squared measures how well the stock's price fits a linear trend. Cubing it means a stock with RΒ²=0.5 retains only 12.5% of its return contribution, while RΒ²=0.9 retains 72.9%. This heavily rewards smooth, consistent uptrends.
Weights are conditional: if a component is unavailable for a stock (e.g., less than 5 years of data for SystemScore), remaining component weights are re-normalized. The momentum score also uses the 3-way scoring system (Universe 40% + Sector 40% + History 20%) for the final composite.
Composite Blends
Eight pre-configured factor blend presets are stored in PROD_JCN_Composite_Scores. Each is a weighted average of the five individual factor composite scores. When a factor is unavailable for a given stock, the remaining factor weights are re-normalized so they still sum to 100%.
Re-normalization
blend_score = SUM(weight_i * factor_i) / SUM(weight_i for non-null factors)
If a stock has 4 of 5 factors, the weights of the available factors are scaled up proportionally.
| Preset | Column | Formula | Use Case |
|---|---|---|---|
| Full OBQ Composite | jcn_full_composite | V:20 + Q:20 + G:20 + M:20 + FS:20 | Balanced all-factor exposure. No single factor dominates. |
| QARP | jcn_qarp | Q:40 + V:40 + M:20 | Quality at Reasonable Price. Buffett-style quality-value investing with trend confirmation. |
| GARP | jcn_garp | G:40 + V:40 + M:20 | Growth at Reasonable Price. Peter Lynch-style growth-value blend. |
| Quality + Momentum | jcn_quality_momentum | Q:50 + M:50 | High-quality businesses in uptrends. Avoids value traps by requiring momentum confirmation. |
| Value + Momentum | jcn_value_momentum | V:50 + M:50 | Deep value with trend confirmation. Avoids catching falling knives. |
| Growth + Quality + Momentum | jcn_growth_quality_momentum | G:34 + Q:33 + M:33 | Growth compounders with quality and momentum filter. Screens for the best growth stories. |
| Fortress | jcn_fortress | Q:40 + FS:40 + V:20 | Defensive. Strong balance sheet + high quality + reasonable price. Best for risk-off periods. |
| Alpha Trifecta | jcn_alpha_trifecta | V:34 + Q:33 + M:33 | The classic academic three-factor alpha blend: value + quality + momentum. |
References
The JCN scoring methodology draws from decades of peer-reviewed financial economics research. Key references:
Value Factor: Fama, E.F. & French, K.R. (1992). "The Cross-Section of Expected Stock Returns." Journal of Finance, 47(2), 427-465.
Quality / Profitability: Novy-Marx, R. (2013). "The Other Side of Value: The Gross Profitability Premium." Journal of Financial Economics, 108(1), 1-28.
Momentum: Jegadeesh, N. & Titman, S. (1993). "Returns to Buying Winners and Selling Losers: Implications for Stock Market Efficiency." Journal of Finance, 48(1), 65-91.
Financial Distress: Altman, E.I. (1968). "Financial Ratios, Discriminant Analysis and the Prediction of Corporate Bankruptcy." Journal of Finance, 23(4), 589-609.
F-Score: Piotroski, J.D. (2000). "Value Investing: The Use of Historical Financial Statement Information to Separate Winners from Losers." Journal of Accounting Research, 38, 1-41.
Accruals Anomaly: Sloan, R.G. (1996). "Do Stock Prices Fully Reflect Information in Accruals and Cash Flows About Future Earnings?" The Accounting Review, 71(3), 289-315.
Five-Factor Model: Fama, E.F. & French, K.R. (2015). "A Five-Factor Asset Pricing Model." Journal of Financial Economics, 116(1), 1-22.
Russell 3000 Methodology: FTSE Russell (2024). "Russell U.S. Equity Indexes: Construction and Methodology." ftserussell.com.
Database & Schema
MotherDuck
MotherDuck is a cloud-hosted DuckDB service that provides the analytical warehouse for all JCN data. Single-writer architecture (concurrent writes fail silently). Connection via MOTHERDUCK_TOKEN environment variable. All symbols stored in TICKER.US format (e.g., AAPL.US).
-- Connection pattern
conn = duckdb.connect(f'md:?motherduck_token={token}')
-- Database layout
PROD_EODHD.main.* -- Production tables (read by dashboard)
DEV_EODHD_DATA.main.* -- Staging tables (written by sync pipeline)PROD_EOD_survivorship
The primary price table. Contains daily OHLC + adjusted_close for all US common stocks and ADRs, including delisted symbols (survivorship-bias free). Over 121 million rows. Zone-map optimized by (date, symbol).
| Column | Type | Description |
|---|---|---|
| symbol | VARCHAR | Ticker in TICKER.US format (e.g., AAPL.US) |
| date | DATE | Trading date |
| open | DOUBLE | Opening price |
| high | DOUBLE | Intraday high |
| low | DOUBLE | Intraday low |
| close | DOUBLE | Raw closing price (NOT used for analysis) |
| adjusted_close | DOUBLE | Split/dividend-adjusted close (PRIMARY price field) |
| isin | VARCHAR | International Securities Identification Number |
| in_sp500 | BOOLEAN | Current S&P 500 membership |
| gics_sector | VARCHAR | GICS sector classification |
| industry | VARCHAR | Industry sub-classification |
| market_cap | DOUBLE | Latest market capitalization in USD |
| listing_date | DATE | IPO / listing date |
| delisting_date | DATE | Delisting date (NULL if still active) |
| is_active | BOOLEAN | TRUE if currently trading |
| instrument_type | VARCHAR | Common Stock, ADR, etc. |
PROD_EOD_ETFs
Daily OHLC + adjusted_close for ETFs. SPY.US is the primary benchmark. Same structure as survivorship but without survivorship metadata columns.
| Column | Type | Description |
|---|---|---|
| symbol | VARCHAR | ETF ticker in TICKER.US format (e.g., SPY.US) |
| date | DATE | Trading date |
| open | DOUBLE | Opening price |
| high | DOUBLE | Intraday high |
| low | DOUBLE | Intraday low |
| close | DOUBLE | Raw closing price |
| adjusted_close | DOUBLE | Adjusted close (PRIMARY) |
| isin | VARCHAR | ISIN identifier |
PROD_EOD_Fundamentals
Quarterly fundamental data for all US stocks. 196 columns covering income statement (is_*), balance sheet (bs_*), cash flow (cf_*), valuation snapshots, analyst estimates, and company metadata. Over 160 quarters of history for major stocks.
| Column Group | Prefix | Aggregation | Key Columns |
|---|---|---|---|
| Identity | symbol, date, filing_date | N/A | symbol (VARCHAR), date (quarter end), filing_date (SEC filing date) |
| Company Info | company_name, sector, industry | Latest | sector, industry, gic_sector, gic_industry, exchange |
| Income Statement | is_* | SUM across quarters | is_totalRevenue, is_grossProfit, is_operatingIncome, is_ebitda, is_netIncome |
| Balance Sheet | bs_* | Latest quarter in year | bs_totalAssets, bs_totalLiab, bs_totalStockholderEquity, bs_cash, bs_longTermDebt |
| Cash Flow | cf_* | SUM across quarters | cf_totalCashFromOperatingActivities, cf_capitalExpenditures, cf_freeCashFlow |
| Valuation (snapshot) | pe_ratio, forward_pe, ... | Latest (overwritten) | market_cap, pe_ratio, forward_pe, peg_ratio, enterprise_value, dividend_yield |
| Analyst | analyst_* | Latest (overwritten) | analyst_target_price, analyst_buy, analyst_hold, analyst_sell, analyst_rating |
| Shares | shares_outstanding, bs_common... | Latest / Historical | shares_outstanding (snapshot), bs_commonStockSharesOutstanding (per quarter) |
Important: Valuation fields (market_cap, pe_ratio, etc.) are SNAPSHOT values β identical across all quarters for a given symbol. They represent the CURRENT latest value, not historical. Only financial statement columns (is_*, bs_*, cf_*) contain true historical quarterly data.
Score Tables
Five separate score tables, each containing monthly composite scores per symbol. Rebuilt during Stage 3 of the sync pipeline. Used by portfolio pages for the JCN 5-factor score grid and radar charts.
| Table | Score Column | Key Columns |
|---|---|---|
| PROD_OBQ_Value_Scores | value_score_composite | symbol, month_date, value_score_composite |
| PROD_OBQ_Quality_Scores | quality_score_composite | symbol, month_date, quality_score_composite |
| PROD_OBQ_Growth_Scores | growth_score_composite | symbol, month_date, growth_score_composite |
| PROD_OBQ_FinStr_Scores | finstr_score_composite | symbol, month_date, finstr_score_composite |
| PROD_OBQ_Momentum_Scores | momentum_score_composite | symbol, month_date, momentum_score_composite |
SYNC_STATE & SYNC_LOG
SYNC_STATE stores the current state of each sync stage (last run timestamp, status, cursor position for resumable operations). SYNC_LOG records every sync run with timing, row counts, and error details. Both tables enable the Prime Directive PD-08 (cursor persistence) and provide audit trail.
EODHD API
API Overview
EODHD (End of Day Historical Data) is the primary external data provider for JCN Financial. It supplies daily end-of-day prices, quarterly fundamentals, and company metadata for all US-listed securities including common stocks, ADRs, and ETFs. Data is point-in-time accurate using SEC filing dates.
Endpoints Used
| Endpoint | Used In | Purpose |
|---|---|---|
| /api/eod-bulk-last-day/US | Stage 1 (Ingest) | Bulk download of latest EOD prices for all US symbols in a single API call |
| /api/real-time/[symbol].US | Live Prices | 15-min delayed real-time quotes for portfolio current prices |
| /api/fundamentals/[symbol].US | Fundamentals Sync | Quarterly financial statements, valuation, analyst data |
Rate Limits
EODHD enforces rate limits of 1,000 API calls per minute and 100,000 calls per day. The sync pipeline uses bulk endpoints to minimize call count. Real-time price fetches for portfolios are throttled to one refresh per 15 minutes (client-side localStorage cache) and only trigger on manual refresh button click or TTL expiry.
Rate Limiter
delay = max(0.06s per call, 60ms between requests)
Enforced via RateLimiter class. API key stored as Vercel environment variable EODHD_API_KEY, never in source code.
Data Sync Pipeline
The sync pipeline is a 4-stage process that maintains the production database. Each stage is independently runnable, idempotent, and designed to operate within Vercel Pro 300-second function timeout (280s budget with 20s safety buffer).
Stage 0: Health Check (diagnostics)
β
Stage 1: Ingest (EODHD β DEV)
β
Stage 2: Validate & Promote (DEV β PROD)
β
Stage 3: Score Rebuild (recompute composites)Stage 0: Health Check
Runs 8 diagnostic checks before any sync operation: (1) MotherDuck connectivity, (2) EODHD API key validation, (3) Required tables existence with estimated row counts, (4) Last sync timestamp from SYNC_STATE, (5) Symbol format consistency (PD-03 β all must be TICKER.US), (6) Fundamentals coverage ratio, (7) Gap analysis (latest date vs today), (8) Duplicate detection in last 7 days. Uses sampled queries and LIMIT 1 patterns for speed. Results cached 5 minutes.
Stage 1: Ingest
Downloads daily EOD prices for all US symbols via EODHD bulk endpoint (/api/eod-bulk-last-day/US). Separates stocks from ETFs based on exchange code. Validates inline (filters out mutual funds, OTC, warrants per PD-06). Writes to DEV_EODHD_DATA staging tables. Idempotent β skips dates already ingested. Tracks cursor in SYNC_STATE for resumability.
Stage 2: Validate & Promote
Four phases: (Phase 1) 6-point data quality audit on DEV β NULL checks on critical columns, duplicate detection, row count validation, date continuity, price reasonableness, symbol format compliance. (Phase 2) DEV to PROD promotion via ANTI JOIN (only new rows inserted, never overwrites). (Phase 3) Incremental Weekly OHLC rebuild. (Phase 3.5) Dashboard snapshot rebuild. (Phase 4) Post-validation + SYNC_LOG entry.
1. NULL check on critical columns (symbol, date, adjusted_close)
2. Duplicate detection (same symbol+date in last 7 days)
3. Row count validation (β₯95% of expected rows)
4. Date continuity (no gaps > 3 business days)
5. Price reasonableness (no negative prices, no > 1000% daily moves)
6. Symbol format compliance (all must end in .US)Stage 3: Score Rebuild
Recomputes all 5 JCN composite factor scores (Value, Quality, Growth, Financial Strength, Momentum) for 8 different presets. Reads from PROD tables, applies scoring algorithms, and writes results to the 5 PROD_OBQ_*_Scores tables. Approximately 4.48 million score rows generated.
Prime Directive v1.0
Eight immutable rules governing all data operations in the sync pipeline. These rules cannot be overridden and are enforced at every stage.
| ID | Rule |
|---|---|
| PD-01 | NEVER DELETE HISTORICAL DATA. Append-only. Deactivate via is_active=FALSE. |
| PD-02 | POINT-IN-TIME COMPLIANCE. Use filing_date, not quarter_date, for fundamental joins. |
| PD-03 | SYMBOL FORMAT CANONICAL. All tables use TICKER.US format. |
| PD-04 | NO PARTIAL WRITES TO PROD. All writes to DEV first. Gate: β₯95% rows + zero nulls on critical columns. |
| PD-05 | ADJUSTED_CLOSE ONLY. Raw close never used for analysis. |
| PD-06 | SYMBOL CONTAMINATION ZERO TOLERANCE. Filter mutual funds, OTC, warrants at Stage 1. |
| PD-07 | IDEMPOTENT STAGES. Safe to re-run. UPSERT / ANTI JOIN patterns. |
| PD-08 | CURSOR PERSISTENCE. Long-running stages write progress to SYNC_STATE for resumability. |
Caching Architecture
4-Layer Cache
JCN uses a multi-layer caching strategy to minimize latency and API calls. Each layer has specific TTLs and invalidation rules.
| Layer | Location | Latency | TTL |
|---|---|---|---|
| L3 | Browser localStorage | 0ms | 24hr (perf data), 15min (live prices), 30min (analysis) |
| L2 | Vercel /tmp | 0ms (warm) | Date-based invalidation (new trading day) |
| L1 | PROD_DASHBOARD_SNAPSHOT | ~200ms | Rebuilt during Stage 2 sync |
| L0 | Legacy 5-CTE Query | 2-4s | Always available fallback (no cache) |
| L4 | EODHD Real-Time | ~500ms | 15min client-side throttle, manual refresh only |
TTL Strategy
Cache TTLs are designed around data freshness requirements. Portfolio performance data (24hr TTL) only needs daily refresh since it uses EOD prices. Live prices (15min TTL) balance freshness with API rate limits. Stock analysis data (30min TTL) represents quarterly fundamentals that change infrequently.
// Cache hierarchy β check in order, return first hit:
1. localStorage (instant) β if valid TTL, return
2. /tmp file cache (instant if warm) β if same day, return
3. PROD_DASHBOARD_SNAPSHOT (~200ms) β pre-computed row, return
4. Legacy 5-CTE query (2-4s) β full DB query, return + cache
5. EODHD API (500ms) β live prices only, on manual refreshRisk Management
The Global Portfolio Risk Assessment page (/risk-management) provides institutional-grade risk analytics for the JCN 57-position global portfolio. Data loads instantly from a nightly MotherDuck cache (PROD_RISK_SNAPSHOT).
Sections: Portfolio Composition (4 donut charts) Β· Concentration Health (HHI, Effective N, position bars, sector vs S&P 500) Β· Historical Crash Simulator (Hidden Levers-style: actual stock prices during 6 crises) Β· Market Sensitivity (beta gauge, interactive β30/+30% shock calculator) Β· Drawdown Reality Check Β· Macro Sensitivity Map (7 pressure points with $ impact estimates).
Key metrics: Portfolio beta β 1.15 Β· Effective N (true diversification) Β· HHI concentration score Β· Up/Down capture vs ACWI Β· CVaR 95/99 Β· Ulcer Index Β· Crisis scenarios: 2008 GFC, 2022 Rate Shock, 2001 Dot-Com, 2020 COVID, Q4 2018, Ukraine.
Cache: PROD_EODHD.main.PROD_RISK_SNAPSHOT β rebuilt nightly at 4am UTC. Falls back to live compute (~15s) on first run. All computations use adjusted prices only (PD-05).
Model History
The Model Performance History page (/model-history) is a full institutional tearsheet for JCN's two strategies, built from actual rebalance-weighted holdings using GIPS 2020-compliant Time-Weighted Return methodology.
Strategies: Persistent Value (inception April 30, 2016 Β· CAGR 18.17% gross Β· Max DD β34.81%) and Olivia Growth (inception October 1, 2018 Β· CAGR 20.95% gross Β· Max DD β47.44%). Both verified against JCN GIPS audit files.
Tearsheet sections (all on one scrollable page): KPI strip Β· Growth of $100k (adj prices, dividends reinvested) Β· Drawdown underwater chart Β· GIPS Annual Return Table (Gross/Net/ACWI/SPY) Β· Complete 50+ metric table Β· Monthly heatmap (net monthly cells + Gross/Net annual columns) Β· Rolling Risk 2Γ2 grid Β· Risk/Return scatter Β· Up/Down capture Β· Return distribution Β· Best/Worst periods Β· Underwater duration Β· Active returns Β· Rebalance timeline Β· Crisis analysis Β· Holdings file manager.
Holdings management: Upload new CSV after each rebalance. Every version is preserved in PROD_MODEL_HOLDINGS_LOG (never deleted). Download the current template from the page to edit for next rebalance. Format: Date, Symbol, Target Weight.
Accuracy notes: BKNG 25:1 split correction applied (factor 25.0625Γ). Cash symbols (FDRXX) modeled as $1.00 flat-price instruments. All prices from PROD_EOD_survivorship adjusted_close (PD-05). Sharpe uses 2.5% risk-free rate. Net returns deduct 2.20%/yr advisory fee at 2.20%/252 per trading day.
What Are Investor Profiles?
Investor Profiles are curated analytical frameworks distilled from legendary investors, quantitative researchers, and institutional strategies. Each profile is a complete lens for evaluating stocks β with specific screening criteria, scoring algorithms, and qualitative checklists that go beyond the core JCN factor scores.
Where profiles appear:
- Screener Tab β dedicated filter tab with preset values and auto-sorted results
- Pearl.ai Chat β "analyze AAPL through the LongEq lens" triggers full gate-by-gate evaluation
- Encyclopedia (Part XII) β deep methodology reference in
JCN_Intelligence/Investor_Profiles/ - PROD_LONGEQ_SCORES β pre-computed monthly scores for the full 3,000-stock universe
Current profiles (6): LongEq Β· NDR DFR Β· Fundsmith Β· Quality Growth (Polen/Contrafund) Β· GuruFocus Β· 100 Baggers (Mayer) β all live, April 2026. Planned: Olivia GQM, Deep Value / Graham-Dodd, Macro-Aware Bridgewater.
LongEq β Core Philosophy
Source: 67 articles from subscribe.longeq.com (65,757 words total), distilled for JCN integration April 2026. Synthesizes the frameworks of Terry Smith (Fundsmith), Chuck Akre (Akre Capital Management), and Dev Kantesaria (Valley Forge Capital).
One-sentence thesis: Find capital-efficient businesses with durable competitive advantages, buy them at reasonable prices relative to their growth, and hold them as they compound β indefinitely.
The core belief is that companies generating high, sustained returns on capital will produce exponential share price growth over decades. The market eventually reflects the underlying compounding of the business. The investor's job is to identify that compounding before the market fully prices it in β and then get out of the way.
What this strategy is NOT: It is not value investing (buying cheap), not momentum investing (buying what's rising), not growth investing (buying high-growth unprofitable companies). It sits at the intersection of quality, growth, and patience. The holding period is measured in years to decades, not months.
5-Filter Screening Framework
LongEq applies 5 sequential filters. A company must pass all 5 to be considered. The order matters β eliminate poor economics first, before any valuation work.
Filter 1 β Quality Screen
Eliminate poor economics before anything else. "The single most important definition of a good company is return on capital above 15%." β Terry Smith
| Metric | Threshold | Rationale |
|---|---|---|
| ROC (Return on Capital) | > 15% sustained 5yr avg | Capital efficiency β the master metric |
| ROC Trend | Stable or rising | Declining ROC = eroding moat |
| FCF Margin | Positive and growing | Cash generation beats reported earnings |
| Debt/Equity | Reasonable for sector | Avoid leveraged growth illusions |
Auto-exclude: Airlines, banks, insurers, mining/resources, utilities, real estate, early-stage speculative tech, companies needing fresh equity to grow.
Filter 2 β Share Price Linearity
The market proves consistency. LongEq regression-tests every candidate's share price against an exponential curve. High RΒ² = the market has consistently rewarded compounding β not a one-time rerating.
RΒ² of log(weekly_adjusted_close) vs time > 0.80 over 5-10 years
Share price CAGR > 10% (5yr)
ORLY: RΒ²=0.96 COST: RΒ²=0.92 AAPL: RΒ²=0.82 β elite compounders
ADBE: RΒ²=0.19 β recent underperformance breaks linearity
META: RΒ²=0.53 β volatile path despite underlying business qualityFilter 3 β Sector Exclusions
Structurally poor economics regardless of company quality. Exclude permanently: Banks & insurers (leveraged, regulated, cyclical) Β· Airlines (commodity service, capital-destructive) Β· Mining & resources (depleting assets, capex-heavy) Β· Utilities (regulated returns, rate-sensitive) Β· Real estate (capital-intensive, interest-rate sensitive).
Filter 4 β Competitive Advantage (Moat)
Four pricing power questions:
- Is the product a significant cost for the customer? (Mission-critical β lower price sensitivity)
- Are there better or cheaper alternatives? (If no β strong pricing power)
- Are there switching costs? (If yes β locked-in customers)
- Are there barriers to entry? (If yes β competitors can't erode margins)
Moat types favored: Installed base Β· Repeat/predictable transactions Β· Strong brands Β· Franchise models (use others' capital) Β· Network effects Β· Regulatory moats.
Filter 5 β Valuation Discipline
"A wonderful business at a fair price is better than a fair business at a wonderful price." Use FCF yield as the anchor, not P/E.
FCF Yield = Free Cash Flow / Market Cap
Expected Return = FCF Growth Rate + FCF Yield
Example: 15% FCF grower with 3% yield β 18% expected return
Ideal range: FCF Yield 2-5% with high growth backing itKey Metrics & Red Flags
Primary metrics (quantitative scoring):
| Metric | What It Measures | Ideal Threshold |
|---|---|---|
| ROC (Return on Capital) | Capital efficiency β master metric | > 20%, stable 5yr+ |
| ROIC | Return on all invested capital | > 15% |
| FCF/Share Growth | Core cash compounding | > 15% CAGR 5yr |
| Revenue Growth | Top-line expansion | > 10% CAGR 5yr |
| FCF Yield | Current cash return to shareholders | 2β5% (with high growth) |
| Share Price RΒ² (weekly) | Consistency of compounding | > 0.80 over 5yr |
| SBC % of OCF | Shareholder dilution risk | < 30% (our gate threshold) |
| CAPEX % of OCF | Capital intensity | < 20% = capital-light |
| Gross Margin | Pricing power proxy | > 50% |
| Debt/FCF | Leverage risk | < 3x |
Red flags β immediate disqualifiers:
- SBC > 10% of revenue β excessive dilution eating compounding
- ROC declining 3+ consecutive years β moat erosion underway
- Customer concentration > 40% single customer β dependency risk
- FCF consistently below net income β earnings quality problem (accruals)
- Share count growing > 2%/yr β dilution destroying per-share compounding
- CAPEX > 20% of OCF for 5+ years β capital-heavy, not a compounder
4 Company Archetypes
LongEq categorizes every holding into one of four archetypes. The archetype determines how you assess the moat and what metrics matter most.
1. Capital-Light Compounders
The Donut
Reinvest a small amount of capital to generate outsized returns. Low capex, high margins, reinvestment drives exponential growth.
- CAPEX < 5% of revenue
- ROC > 25%
- Software, data/analytics, IP-licensing
- Revenue is recurring (subscriptions, licenses)
Examples: Cadence Design Systems, MSCI, ATOSS Software, FICO, TechnologyOne
2. Infrastructure Roll-Ups
The Snowball
Acquire small businesses in fragmented industries, apply operational excellence, compound through M&A + organic growth.
- Proven M&A integration track record
- Revenue is essential services (not discretionary)
- Installed base creates switching costs
- FCF funds the acquisition pipeline
Examples: Comfort Systems USA, Parker Hannifin, Broadridge Financial
3. Mission-Critical Niches
Hidden Oligopolies
Dominate tiny, essential markets where customers can't switch and competitors can't enter.
- Market share > 40% in niche
- Customer faces operational failure without product
- R&D creates technical moat
- Small TAM discourages large competitors
Examples: Disco Corp, Badger Meter, KLA Corp, Namsys
4. Exchange/Infrastructure Monopolies
Regulatory Moat
Financial market infrastructure with regulatory moats and compounding network effects.
- Government/regulatory mandate creates barriers
- Network effects compound with market growth
- 50%+ operating margins
- Nearly impossible to displace
Examples: MSCI (indexes), CME Group, Broadridge, CDSL (India)
Smith Β· Akre Β· Kantesaria β Three Lenses
LongEq synthesizes three legendary investors. Each adds a different dimension to stock evaluation. When all three lenses agree, conviction is highest.
Terry Smith β Fundsmith Equity Fund
"I like to bet on companies that have already won."
Chuck Akre β Akre Capital Management
The "three-legged stool" framework
Dev Kantesaria β Valley Forge Capital
"Asymmetric compounding" β top 0.1% of global businesses only
Using the three lenses together: Before adding any position, ask: (1) Would Terry Smith hold this at this valuation? (FCF yield acceptable vs bond yields?) (2) Does Akre's three-legged stool hold? (Business + Management + Reinvestment opportunities?) (3) Would Kantesaria hold this forever? (Terminal value certain? Competitive position unassailable?) If all three say yes, highest conviction. If two of three, proceed cautiously.
7-Point Gate System (JCN Implementation)
JCN translates LongEq's methodology into a binary 7-point scoring system computed monthly for all 3,000 investable universe stocks. Stored in PROD_EODHD.main.PROD_LONGEQ_SCORES.
| Gate | Threshold | Data Source | Pass Rate |
|---|---|---|---|
| 1 β Growth | FCF/share 5yr CAGR > 15% | PROD_OBQ_Growth_Scores.fcf_ps_cagr_5y | ~35% |
| 2 β ROC | Cash ROC > 20% | PROD_OBQ_Quality_Scores.roic | ~45% |
| 3 β Margins | FCF Margin > 20% | PROD_OBQ_Quality_Scores.fcf_margin | ~40% |
| 4 β CapEx | CAPEX < 20% OCF AND PA/TA < 40% | PROD_LONGEQ_SCORES computed fields | ~70% (NULL PP&E = auto-pass) |
| 5 β SBC | SBC < 30% OCF | cf_stockBasedCompensation / cf_totalCashFromOperatingActivities | ~80% |
| 6 β Buybacks | Share count change < +5% (5yr) | shares_outstanding history | ~75% |
| 7 β Interest | Interest < 20% op profit (or no debt) | is_interestExpense / is_operatingIncome | ~85% |
Score distribution (March 2026, 3,000-stock universe):
Score 7 β Elite: 26 stocks (~0.9%) All 7 gates pass
Score 6 β Strong: 109 stocks (~3.6%)
Score 5 β Good: 291 stocks (~9.7%)
Score β€4: 2574 stocks (~85.8%) Majority don't qualify
LQ Rank: HIGHER NUMBER = BETTER (matches LongEq.com convention)
Rank 2,744 = best | Rank 1 = weakest
Top compounders: FICO(~1253), FTNT(~1252), KLAC, LRCX, MA, V
Price Linearity (RΒ²):
RΒ² of log(weekly adjusted_close) vs time, 5yr window
Weekly resampled from daily adjusted_close (splits + dividends)
Strictly β€ month_date β zero look-ahead bias
ORLY: 0.96 COST: 0.92 AAPL: 0.82 NVDA: 0.87 ADBE: 0.20Point-in-time accuracy: All fundamental gates use TRY_CAST(filing_date AS DATE) <= month_date β only data that was actually available at the scoring date. Zero look-ahead bias. The universe filter uses effective_start <= month_date AND effective_end >= month_date from PROD_OBQ_Investable_Universe β includes companies that were later delisted (no survivorship bias). OBQ score tables are never modified by the LongEq script.
Custom Scan Specification
Complete technical specification for how the LongEq scan is computed in scripts/longeq_score_recalculation.py. Run this script after all OBQ score scripts complete (always last in the chain).
EXECUTION ORDER (mandatory):
1. score_recalculation.py --score all --resume
2. momentum_score_recalculation.py --resume
3. composite_score_recalculation.py --resume
4. longeq_score_recalculation.py --resume β always last
UNIVERSE: PROD_OBQ_Investable_Universe
WHERE effective_start <= month_date AND effective_end >= month_date
Top-3,000 US equities by market cap, annually reconstituted in May
Includes delisted companies β no survivorship bias
PRICE LINEARITY ALGORITHM:
1. Pull adjusted_close from PROD_EOD_survivorship
WHERE date <= month_date (strictly β no look-ahead)
2. Resample to weekly: last trading day of each ISO week
3. Take last 5 years = ~260 weekly observations (min 150 required)
4. Fit: log(price) = slope Γ time + intercept (scipy.stats.linregress)
5. r_value_5yr = signed correlation (negative = falling trend)
6. price_rsq_5yr = r_valueΒ² (0-1, always positive)
7. price_cagr_5yr = exp(slope Γ 52) - 1 (weekly slope β annualized)
FUNDAMENTAL GATES ALGORITHM:
Filing date gate: TRY_CAST(filing_date AS DATE) <= month_date
Staleness gate: filing_date >= month_date - 548 days
Bad date safety: TRY_CAST silently drops '0000-00-00' rows (119k exist)
Latest filing: QUALIFY ROW_NUMBER() OVER (PARTITION BY symbol
ORDER BY TRY_CAST(filing_date AS DATE) DESC) = 1
Gate 1 (Growth): fcf_ps_cagr_5y > 0.15 (from PROD_OBQ_Growth_Scores)
Gate 2 (ROC): roic > 0.20 (from PROD_OBQ_Quality_Scores)
Gate 3 (Margins): fcf_margin > 0.20 (from PROD_OBQ_Quality_Scores)
Gate 4 (CapEx): capex_pct_ocf < 0.20 capex/ocf from cf_ columns
AND pata_ratio < 0.40 ppe/total_assets
NULL pata = 0.0 (asset-light, auto-passes)
Gate 5 (SBC): sbc_pct_ocf < 0.30 sbc/ocf from cf_ columns
Gate 6 (Buybacks): sharecount_chg_5yr < 0.05 (5yr share change)
Gate 7 (Interest): interest_pct_op < 0.20 OR NULL (no debt = auto-pass)
ltd_ta_ratio < 0.05 β auto-pass if negligible debt
RANK DIRECTION:
Higher longeq_rank = BETTER (matches LongEq.com convention)
Rank assigned by: sort ascending by (longeq_score, price_rsq_5yr)
then assign 1..N so best stocks get highest rank numbers
PROGRESS TRACKING:
Table: PROD_EODHD.main.SCORE_CALC_PROGRESS
Key: 'longeq'
Idempotent: DELETE + INSERT per month_date (safe to re-run)
RUNTIME: ~27 seconds per month (3,000 symbols Γ weekly regression)Data sources used (read-only):
PROD_EOD_survivorshipβ adjusted_close for price RΒ² regressionPROD_OBQ_Quality_Scoresβ roic, fcf_margin (gates 2 + 3)PROD_OBQ_Growth_Scoresβ fcf_ps_cagr_5y (gate 1)PROD_EOD_Fundamentalsβ cf_capitalExpenditures, cf_totalCashFromOperatingActivities, cf_stockBasedCompensation, bs_propertyPlantEquipment, bs_totalAssets, is_interestExpense, is_operatingIncome, shares_outstanding, bs_longTermDebt, cf_freeCashFlow, market_capPROD_OBQ_Investable_Universeβ universe filter (effective_start/end)
Written to (exclusively): PROD_EODHD.main.PROD_LONGEQ_SCORES β 31 columns, PRIMARY KEY (symbol, month_date).
Using LongEq in the Screener
The LongEq tab in the Stock Screener (/screener) provides a pre-configured interface for the quality compounder universe.
Auto-behavior when LongEq tab is clicked:
- Pre-loads LQ Score β₯ 5 filter (strong quality compounders only β ~291 of 3,000)
- Sorts by LQ Rank descending β highest rank (= best compounder) at top
- Reorders columns: LQ Rank β LQ Score β FCF CAGR 5yr β Cash ROC β FCF Margin β CAPEX/OCF β SBC/OCF β Share Chg 5yr β Interest/Op β Price RΒ² β Price CAGR
- Shows actual metric values not binary 1/0 β so you can compare within passing stocks
Available filters on LongEq tab:
| Filter | Options |
|---|---|
| LQ Score (0β7) | Any / 7 Elite / 6+ Excellent / 5+ Strong / 4+ Good / 3 or below |
| Price Linearity RΒ² (5yr) | Any / β₯0.90 Very linear / β₯0.80 Linear / β₯0.70 / β₯0.60 / <0.50 Erratic |
| Price CAGR (5yr) | Any / >30% / >20% / >15% / >10% / <0% declining |
| Growth Gate | Any / Pass (FCF CAGR>15%) / Fail |
| ROC Gate | Any / Pass (ROC>20%) / Fail |
| Margins Gate | Any / Pass (FCF margin>20%) / Fail |
| CapEx Gate | Any / Pass (capital-light) / Fail |
| SBC Gate | Any / Pass (SBC<30% OCF) / Fail |
| Buybacks Gate | Any / Pass (no dilution) / Fail |
| Interest Gate | Any / Pass (<20% op income) / Fail |
Screener universe: Exactly 3,000 stocks (top-3,000 US equities by market cap, annually reconstituted). The old 76,774-stock display was micro-cap/OTC noise β the database was not corrupted. Scores are only available for the 3,000-stock investable universe; the broader survivorship table exists for backtesting only.
Alignment with Persistent Value Strategy
LongEq represents the direction JCN Persistent Value should evolve toward. The strategy assessment (April 2026) revealed PV has drifted far from its stated "value" mandate β the portfolio's value score has fallen from 63 (2016) to 12 (2026). LongEq provides a rigorous, externally-validated framework to replace the loose quality-growth mandate with concrete, auditable criteria.
Current PV holdings vs LongEq gates (March 2026):
| Symbol | LQ Score | LQ Rank | Assessment |
|---|---|---|---|
| LRCX | 7 | 2732 | β Elite β perfect compounder alignment |
| KLAC | 7 | 2742 | β Elite β capital-light semiconductor equipment |
| ISRG | 5 | ~1200 | β Strong β surgical robotics monopoly |
| MSCI | 6 | ~1200 | β Strong β index/data infrastructure monopoly |
| MA | 6 | ~1200 | β Strong β payments network effect |
| V | 7 | 2737 | β Elite β pure network effect compounder |
| COST | 3 | ~750 | β οΈ Low LQ score β CAPEX heavy, margins below 20% |
| SPMO | N/A | N/A | β ETF β not evaluated by LongEq methodology |
| TSLA | 2 | ~400 | β Low score β capital-intensive, inconsistent FCF |
Recommended use: Before adding any new position to PV, run it through all 5 LongEq filters. Require LQ Score β₯ 5 for new entries. Use the LongEq screener tab to find candidates that meet criteria. This gives PV a consistent, defensible stock selection process aligned with the best-in-class quality compounder methodology.
NDR β Core Philosophy
Source: Ned Davis Research (NDR) β Being Right or Making Money (2014) and the NDR Factor Descriptions: Interactive Stock Screener. NDR is one of the most rigorous evidence-based quantitative research firms in institutional finance, founded in 1980. Their methodology is built on a single governing principle:
βDon't fight the tape, don't fight the Fed, beware of the crowd at extremes.β
β Ned Davis Research core maxim
NDR is fundamentally a weight-of-the-evidence shop. No single indicator is ever decisive. Instead, they build composite models β diffusion indexes, multi-factor rankings, and regime classifiers β that synthesize dozens of signals into a single, auditable score. Their approach is explicitly adaptive: what factors matter most depends on the current market regime.
This stands in deliberate contrast to LongEq, which is static: the 7 quality gates never change regardless of market environment. NDR's DFR dynamically re-weights its four factor pillars based on which factors are currently being rewarded by the market. In a momentum-driven bull market, technicals get overweighted. In a risk-off environment, the risk quality pillar dominates.
| NDR Model | Scope | Description | JCN Implementation |
|---|---|---|---|
| Big Mo | Market-level | Diffusion index: % of 96 BMES subindustry indices with bullish trend + momentum. Score 0β100. >79 = bull, <56 = bear. | Not implemented (requires subindustry data) |
| Little Mo | Stock-level daily | Same logic as Big Mo but built from individual stocks. More tactical. | Not implemented |
| The Fab Five | Market timing | 5-component model (TapeΓ2 + Sentiment + Monetary + Combo). Score β5 to +5. | Not implemented (needs macro data) |
| Dynamic Focus Rank | Individual stocks | 5-sub-rank composite: Technical, Profitability, Valuation, Risk, Analyst Estimates. Dynamically weighted. | β Implemented as JCN DFR (4/5 sub-ranks β no analyst estimates data) |
Dynamic Focus Rank (DFR)
The Dynamic Focus Rank is NDR's primary individual stock selection tool. It ranks every stock in their Multi-Cap Universe on a cross-sectional percentile basis (0β100, higher = better) using a composite of five sub-ranks. The βdynamicβ part refers to the factor weights shifting based on what regime the market is in β not a static equal-weight blend.
The JCN implementation builds 4 of the 5 sub-ranks. The missing sub-rank is Analyst Estimate Rank (earnings revisions + earnings surprise), which requires sell-side estimate data not currently in our PROD database. The four implemented sub-ranks cover the core quantitative backbone of the methodology.
DFR Composite Formula
DFR Score = wtech Γ Technical + wprof Γ Profitability + wval Γ Valuation + wrisk Γ Risk
Where weights w are regime-conditional (see Regime section). All sub-ranks are cross-sectional percentiles 0β100 within the JCN 3,000-stock investable universe.
The DFR composite score is stored monthly in DFR_COMPOSITE_SCORES alongside the regime used and its exact weights β giving a full audit trail of every monthly score and the market environment it was computed under.
4 Sub-Rank Components
Each sub-rank is a cross-sectional percentile computed monthly within the JCN investable universe. All data is point-in-time: prices use only dates β€ month-end; fundamentals use only filing_date β€ month-end (no look-ahead bias).
1. Technical Rank
Weight: 20β40%Table: DFR_TECHNICAL_SCORES
- 12M Momentum: Price return over 12 months (adjusted_close, point-in-time)
- 6M Momentum: Price return over 6 months
- 3M Momentum: Price return over 3 months
- Trend Deviation: % deviation of current price from 200-day SMA
dfr_technical_rank = 0.6 Γ percentile(0.4Γr12m + 0.3Γr6m + 0.3Γr3m) + 0.4 Γ percentile(trend_deviation)
Higher deviation above trend = stronger uptrend = higher rank. Composite momentum uses standard skip-last-month convention.
2. Profitability Rank
Weight: 25β35%Table: DFR_PROFITABILITY_SCORES
- Return on Assets (ROA): Net income / average total assets (TTM, from PROD_EOD_Fundamentals)
- Return on Equity (ROE): Net income / average shareholders' equity (TTM)
dfr_profitability_rank = 0.5 Γ percentile(ROA) + 0.5 Γ percentile(ROE)
Both metrics use filing_date for point-in-time compliance. Higher ROA/ROE = better capital efficiency = higher rank.
3. Valuation Rank
Weight: 20β40%Table: DFR_VALUATION_SCORES
- Earnings Yield: 1 / PE ratio (where PE > 0). Higher = cheaper on earnings basis.
- FCF/EV Yield: Free cash flow / enterprise value. Capital-structure neutral.
- Sales/EV Ratio: Revenue TTM / enterprise value. Useful when earnings are negative.
- OCF Yield: Operating cash flow / market cap. Cash-based valuation.
dfr_valuation_rank = equal-weight average of 4 individual yield percentile ranks
Higher yield = cheaper = higher rank. Using 4 complementary metrics reduces sensitivity to any single accounting treatment.
4. Risk Rank
Weight: 15β35%Table: DFR_RISK_SCORES
- Realized Volatility: Annualized std dev of 63 daily log returns of adjusted_close
- Accruals Ratio: (Net income β OCF) / total assets. Lower = higher earnings quality.
- Mean Reversion Score: Z-score of current price vs 252-day mean. Higher = more stretched.
dfr_risk_rank = equal-weight average of 3 INVERTED percentile ranks (100 = lowest risk)
All three metrics are inverted: lower vol, lower accruals, and less price stretch all yield higher rank. A score of 100 means lowest-risk stock in the universe.
Regime-Conditional Weights
The defining feature of NDR's DFR β and what distinguishes it from all static factor models β is that factor weights shift monthly based on the detected market regime. When momentum stocks are being rewarded, the Technical sub-rank gets more weight. When investors are fleeing to safety, Risk rank dominates.
JCN detects regime by reading the median composite scores of the existing OBQ factor tables (read-only β no writes to OBQ tables). This reuses the same signals already computed by the OBQ pipeline, adding zero new data dependencies.
| Regime | Trigger Condition | Technical | Profitability | Valuation | Risk |
|---|---|---|---|---|---|
| MOMENTUM | Median momentum score > 65 | 40% | 25% | 20% | 15% |
| DEFENSIVE | Median quality score > 65 | 20% | 35% | 25% | 20% |
| VALUE | Median value score > 65 | 20% | 25% | 40% | 15% |
| RISK_OFF | Median momentum score < 35 | 15% | 25% | 25% | 35% |
| NEUTRAL | None of the above | 25% | 25% | 25% | 25% |
Every month's regime call is logged to DFR_REGIME_LOG with the exact weights used and the OBQ median scores that drove the decision. This creates a full audit trail: you can always look back and understand exactly why a stock ranked where it did in any historical month.
β Database Safety
Regime detection reads from PROD_OBQ_Momentum_Scores, PROD_OBQ_Quality_Scores, and PROD_OBQ_Value_Scores but never writes to them. All DFR output is isolated in the DFR_* table namespace. OBQ scores always run first; DFR runs last.
NDR DFR Scan Specification
The JCN NDR DFR scan covers the full 3,000-stock investable universe, scored monthly in sync with the OBQ pipeline. All 6 output tables are in PROD_EODHD.main.
| Table | Rows / Month | Description |
|---|---|---|
| DFR_TECHNICAL_SCORES | ~3,000 | Momentum + trend deviation sub-rank per stock |
| DFR_PROFITABILITY_SCORES | ~3,000 | ROA / ROE sub-rank per stock |
| DFR_VALUATION_SCORES | ~3,000 | 4-metric yield sub-rank per stock |
| DFR_RISK_SCORES | ~3,000 | Vol + accruals + mean-reversion sub-rank (inverted) |
| DFR_REGIME_LOG | 1 | Regime detected + weights used for the month |
| DFR_COMPOSITE_SCORES | ~3,000 | Final regime-weighted DFR score + rank per stock |
Execution order (enforced by run_investor_profiles.py):
# After OBQ monthly scores complete: python scripts/run_investor_profiles.py --resume # This runs in order: # 1. longeq_score_recalculation.py β PROD_LONGEQ_SCORES # 2. ndr_score_recalculation.py β DFR_* tables (6 tables) # Or run NDR alone: python scripts/ndr_score_recalculation.py --resume
Screener access: Open the Screener tab β click NDR DFR. The tab auto-applies a DFR Score β₯ 75 filter scoped to NYSE + NASDAQ listed stocks only and sorts by dfr_composite_rank ascending (rank 1 = highest composite score). A Listed On dropdown lets you expand to OTC/Pink Sheets if desired. All 4 sub-ranks, the regime label, exchange, and individual metrics are available as columns.
Freshness monitoring: Stage 3 of the sync pipeline (sync_stage3.py) monitors both PROD_LONGEQ_SCORES and DFR_COMPOSITE_SCORESfor staleness. If either falls more than 45 days behind the latest EOD data, the sync report flags it with the exact script to run.
NDR DFR vs. LongEq β When to Use Each
Both profiles cover the same 3,000-stock investable universe and update on the same monthly schedule. They answer fundamentally different questions:
| Dimension | LongEq Quality Compounder | NDR Dynamic Focus Rank |
|---|---|---|
| Philosophy | Absolute quality gates β pass/fail on 7 criteria | Relative cross-sectional ranking β percentile vs universe |
| Factor weights | Static β always equal (1 point per gate) | Dynamic β shift monthly based on market regime |
| Time horizon | Long-term compounder (3β10 yr hold) | Medium-term adaptive (1β12 month regime-aware) |
| Sector coverage | Excludes Financials, Utilities, Energy, REITs, Materials | All sectors included |
| Key question | Is this a durable compounding business? | Is this stock the best relative opportunity right now? |
| Score scale | 0β7 binary gates | 0β100 continuous composite |
| Best used for | PV portfolio candidate vetting, long-term adds | Tactical ideas, relative value within sector, rotation |
| Miss risk | May miss cyclicals that are excellent value near trough | May rank operationally weaker stocks highly during momentum regimes |
Power combination: Stocks that score highly on both profiles are the most compelling β durable businesses (LongEq β₯ 5) that are also currently ranking in the top quartile on DFR (β₯ 75). This intersection typically yields 30β80 stocks and represents the highest-conviction list: quality that the market is currently rewarding. Filter for it in the screener by combining both tab's filters simultaneously.
Fundsmith β Core Philosophy
Source: Terry Smith, Investing for Growth (2020) β a decade of annual shareholder letters and Financial Times columns. Fundsmith Equity Fund launched November 2010. As of 2024: Β£27B AUM, one of the best long-term track records in global equity.
βBuy good companies. Don't overpay. Do nothing.β
β Terry Smith, Three Steps to Heaven (2015)
Smith's north star is Return on Capital Employed (ROCE) β not FCF margin, not EPS growth, not revenue growth. He wants businesses that earn significantly more on their capital than it costs to deploy that capital. His second filter is gross margin as a proxy for pricing power and intangible moats. Third: cash conversion β profits must become cash. He explicitly rejects financial leverage as a driver of returns.
What Terry Smith avoids (stated explicitly in his book): Banks and financials (βcan't understand the balance sheetβ), airlines and utilities (structural capital destroyers), commodity businesses (price-takers), and acquisition-driven compounders (βlet the management deploy capital β if they invest in acquisitions, watch carefullyβ).
Typical holdings: MSFT, META, IDEXX Laboratories, Philip Morris, L'OrΓ©al, Novo Nordisk, Visa, Automatic Data Processing. 20β30 positions, very low turnover.
Fundsmith 6-Gate System (JCN)
JCN implements Terry Smith's methodology as a 6-gate binary scoring system (0β6). Each gate reflects a specific criterion from his published methodology. Score stored in PROD_FUNDSMITH_SCORES.
| Gate | Threshold | Metric | Rationale |
|---|---|---|---|
| ROCE | > 15% | Operating income / (Total assets β Current liabilities) | Primary quality filter β capital efficiency above cost of capital |
| Gross Margin | > 50% | Gross profit / Revenue TTM | Pricing power proxy β intangible moat indicator |
| Cash Conversion | > 80% | Operating cash flow / Net income | Profits must become cash β 'cash is fact, profit is opinion' |
| Debt / EBIT | < 2Γ (or net cash) | Net debt / Operating income | Avoids leverage-dependent businesses |
| Revenue Growth | > 3% / yr (3yr) | 3yr revenue CAGR | Organic growth β not acquisition-driven |
| FCF Yield | > 2.5% | Free cash flow / Market cap | Valuation gate β 'don't overpay' |
Excluded sectors (flagged, still scored): Financials, Energy, Materials, Utilities. Screener: Click Fundsmith tab β auto-applies Score β₯ 4, NYSE/NASDAQ only, sorts by score descending.
Quality Growth β Polen Capital / Fidelity Contrafund
A combined profile inspired by two funds that occupy the same investment space from different angles:
Polen Capital (Focus Growth)
- β’ Pure earnings compounder philosophy β buys businesses with consistent double-digit EPS growth
- β’ Highly concentrated: 20β25 positions held for 3β5+ years
- β’ Revenue growth > 10%/yr, EPS growth > 10%/yr, ROE > 20%
- β’ Net cash preferred β debt is a risk multiplier, not a tool
- β’ Will pay 25β35Γ earnings for a business growing at 15%+
- β’ Avoids cyclicals, commodities, capital-intensive businesses
Fidelity Contrafund (Will Danoff)
- β’ GARP β Growth At a Reasonable Price. PEG < 2 preferred
- β’ Large, diversified (300+ positions) but top 10 = ~35% of fund
- β’ Revenue growth > 15%/yr for core positions
- β’ Strong forward EPS revision trend β upward estimate revisions matter
- β’ Tech-heavy: NVDA, AMZN, META, MSFT consistently top holdings
- β’ More valuation-aware than Polen β won't pay any price for growth
Quality Growth 5-Gate System (JCN)
JCN combines both methodologies into a 5-gate system targeting consistent earnings compounders with high ROE at a reasonable valuation. Score stored in PROD_QUALITYGROWTH_SCORES.
| Gate | Threshold | Metric | Rationale |
|---|---|---|---|
| Revenue Growth | > 10% / yr (3yr) | 3yr revenue CAGR | Minimum growth threshold β both Polen and Danoff require double-digits |
| EPS Growth | > 10% / yr (3yr) | 3yr net income CAGR | Earnings must grow consistently β not just revenue |
| ROE | > 20% | Return on equity TTM | Polen's primary capital efficiency filter |
| Debt | Net D/E < 1.0 | Net debt / Shareholder equity | Growth should be self-funded β not levered |
| Not Expensive | PEG < 3.0 | Forward PE / Revenue growth (as %) | Contrafund's GARP filter β won't pay any price |
Excluded sectors (flagged): Energy, Utilities, Materials. Screener: Click Quality Growth tab β auto-applies Score β₯ 3, NYSE/NASDAQ only, sorts by score descending.
GuruFocus β Buffett/Munger Predictability + Margin of Safety
Sources: Charlie Tian, Invest Like a Guru (2017); GuruFocus.com Manual of Stocks; Warren Buffett's annual letters and Berkshire shareholder meetings.
GuruFocus is the most conservative and valuation-conscious of all five profiles. Where Terry Smith pays any price for quality and Polen pays 35Γ for growth, GuruFocus enforces a hard valuation gate: you must buy at or near historical median multiples. This is pure Buffett/Munger: βIt's far better to buy a wonderful company at a fair price than a fair company at a wonderful price.β
The unique concept is Business Predictability β not just current quality, but 10-year consistency of revenue and earnings. A business that grew revenue every year for 10 years is more predictable than one that grew faster but with gaps. GuruFocus rates predictability 1β5 stars based on this consistency. JCN approximates this with 5-year consistency checks.
The Piotroski F-Score is also computed and displayed β a 9-point financial health composite (ROA, cash flow, leverage, liquidity, efficiency trends). While not a gate, it provides a quick financial health check alongside the main 7 gates.
GuruFocus 7-Gate System (JCN)
JCN implements the GuruFocus methodology as a 7-gate system. The key distinction: it is the only profile with a hard valuation gate β stocks must trade at or near their historical PE median. Score stored in PROD_GURUFOCUS_SCORES.
| Gate | Threshold | Metric | Rationale |
|---|---|---|---|
| Revenue Consistency | > 5% / yr (5yr) | 5yr revenue CAGR | Predictability β consistent growth over full cycle |
| EPS Consistency | > 5% / yr (5yr) | 5yr net income CAGR | Predictable earnings β Buffett's owner earnings concept |
| ROE | > 12% avg (5yr) | Average ROE over 5yr filings | Munger: businesses that earn 12%+ ROE for decades create wealth |
| Debt | D/E < 0.5 | Total liabilities / Shareholder equity | Munger's low-debt rule β avoid leverage-dependent businesses |
| Operating Margin | > 15% | Operating margin TTM | Durable profitability β competitive advantage signal |
| FCF Consistency | β₯ 4 of last 5 yrs positive | Years with positive free cash flow | Owner earnings must be real cash, not accounting artifacts |
| Valuation | PE < 130% of historical median | Current PE / Median historical PE | The hard valuation gate β only GuruFocus enforces this |
Excluded sectors (flagged): Financials (banks β earnings unpredictable). Screener: Click GuruFocus tab β auto-applies Score β₯ 4, NYSE/NASDAQ only, sorts by score descending.
All 5 Investor Profiles Compared
Each profile captures a different dimension of investment quality. Understanding what each one does not measure is as important as what it does.
| Dimension | LongEq | Fundsmith | Quality Growth | GuruFocus | NDR DFR |
|---|---|---|---|---|---|
| Primary filter | FCF margin + ROC > 20% | ROCE > 15% | EPS growth > 10%/yr | 10yr earnings consistency | Cross-sectional rank (regime-weighted) |
| Valuation gate? | Soft (FCF yield) | Soft (FCF yield) | Soft (PEG < 3) | Hard (PE vs. historical) | None |
| Growth req. | FCF CAGR > 15% | Revenue > 3%/yr | Revenue + EPS > 10%/yr | Revenue + EPS > 5%/yr | Momentum-based |
| Debt stance | Interest < 20% op income | Net debt < 2Γ EBIT | Net D/E < 1.0 | D/E < 0.5 (strict) | Accruals ratio |
| Capital quality | FCF margin + buybacks | ROCE + gross margin | ROE > 20% | ROE > 12% avg | Profitability rank |
| Sectors avoided | Banks/utilities/energy | Banks/airlines/energy | Energy/utilities/materials | Financials (flagged) | None excluded |
| Valuation tol. | None | High | Medium | Low (needs MOS) | None |
| Time horizon | Long (FCF compounders) | Very long (do nothing) | Medium-long (growth hold) | Long (predictable biz) | Medium (regime-aware) |
| Score scale | 0β7 | 0β6 | 0β5 | 0β7 | 0β100 continuous |
| Typical names | LRCX, ISRG, COST | MSFT, IDEXX, PM | NVDA, META, AMZN | JNJ, WM, KO | Top cross-sect. rankers |
Highest-conviction intersection: A stock passing LongEq β₯ 5 AND Fundsmith β₯ 4 AND GuruFocus β₯ 5 simultaneously is an extremely rare, durable compounder trading at reasonable valuation. This intersection typically yields fewer than 20 stocks globally β but historically contains the best long-term performers.
100 Baggers β Christopher W. Mayer Methodology
Source: Christopher W. Mayer, 100 Baggers: Stocks That Return 100-to-1 and How To Find Them (2015). Mayer studied 365 stocks that turned $1 into $100+ between 1962 and 2014 β an average 26-year journey (median). The fastest took ~5 years.
βThe most essential ingredient is a business that can earn a high return on capital for a long time and has the ability to reinvest those earnings at high rates.β
β Christopher W. Mayer, 100 Baggers
Unlike the other investor profiles which are primarily quality screens, 100 Baggers is a growth + size + time framework. The key insight is mathematical: a stock returning 20% annually becomes a 100-bagger in ~25 years. But if earnings AND multiples both expand simultaneously (βtwin enginesβ), the timeline compresses dramatically.
The Math
- β’ 20% annual return = 100x in 26 years
- β’ 25% annual return = 100x in 19 years
- β’ 30% annual return = 100x in 16 years
- β’ Twin engines (earnings + multiple) = fastest path
- β’ Starting small matters β less distance to cover
The Business
- β’ High ROE β₯ 20% consistently (not from leverage)
- β’ Ability to reinvest at those high rates for years
- β’ Economic moat: brand, switching costs, network effects, low-cost producer
- β’ High gross margins = moat signal
- β’ Sales growth β₯ 10% top-line (Mayer minimum)
The Mindset
- β’ Coffee-can: buy and hold 10+ years
- β’ Median starting market cap: $500M
- β’ Owner-operators preferred (skin in the game)
- β’ PEG < 1.0 = major plus
- β’ Be a reluctant seller β almost never sell
Key differentiator vs other profiles: This is the only profile focused on potential magnitude rather than current quality. A Fundsmith stock is already great today. A 100-bagger candidate is great and small and growing fast β it needs room to multiply. That's why market cap at time of purchase is as important as quality metrics.
100 Baggers 5-Scan System (JCN)
JCN implements Mayer's methodology as 5 preset scans on the 100 Baggers screener tab. No new scoring table β all data comes from existing PROD fundamentals and OBQ scores. Each scan targets a different angle of the 100-bagger hunt.
1. Classic Hunt
ROE > 20% + Revenue growth > 10% + Market cap < $2B + D/E < 0.5
Sorted by ROE descending
Mayer's core formula. High return on capital + room to grow + conservative leverage. The most faithful replication of his quantitative criteria.
2. Small Cap Compounders
Market cap $100Mβ$1B + ROE > 20% + Earnings growth > 15%
Sorted by earnings growth descending
The median 100-bagger started at $500M market cap. This scan finds stocks before institutional discovery β small enough to multiply, already proving profitability.
3. Twin Engines
Revenue growth > 15% AND Earnings growth > 15% + PEG < 1.5
Sorted by earnings growth descending
Mayer's "explosive returns come from rising earnings AND a higher multiple." Both engines firing simultaneously β the fastest path to 100x. PEG gate ensures not wildly overvalued.
4. Coffee-Can
ROE > 20% + Gross margin > 50% + D/E < 0.3 + Revenue growth > 8%
Sorted by gross margin descending
Mayer's coffee-can philosophy: buy high-moat businesses and hold 10+ years. Gross margin > 50% signals durable competitive advantage. Low debt ensures survival through any cycle.
5. Quality at Small Size
OBQ Quality Score β₯ 75 + Market cap $200Mβ$5B + ROE > 15%
Sorted by quality score descending
Undiscovered quality: high OBQ composite score but still small enough to multiply meaningfully. Uses the full OBQ factor model as the quality gate β the most sophisticated of the 5 scans.
What the 100 Baggers tab shows: Market cap, ROE, Revenue growth, Earnings growth, Gross margin, Debt/Equity, PEG ratio β the 7 columns Mayer cares about most, shown first when the tab is active. All scans default to NYSE/NASDAQ only (no OTC/Pink Sheets).
Honest caveat: Mayer explicitly says there is βno magic formula or easy way to screenβ for 100-baggers. These scans identify the starting conditions he found common among 100-baggers β not a guarantee. The other critical ingredients (owner-operators, correct identification of the moat, willingness to hold for 10+ years) are human judgments the screener cannot replace.
Factor Screener β 20 Built-In Presets
The JCN Screener includes 20 pre-configured factor presets drawn from Morningstar Factor Profile Methodology and NDR Interactive Stock Screener Factor Descriptions. Each preset is a single dropdown selection that sets the optimal filter for that factor β no manual configuration needed.
| # | Preset Name | Tab | Key Filter | Academic Source |
|---|---|---|---|---|
| 1 | Size Factor Premium | Descriptive | Market cap tiers: Mega/Large/SMID/Small/Micro | Fama-French (1993), Banz (1981) |
| 2 | Deep Value (Graham) | Valuation | P/E < 10β15 | Graham, Morningstar Style Box |
| 3 | GARP (Peter Lynch) | Valuation | PEG < 1.0β2.0 | Lynch, Morningstar Style Score |
| 4 | EV Screen | Valuation | EV/EBITDA < 6β15Γ | NDR Valuation: EBIT/EV, FCF/EV |
| 5 | Shareholder Yield | Valuation | Dividend yield tiers (2%β6%+) | Morningstar Total Yield Factor |
| 6 | Accelerating Growth | Growth | Revenue growth > 10β30% | NDR Standardized Unexpected Revenue |
| 7 | Consistent Compounders | Growth | Earnings growth 8β20% | NDR EPS Stability, Sales Stability |
| 8 | Earnings Momentum | Growth | % below 52W high < 5β20% | NDR Standardized Unexpected EPS |
| 9 | R&D Reinvestors | Growth | OBQ Growth Score β₯ 65β85 | NDR R&D/Assets, L-T EPS Growth |
| 10 | ROCE Elite | Profitability | ROE > 20β30% | Morningstar Quality Factor (Asness 2019) |
| 11 | Efficient Operators | Profitability | Gross margin > 50β70% | NDR Gross Profit/Assets, Asset Turnover |
| 12 | Quality Minus Junk | Profitability | OBQ Quality Score β₯ 60β85 | AQR QMJ (Asness, Frazzini, Pedersen 2019) |
| 13 | Profitability Improvement | Profitability | Operating margin > 15β30% | NDR ROE - 5yr Average, Pretax Margin |
| 14 | Classic Momentum | Momentum | YoY return > 10β50% | Jegadeesh-Titman (1993), Carhart (1997) |
| 15 | Trend Following | Momentum | OBQ Momentum Score β₯ 65β85 | NDR Trend: 13W/52W deviation, % above MA |
| 16 | Momentum + Quality Combo | Momentum | JCN Quality Momentum blend β₯ 65β85 | Morningstar 2-factor Sharpe optimization |
| 17 | Low Volatility Premium | Momentum | Beta < 0.5β1.0 | Ang, Hodrick, Xing & Zhang (2006) |
| 18 | Fortress Balance Sheet | Fundamentals | Current ratio > 1.5β3.0Γ | NDR Quick Ratio, Cash Position, Interest Coverage |
| 19 | Dividend Aristocrats | Fundamentals | Dividend yield 1%β4% tiers | Morningstar Yield Factor, NDR Dividend Integrity Index |
| 20 | Financial Health Score | Fundamentals | Piotroski F-Score β₯ 6β8 | Piotroski (1996), NDR Modified F-Score |
All 20 presets use data already computed in the JCN PROD database β no new scoring scripts required. Each preset is implemented as a dropdown option on the relevant tab. Options are tiered so you can select aggressive, moderate, or conservative thresholds for the same factor.
ValueCon β Marc Gerstein's 4-Step Value Connection
Source: Marc H. Gerstein, The Value Connection: A Four-Step Market Screening Method to Match Good Companies with Good Stocks (Wiley Trading, 2003). Gerstein was a senior analyst at Multex.com (later Reuters) and developed this methodology as a systematic framework for finding quality companies trading at reasonable prices β bridging pure value investing and growth at a reasonable price.
βThe goal is not just to find cheap stocks, and it is not just to find quality companies. The goal is to find quality companies whose stocks are also cheap β that is the Value Connection.β
β Marc H. Gerstein, The Value Connection (2003)
The 4-step method is sequential β each step narrows the universe further. A stock must pass all four steps to qualify as a βfull connection.β The power of the method is that it prevents the two classic investor mistakes: buying quality at any price (growth trap) or buying cheap stocks that are cheap for a reason (value trap).
Screen for businesses with durable competitive advantages. Key signals: ROE β₯ 15%, operating margin β₯ 12%, consistent revenue growth. These metrics identify companies earning above their cost of capital.
- β Return on Equity β₯ 15%
- β Operating Margin β₯ 12%
- β Revenue growth positive
- β Earnings quality (not just reported)
Among quality companies, find those priced attractively. Key signals: PE < 20, EV/EBITDA < 14, P/B < 3. Gerstein emphasizes EV/EBITDA as the superior valuation metric because it's capital-structure neutral.
- β PE ratio < 20
- β EV/EBITDA < 14 (preferred)
- β Price/Book < 3
- β PEG ratio < 1.5 for growth
Avoid value traps by requiring price confirmation. A quality, cheap stock that the market is also recognizing (price momentum) reduces the risk of catching a falling knife. Gerstein called this 'the market's vote.'
- β Positive 12-month price momentum
- β OBQ Momentum Score β₯ 50
- β Not in confirmed downtrend
- β JCN Value Momentum blend
Normalize valuation by sector. A PE of 15 is expensive for Utilities but cheap for Technology. Gerstein's final step evaluates the stock relative to its sector peers β our JCN composite scores are already cross-sectionally normalized.
- β OBQ Quality Score β₯ 50 (sector-relative)
- β JCN full composite β₯ 60
- β Value score above sector median
- β No sector-specific red flags
ValueCon 5-Scan System (JCN)
JCN implements Gerstein's methodology as 5 preset scans on the ValueCon tab, covering different combinations and emphasis points of his 4-step framework:
| Preset | Steps Applied | Key Filters | Sort By |
|---|---|---|---|
| Full Connection | All 4 Steps | ROE β₯ 15% + EV/EBITDA < 14 + Rev Growth β₯ 5% + Momentum β₯ 50 | JCN Value Momentum |
| Quality + Value | Steps 1 & 2 | ROE β₯ 15% + Op Margin β₯ 12% + PE < 20 + P/B < 3 | Value Score |
| GARP | Steps 1, 2, 4 | Rev Growth β₯ 10% + EPS Growth β₯ 8% + PEG < 1.5 + Op Margin β₯ 12% | JCN GARP Blend |
| Deep Value | Step 2 + Quality Gate | EV/EBITDA < 10 + P/B < 2 + Quality Score β₯ 50 (no trap filter) | Value Score |
| Value Momentum | Steps 2 & 3 | JCN Value Momentum blend β₯ 70 (cheap + confirmed) | JCN Value Momentum |
Academic grounding: The quality-value combination is supported by Asness, Frazzini & Pedersen βQuality Minus Junkβ (AQR, 2019) which shows quality stocks are persistently underpriced. The value-momentum combination is supported by Asness, Moskowitz & Pedersen βValue and Momentum Everywhereβ (Journal of Finance, 2013) β combining value and momentum is more powerful than either factor alone. GARP methodology is validated by O'Shaughnessy's What Works on Wall Street (4th ed., 2011) β PEG < 1 combined with earnings growth is one of the strongest long-term factor combinations.
No new PROD tables required
ValueCon uses only existing FIELD_MAP fields: ROE, EV/EBITDA, operating margin, PE, P/B, PEG, revenue growth, earnings growth, momentum score, JCN blended composites. All data is already in PROD_EOD_Fundamentals and PROD_JCN_Composite_Scores β no scoring script needed.
SectorSpec β Sector-Specific Screening Philosophy
Cross-sector screens apply the same metrics to all companies β but the most predictive factors differ dramatically by sector. A PE ratio of 30 is cheap for a hypergrowth software company and expensive for a utility. EV/EBITDA is the standard for Energy but meaningless for Banks. SectorSpec applies the academically validated factors that work best within each GICS sector.
The research foundation: Tortoriello (2009) showed that gross margin was the #1 single factor in Technology but nearly irrelevant in Utilities. O'Shaughnessy (2011) showed dividend yield dominated in Staples and REITs. Fama-French (1992) showed book-to-market was strongest in Financials and Real Estate. Sector context changes everything.
Primary sources:
- O'Shaughnessy (2011) β What Works on Wall Street, 4th ed.(Largest historical backtesting study: 40+ years, 50+ factors, all sectors analyzed separately)
- Tortoriello (2009) β Quantitative Strategies for Achieving Alpha (McGraw-Hill)(McGraw-Hill; tested 140+ fundamental and technical factors by GICS sector 1987β2008)
- Fama & French (1992, 1993, 2015) β Three-Factor and Five-Factor Models(Cross-sectional factor research showing sector-varying factor premiums)
- iMarketSignals (2015β2020) β Sector ETF studies: XLK, XLV, XLP, XLI, XLB, XLU(Practical top-5 stock selection within S&P 500 sector ETFs using momentum + fundamentals)
- AQR (Asness et al., 2019) β Quality Minus Junk(Profitability factors work across all sectors but with different magnitudes)
SectorSpec β 11-Sector Screening System (JCN)
Each sector preset locks in gics_sector + applies the empirically strongest 2β3 additional filters for that sector. Sort and priority columns are also sector-optimized.
| Sector | Key Filters | Why These Factors? | Sort |
|---|---|---|---|
| Technology | Gross Margin β₯ 40% + Rev Growth β₯ 8% + Quality β₯ 55 | Gross margin = software moat signal (Tortoriello 2009: #1 factor in Tech). Revenue growth = TAM capture. Platform compounders have both. | JCN Quality Momentum |
| Health Care | Op Margin β₯ 10% + Rev Growth β₯ 6% + D/E β€ 1.0 | Op margin separates commercial-stage from burn-rate biotech. Low debt = optionality for R&D and acquisitions. (Fama-French 2015: profitability factor strongest in HC) | JCN GARP |
| Consumer Staples | Op Margin β₯ 8% + Div Yield β₯ 1.5% + Beta β€ 0.9 | O'Shaughnessy (2011): dividend yield #1 single factor in Staples. Low beta = defensive premium. Op margin = brand pricing power. | JCN QARP |
| Industrials | ROE β₯ 12% + Rev Growth β₯ 5% + D/E β€ 1.5 | ROE = capital allocation quality (asset-heavy sector). D/E cap protects through economic cycle. (Tortoriello 2009: ROE + capex efficiency #1-2 in Industrials) | JCN Full Composite |
| Materials | EV/EBITDA β€ 14 + ROA β₯ 6% + Momentum β₯ 50 | EV/EBITDA best commodity-cycle valuation. Momentum extremely effective in commodity sectors (Tortoriello 2009: price momentum #1 factor in Materials). (Fama-French 1993: value especially strong in Materials) | Momentum Score |
| Utilities | Div Yield β₯ 2.5% + Beta β€ 0.85 + Fin Strength β₯ 50 | Yield IS the return in regulated utilities (O'Shaughnessy 2011). Low beta = defensive premium investors pay. Financial strength avoids leverage blowups. (Tortoriello 2009: fin strength #1 in Utilities) | JCN QARP |
| Energy | EV/EBITDA β€ 8 + Op Margin β₯ 10% + Fin Strength β₯ 45 | EV/EBITDA strips away volatile reported earnings (O'Shaughnessy 2011: strongest valuation factor in Energy). Low-cost producers survive commodity downturns. (Fama-French 2015: profitability + investment factors strong in Energy) | Value Score |
| Financials | ROE β₯ 10% + P/B β€ 2.0 + Quality β₯ 50 | ROE = THE metric for banking (how well is depositor capital deployed?). P/B is standard bank valuation anchor. (O'Shaughnessy 2011: ROE + P/B combination strongest in Financials; Fama-French 1992: book-to-market especially powerful in Financials) | JCN QARP |
| Consumer Discretionary | Rev Growth β₯ 7% + EPS Growth β₯ 8% + Gross Margin β₯ 30% | Consumption cycles drive operating leverage β revenue growth β large EPS expansion for asset-light brands. Gross margin = brand moat durability. (Tortoriello 2009: earnings growth + revenue growth #1-2 in CD) | Growth Score |
| Communication Services | Op Margin β₯ 12% + Rev Growth β₯ 5% + Quality β₯ 50 | Scale businesses β massive fixed costs mean margin expansion flows almost entirely to equity. Quality screen differentiates platform compounders from legacy telecom in secular decline. (Fama-French 2015: profitability factor dominant in platform businesses) | JCN Quality Momentum |
| Real Estate (REITs) | Div Yield β₯ 3.0% + P/B β€ 2.5 + Fin Strength β₯ 45 | REITs must distribute β₯90% of taxable income β yield IS the thesis. P/B approximates NAV discount/premium. Fin strength avoids leverage blowups (highly levered by nature). (O'Shaughnessy 2011: dividend yield dominant; Fama-French 1992: book-to-market strong in RE) | Dividend Yield |
Design principle: Each sector screen uses only existing FIELD_MAP fields β no new PROD tables required. The gics_sector field comes from PROD_DASHBOARD_SNAPSHOT which already contains GICS classifications from EODHD. All filter thresholds are set conservatively to return a meaningful number of stocks (typically 20β80 per sector) rather than an overly restrictive screen that returns 3.
GICS Sector Values in Database
Exact sector strings used: "Information Technology" Β· "Health Care" Β· "Consumer Staples" Β· "Industrials" Β· "Materials" Β· "Utilities" Β· "Energy" Β· "Financials" Β· "Consumer Discretionary" Β· "Communication Services" Β· "Real Estate"
Moat Score β Morningstar 5-Source Competitive Moat Framework
Source: Pat Dorsey, The Little Book That Builds Wealth (Wiley, 2008); Morningstar Economic Moat Methodology (Morningstar, Inc.). An economic moat is a structural competitive advantage that allows a firm to earn above-average returns on invested capital for a sustained period β preventing competitors from eroding those returns.
βWide moat companies have structural advantages so durable that they are likely to fend off competition and earn excess returns for at least 20 years. Narrow moat companies have advantages expected to last at least 10 years. No-moat companies face significant competitive threats.β
β Morningstar Economic Moat Methodology
Morningstar identifies five sources of competitive moat. JCN proxies each source using financial metrics available in the PROD_EOD_Fundamentals database, calibrated against the actual distribution of 9,707 stocks in the investable universe:
Brands, patents, regulatory licenses that let companies charge premium prices. Coca-Cola is sugar water β but consumers pay a premium.
Brand & patent pricing power shows up entirely in gross margin. Commodity businesses can't sustain high gross margins.
When switching is too costly/disruptive for customers. Oracle's integrated databases would cause massive disruption to change.
Sticky customers = pricing power = sustained operating margin even as competitors try to undercut.
Product becomes more valuable as more people use it. CME Group's clearinghouse keeps volume captive through liquidity.
Network effect companies invest heavily in platform development. R&D intensity signals this intent β not perfect, but directional.
Structural cost structure advantages that competitors can't replicate. UPS's ground network has low marginal costs and high returns.
Companies with real cost advantages generate more free cash from each dollar of revenue than competitors can.
Market niche served by one or a few companies β new entrants can't earn adequate returns. Kinder Morgan's pipelines.
Persistent ROE above cost of capital (β₯21%) only occurs when something prevents competition from eroding returns.
Moat Score 0β10 Methodology (JCN)
Each of the 5 moat sources scores 0, 1, or 2 points. The total (0β10) maps to Morningstar's three moat tiers. Thresholds are calibrated from the actual distribution of 9,707 universe stocks.
| Moat Source | Metric | 2 pts (top quartile) | 1 pt (above median) | 0 pts |
|---|---|---|---|---|
| Intangible Assets | Gross Margin | β₯ 65% (p75) | β₯ 44% (p50) | < 44% |
| Switching Costs | Operating Margin | β₯ 28% (p75) | β₯ 16% (p50) | < 16% |
| Network Effect | R&D / Revenue | β₯ 19% (p75 of R&D spenders) | > 0% (any R&D) | 0% or NULL |
| Cost Advantage | FCF Margin | β₯ 24% (p75) | β₯ 10% | < 10% or NULL |
| Efficient Scale | Return on Equity | β₯ 21% (p75 β above CoC) | β₯ 12% (p50 β earning CoC) | < 12% or NULL |
All 5 sources showing strength. Durable competitive advantage expected to last 20+ years. Examples: Microsoft, Apple, Visa, LVMH.
Some competitive advantages present but not across all 5 sources. Competitive position expected to hold 10+ years.
Limited structural advantages. Excess returns likely to erode quickly as competition enters or conditions change.
Important caveats
- β’ R&D proxy is sector-biased β Tech/Biotech score 2 automatically; Retail/Utilities score 0 even with real cost/scale moats
- β’ This is a quantitative proxy β not Morningstar's analyst-assigned moat rating (which requires qualitative judgment)
- β’ Financials ROE is inflated by leverage β interpret moat_score for Banks/Insurance with extra caution
- β’ Requires β₯ 2 non-null metrics to produce a score; companies with sparse data return NULL
Rule Breaker β David Gardner's 6-Sign Framework
Source: David Gardner & Tom Gardner, The Motley Fool Investment Guide(Simon & Schuster, updated ed.). Chapter 20: β6 Signs of a Rule Breaker.β David Gardner co-founded The Motley Fool in 1993 and has managed the Rule Breakers newsletter service since 2004, generating ~97% average return per pick vs. ~56% for the S&P 500 over ~300 recommendations (through 2017, per the book).
βInvesting in great companies early in their high-growth stages, then holding them for the long term, will provide the highest possible returns. Period. We call such companies Rule Breakers.β
β David Gardner, The Motley Fool Investment Guide, Ch. 20
Rule Breakers are companies that disrupt their industries rather than playing by the rules. Gardner identified 6 signs that distinguish true Rule Breakers from βRule Fakersβ β companies that merely look like disruptors. Historical Rule Breakers from the book include Amazon, Netflix, Baidu, Salesforce, and Google β all of which were called βovervaluedβ when Gardner first recommended them (Sign 6 is a positive indicator).
Dominant market share in an important, emerging industry. The company doesn't just participate β it leads. Must be in a growth sector (Tech, Healthcare, Consumer Discretionary, or Communication Services).
Moat via business momentum, patents, visionary leadership, or inept competition. The company can fend off inevitable competitors.
Contrary to buy-low conventional wisdom β a rising stock is Newton law in the market. Winners keep winning. The best growth stocks sustain extended runs.
Visionary leaders with long-term focus. Backed by proven venture investors. Management track record matters more than any single quarter.
Products and reputations that consumers love. A brand that saves customers time and lets the company charge a premium. You cannot screen for brand strength β that is the edge.
The most iconoclastic sign. Being called overvalued by financial media is POSITIVE β it means other investors are on the sidelines. Amazon, Netflix, and Google were all called overvalued when Gardner first recommended them.
Rule Breaker Score 0β10 (JCN)
JCN normalizes the 6-sign score to 0β10. Each sign contributes 0β2 points (except Sign 6 which is binary 0 or 2). The raw sum is scaled by the number of non-null signs available, so stocks with missing data are not penalized unfairly.
| Sign | Metric | 2 pts | 1 pt | 0 pts |
|---|---|---|---|---|
| Sign 1: Top Dog | Sector + Rev Growth + Age | Growth sector + Growth β₯15% + Age β€15yr | Growth sector + Growth β₯8%, OR Growth β₯15% + Age β€20yr | Otherwise |
| Sign 2: Advantage | Gross Margin + Quality Score | GM β₯ 50% AND Quality β₯ 60 | GM β₯ 40% OR Quality β₯ 55 | Otherwise |
| Sign 3: Momentum | 12m Price Return | Return β₯ 25% | Return β₯ 10% | < 10% or NULL |
| Sign 4: Management | SBC % OCF + Cash ROC | SBC < 15% AND ROC > 20% | SBC < 30% OR ROC > 15% | Otherwise / NULL |
| Sign 5: Brand | Gross Margin + Rev Growth | GM β₯ 50% AND Growth β₯ 10% | GM β₯ 40% OR (GM β₯ 35% + Growth β₯ 8%) | Otherwise |
| Sign 6: Overvalued β¨ | P/S + Forward PE | P/S β₯ 8 OR Fwd PE β₯ 35 (POSITIVE!) | β | Neither met |
Scoring formula: rulebreaker_score = ROUND( (sum_of_signs / (2 Γ non_null_signs)) Γ 10 ) β requires β₯ 3 of 6 signs to produce a score. Sign 4 (management) is excluded from the denominator if LongEq data is not available for a stock, preventing low scores for stocks that simply don't have LongEq coverage.
Scores on most of the 6 signs. Growth sector, momentum, high margins, and the market is calling it expensive. Classic David Gardner buy.
Showing several Rule Breaker characteristics. May be missing momentum (Sign 3) or the overvalued signal (Sign 6) hasn't triggered yet.
Limited Rule Breaker characteristics. May be in a non-growth sector, showing weak momentum, or not yet reaching the 'overvalued' stage.
β οΈ Sign 6 Reminder β Contrarian Logic
A high P/S β₯ 8 or forward PE β₯ 35 scores +2 points in this system β not a penalty. Gardner's argument: stocks that are being called βovervaluedβ by financial media still have investors sitting on the sidelines. As the company keeps performing, those skeptics become believers and drive the stock higher. Amazon, Netflix, and Google all had sky-high valuations when first recommended and went on to multiply many times over.