Skip to content
investiDocs

Strategy rules

The default policy, every threshold with its current value, the rules the evaluator emits and how they combine into a verdict.

On this page

Investi's verdicts come from one versioned policy, evaluated by a pure function in packages/core/src/policy.ts. The same inputs and the same policy version always give the same verdict, rule outcomes and fingerprint. The numbers on this page are not typed by hand: they are read from DEFAULT_POLICY and from the policy source when the docs are built, so they always match the code that shipped.

Note: This page shows the defaults. Every threshold is editable in Settings, Strategy rules, and each save creates a new policy version. Your own values apply to your verdicts. A verdict is research output from your rules and public data, not investment advice, and Investi never places an order.

The default policy#

Field Value
Policy name Quality-Velocity Framework v5
Policy id quality-velocity
Version 3
Version tag of the defaults quality-velocity@v3#01a32ab2
Thresholds 56

The default is the Quality-Velocity Framework v5 (quality-velocity): a mean-reversion method with a solvency filter. It looks for financially sound businesses trading near a 52-week low, sizes the position from market cap, liquidity and the market regime, and states an exit target for every name. Verdicts are explained in plain language in Verdicts and the policy.

How a verdict is decided#

The evaluator runs every rule, then picks one verdict in this order. The first match wins, and the rule that decided it (the binding rule) is listed first in the report and used as the summary.

Order Verdict When
1 INSUFFICIENT No usable price or 52-week low, or 3 or more hard rules are UNKNOWN.
2 FLAGGED The filing check found a restatement, auditor change, late filing or listing notice inside the lookback.
3 RED A hard rule failed: solvency, leverage, market cap or liquidity; or your saved answer to the Kodak or legal check is FAIL.
4 DORMANT 14-day ATR is under the floor, or the name is structurally half size and its ATR cannot reach the half-size target.
4a YELLOW, no new money A cap applies: solvency WARN on negative free cash flow, the earnings reaction, your "newly revealed" answer, a portfolio limit, or the crash cap after this buy.
5 YELLOW Price is above the entry gate (a trigger price is given), the market regime is RED, or a hard or gate input is unknown.
6 GREEN Passes the automated quality bar and sits inside the entry gate. Complete the manual checks first.

Manual checks are shown as their own rows with status MANUAL until you save an answer. Without an answer they never count as passes and never change the verdict. With one, they count until the answer expires (see below).

Quality bar#

  • Solvency. Free cash flow and trailing net income are read together (SEC XBRL, trailing twelve months), and the rule prints operating cash flow and capex. Both positive, or one positive and the other unknown or negative earnings with positive free cash flow, passes. Positive earnings with negative free cash flow is a WARN that caps the verdict at YELLOW: earnings alone do not pass a company burning cash. Negative operating cash flow, or both negative, fails. Foreign filers reporting under IFRS (20-F, 40-F) are read from their ifrs-full tags, in their own currency.
  • Leverage. Net debt to EBITDA at or above 4x fails. From 3x up to that ceiling it is on watch. Net cash always passes.
  • Filing flags. An 8-K item 4.02 (non-reliance), item 4.01 (auditor change), item 3.01 (listing notice) or an NT late-filing form within the last 180 days makes the name FLAGGED.
  • Legal and filing scan. The legal check carries evidence: 8-K items 1.02 (agreement terminated), 1.03 (bankruptcy), 2.04 (default), 3.01 (listing notice) and 4.02 (non-reliance), late-filing notices, and dispute, breach, termination, restatement, SEC inquiry, delisting and going-concern language in the latest results release and recent 8-K bodies (above their safe-harbor paragraph), plus headlines that name the company itself. Law-firm investigation releases are dropped unless a suit was filed. Evidence makes the rule WARN; it is MANUAL only when nothing was found.
  • Judgment checks. The business-model test, the legal event and known vs newly revealed. Save an answer with a note and an expiry (90 days by default): a Kodak or legal FAIL is RED, a newly revealed answer caps at YELLOW, a PASS completes the check.

Earnings reaction and guidance#

  • Earnings reaction (cap). The move from the close before the last report to the close of the session after it. A fall of more than 10% while the report is within 10 sessions caps the verdict at YELLOW: "newly revealed, wait 5-10 sessions". A "known" answer saved after the report lifts it.
  • Guidance change. Investi reads EPS guidance from the results press release (the 8-K item 2.02 or 6-K exhibit 99.1) and compares it with the prior release for the same period and basis, then with consensus observed before the report (Nasdaq, Zacks). Growth guidance ("non-GAAP EPS down 26% to 30%") is its own cut. With no guidance figure, the cut is derived from the consensus revisions Investi records daily, and the page says so. A fall no larger than the cut suggests known; a larger fall, or a fall on held or raised guidance, suggests newly revealed. The suggestion is shown on the revealed check; it never decides it.

Your book#

These rules use your portfolio, the policy's position size and your working orders, and print the exact numbers. A fail is a cap: YELLOW with no new money.

  • Held, no second lot. At 1 per name, a name you hold gets no second lot.
  • Consumer discretionary. The share of equity after this buy against the 20% watch line and 25% cap. Over the cap is swap-only.
  • Rate-sensitive cluster. At most 2 names and 1.5 standard positions of value. Casinos: 1 standard position. Miners: 2 names. Latin American financials: 1 name.
  • Crash cap after this buy. (open buys + margin debt + this buy) / equity against the 60% and 75% lines; over the loose line caps.
  • Wash sale (soft). A loss sale of this name within 30 days warns with the date the window clears.
  • Earnings blackout (soft). A working buy order, GTC or GTC+EXT, on a name that reports within 7 days is flagged with the date, here, in the Portfolio working orders table and in the weekly review.

Size and liquidity#

  • Market cap. Under $500M fails. Between $500M and $2B the name is tradeable at half size.
  • Liquidity. The contemplated position (a standard position is $50,000, half of that at half size, or your actual cost if larger) is compared with 30-session average dollar volume. Up to 1% is comfortable, above 2% fails. The thinnest session of the month is a secondary read that can turn a pass into a warning.
  • Half size applies when market cap is in the half-size band, the market regime is YELLOW, the low is still moving, or the low is recent. Half size uses a 2% target, which needs 14-day ATR of at least 3%.
  • Bid-ask spread. Must be under 0.3% of price at order time. The delayed feed often lacks both sides, so this usually shows as a manual check.

Entry gate#

The entry gate is the most a price can sit above its 52-week low and still be a buy. It widens as the stock's own volatility (14-day ATR as a share of price) rises.

14-day ATR Entry gate above the 52-week low
Under 2% Not eligible: DORMANT
2% to under 3% 0 to 6%
3% to 5% 0 to 10%
Above 5% 0 to 15%

Above the gate the verdict is YELLOW and carries a trigger price: the 52-week low times one plus the gate, rounded down to the cent.

Low stability#

These rules change size, never the verdict.

  • New lows. More than 1 new 52-week low in the last 30 days means the low is still moving: wait for two sessions without a new low, buy one tranche, half size.
  • Age of the low. A low set 30 days ago or less means half size. A low older than 90 days that has held marks a full-size candidate.
  • Roll-off. When the current low leaves the 52-week window within 30 days, the report names the low it will become, because the distance above the low will shrink without the price moving.

Exit target#

Every verdict states an exit target. A full position sells when the gain clears the higher of $500 and 1% of cost. A half-size position uses 2% instead. An owned position counts as half size when its cost is at most three quarters of a standard position. There are no stops: owned names at -8% or worse versus cost get no new money, and the position signal turns to REVIEW_RISK.

Market regime#

The regime is checked on the daily close and shown on Home and on every verdict.

  1. IWM closes above its moving average over 50 days.
  2. Of your last 10 buys that are at least 5 sessions old, 6 or more trade at or above their fill price.

Both pass: GREEN, normal sizing. One fails: YELLOW, half-size new buys. Both fail: RED, no new full-size buys, and a name that would be GREEN is shown as YELLOW. Returning to GREEN needs both signals to pass for 3 sessions in a row; moving down is immediate.

Earnings and the 7-day estimate#

The next earnings date is named in every verdict and never blocks. Within 7 days of a company-confirmed report the verdict notes that carrying a position overnight through the print is the risk and that resting buys should switch to plain GTC. An estimated date (the data vendor's projection from past reporting dates) is named as estimated and never triggers that warning, because an estimate can fall after the real report. A vendor date that falls less than 45 days after a report already on record is dropped as stale, and a name that reported in the last 10 days reads "Reported" instead of unknown. See how earnings dates are checked.

GREEN and YELLOW verdicts also carry a banded estimate of clearing the exit target within 7 trading days. It is a structured judgment from four inputs, not a probability model, and unknown inputs widen the band downward.

Input Raises the band Lowers the band
14-day ATR vs the target 3x the target or more Under 1.5x
Distance above the low Under 5% 10% or more
Days since the last earnings release (8-K item 2.02, a 6-K results release, or the vendor's reported date) 20 days or more Under 5 days
Known vs newly revealed (manual) Known Revealed

Portfolio risk#

These lines are shown on Portfolio and in the weekly review. They pause new buys when breached; they never force a sale.

  • Crash-cap ratio: (open buy orders + margin debt) / equity, with reference lines at 60% and 75%.
  • Consumer discretionary: watch above 20% of equity, cap at 25%.
  • Rate-sensitive cluster: at most 2 names and 1.5 standard positions of value. Gaming cluster: 1 standard position.
  • Unrealized-loss band: losses at most 15% of equity, and equity at least 75% of holdings.
  • Underwater share: open cost below cost for more than 60 days. Healthy under 40%, breach above 60%.

Probe lots#

Positions and working orders of 1 shares or fewer are probe or tracking lots (Ignore positions and orders at or under (shares), under Strategy rules in Settings; 0 turns it off). They stay listed on Portfolio, Open orders, GET /api/v1/portfolio, GET /api/v1/orders and the MCP position and order tools with probe: true, and they are left out of every decision surface:

  • the action list (orders to switch, open orders on RED or FLAGGED names, held names reporting soon),
  • Home's What needs attention (at exit target, no new money below cost, order near fill, order status stale, earnings soon),
  • portfolio risk: clusters, the unrealized-loss band, the underwater share, and the crash-cap ratio (open buy notional excludes probe orders),
  • portfolio-aware verdict caps: a probe holding is not "already held", is not cluster exposure, has no below-cost signal, and its probe orders are not working buys,
  • the order risk sweep (cancel, switch to plain GTC, review the gate) and the earnings blackout,
  • the weekly review's to-dos (orders on RED names, held through a print, deepest losers, risky buys, new positions),
  • Sold today (a sale of the probe size or fewer is listed under probesExcluded, not as a row),
  • the MCP tools that return these (get_action_list, get_portfolio_risk, get_weekly_review, order_risk_sweep, get_digest, get_sold_on).

Price alerts are set per ticker by you and are not derived from positions, so they still fire on a probe name. Probe lots stay in market value, equity, realized P/L and the stress test, because the money is real. At the default of 1 share the threshold is left out of the policy fingerprint, so adding it did not mark stored verdicts as made under other rules.

Every threshold#

Generated from DEFAULT_POLICY.thresholds. The key is the name used by GET /api/v1/policy, PUT /api/v1/policy and the MCP tools. Raw values are fractions (0.06 is 6%).

Quality bar#

Key Default Raw Meaning
maxNetDebtToEbitda 4x 4 Net debt / EBITDA at or above this is a solvency fail.
watchNetDebtToEbitda 3x 3 Net debt / EBITDA at or above this (and under the max) is on watch.
filingFlagLookbackDays 180 days 180 Restatement, auditor change, late filing or listing notice within this many days flags the name.

Size and liquidity#

Key Default Raw Meaning
minMarketCap $500M 500000000 Market cap floor. Under it the market cap rule fails.
halfSizeMarketCap $2B 2000000000 Market cap under this (and above the floor) takes half size.
standardPositionSize $50,000 50000 A standard full position, in dollars. Liquidity and exit targets are sized from it.
maxAdvShare 1% 0.01 Position as a share of 30-session average dollar volume: comfortable up to this.
hardMaxAdvShare 2% 0.02 Absolute ceiling on position / average dollar volume.

Entry gate scaled to 14-day ATR#

Key Default Raw Meaning
minAtrPct 2% 0.02 14-day ATR floor. Under it the name is DORMANT.
atrBand1Pct 3% 0.03 Upper edge of the first ATR band. Picks which entry gate applies.
atrBand2Pct 5% 0.05 Upper edge of the second ATR band. Above it the widest gate applies.
gateBand1Pct 6% 0.06 Entry gate (max distance above the 52-week low) when ATR is between the floor and band 1.
gateBand2Pct 10% 0.1 Entry gate when ATR is between band 1 and band 2.
gateBand3Pct 15% 0.15 Entry gate when ATR is above band 2.

Low stability#

Key Default Raw Meaning
lowLookbackDays 30 days 30 Window, in days, for counting new 52-week lows.
maxStableNewLows 1 1 More new lows than this inside the window means the low is still moving (half size).
recentLowDays 30 days 30 A 52-week low set this many days ago or less is recent (half size).
matureLowDays 90 days 90 A low older than this that has held marks a full-size candidate.
rollOffWarnDays 30 days 30 Warn when the current low leaves the 52-week window within this many days.

Exit#

Key Default Raw Meaning
exitMinDollars $500 500 Dollar floor for a full position's exit target.
exitFullPct 1% 0.01 Percentage floor for a full position's exit target. The target is the higher of the two floors.
exitHalfPct 2% 0.02 Exit target for a half-size position.
halfSizeMinAtrPct 3% 0.03 ATR a half-size position needs to reach its target. A structurally half-size name under it is DORMANT.
noNewMoneyBelowCostPct -8% -0.08 Owned positions this far below cost get no new money. Negative.

Market regime#

Key Default Raw Meaning
regimeMaDays 50 days 50 Moving average length for the regime index (IWM).
regimeBuysWindow 10 10 How many of your most recent buys the regime looks at.
regimeBuysAtOrAbove 6 6 How many of those buys must trade at or above their fill price.
regimeBuyMinAgeSessions 5 sessions 5 A buy counts toward the regime only once it is this many sessions old.
regimeConfirmSessions 3 sessions 3 Sessions in a row the regime needs before it returns to GREEN.

7-day estimate inputs#

Key Default Raw Meaning
estAtrRaiseMultiple 3x 3 ATR at or above this multiple of the exit target raises the 7-day estimate.
estAtrLowerMultiple 1.5x 1.5 ATR under this multiple of the exit target lowers the 7-day estimate.
estNearLowPct 5% 0.05 Closer than this to the 52-week low raises the 7-day estimate.
estFarLowPct 10% 0.1 At least this far above the low lowers the 7-day estimate.
estEarningsRaiseDays 20 days 20 At least this many days since the last earnings release raises the 7-day estimate.
estEarningsLowerDays 5 days 5 Fewer days than this since earnings lowers the 7-day estimate.
earningsSoonDays 7 days 7 Earnings within this many days is called out, and a working buy that would rest through the report is flagged.
earningsReactionDropPct 10% 0.1 A fall larger than this across the last report caps the verdict at YELLOW (newly revealed, wait 5-10 sessions).
earningsReactionSessions 10 sessions 10 The earnings-reaction cap applies while the report is within this many trading sessions.
maxSpreadPct 0.3% 0.003 Bid-ask spread must be under this share of price at order time.

Portfolio risk#

Key Default Raw Meaning
crashCapStrict 60% 0.6 Strict crash-cap line: (open buys + margin debt) / equity at or under it is OK.
crashCapLoose 75% 0.75 Loose crash-cap line: above the strict line and at or under this is WATCH; above it is BREACH.
consumerDiscretionaryWarn 20% 0.2 Consumer discretionary share of equity above this is WATCH.
consumerDiscretionaryMax 25% 0.25 Consumer discretionary share above this is BREACH; new consumer names become swap-only.
rateSensitiveMaxNames 2 2 Most rate-sensitive names you can hold at once.
rateSensitiveMaxPositions 1.5 standard positions 1.5 Rate-sensitive cluster value cap, in standard positions.
gamingMaxPositions 1 standard position 1 Gaming cluster value cap, in standard positions (one exposure).
minersMaxNames 2 2 Most mining names held at once.
latamFinancialsMaxNames 1 1 Most Latin American financials held at once.
maxLotsPerName 1 1 Lots per name: at 1, a name already held gets no second lot.
washSaleDays 30 days 30 A buy within this many days of a loss sale is a wash sale (the loss is deferred into the new lot).
unrealizedLossMax 15% 0.15 Losing positions' unrealized loss as a share of equity. Above it is BREACH, which pauses new buys.
minEquityToHoldings 75% 0.75 Equity as a share of holdings must stay at or above this.
underwaterDays 60 days 60 A lot below cost for longer than this many days counts as underwater.
underwaterHealthy 40% 0.4 Underwater share of open cost under this is healthy.
underwaterWarn 60% 0.6 Underwater share of open cost above this is BREACH.
probeMaxShares 1 1 Probe lots: positions and working orders of this many shares or fewer (1 by default) are the owner's tracking lots. They stay listed (tagged probe) but are left out of every decision surface: actions, attention items, risk and crash-cap counts, verdict caps, sweeps, reviews. 0 turns the rule off.

Every rule#

Generated from the evaluator source. Severity decides how a rule can affect the verdict: hard fails make it RED (FLAGGED for filings), zone covers the ATR floor and entry gate, soft changes size and timing, manual is never automated, and info is context every verdict carries.

Rule id Label Severity
quality.solvency Solvency hard
quality.leverage Net debt / EBITDA hard
quality.filings Restatement and late-filing flags hard
manual.kodak Business model intact (Kodak test) manual
size.market_cap Market cap hard
stability.new_lows New lows in the last 30 days soft
stability.low_date Date of the 52-week low soft
stability.roll_off Low rolling off the window soft
regime.state Market regime soft
size.liquidity Liquidity hard
gate.atr 14-day ATR zone
gate.entry Entry gate zone
size.half_atr ATR for a half-size target soft
info.spread Bid-ask spread info, manual
manual.revealed Known vs newly revealed manual
info.earnings Earnings date info
timing.earnings_reaction Earnings reaction cap
timing.earnings_blackout Earnings blackout soft
book.second_lot Held / second lot cap
book.consumer_discretionary Consumer discretionary cap cap
book.rate_sensitive Rate-sensitive cluster cap
book.gaming Casino exposure cap
book.miners Miners cap
book.latam_financials Latin American financials cap
book.crash_cap Crash cap after this buy cap
book.wash_sale Wash-sale window soft
info.exit Exit target info
info.estimate 7-day estimate info
manual.legal Live legal or regulatory event manual

Policy versions#

Generated from POLICY_CHANGES in the policy source.

Version 3 (2026-11-04)#

  • New rule timing.earnings_reaction (cap): a fall of more than earningsReactionDropPct across the last report, within earningsReactionSessions trading sessions, caps the verdict at YELLOW: newly revealed, wait 5-10 sessions. A saved answer of known (made after the report) lifts it.
  • quality.solvency uses free cash flow and earnings together and shows capex: negative free cash flow with positive earnings is a WARN that caps the verdict at YELLOW; negative operating cash flow fails.
  • manual.legal carries evidence from a legal and filing scan (8-K items 1.02, 1.03, 2.04, 3.01, 4.02, late-filing notices, dispute, breach, termination, restatement, SEC inquiry, delisting and going-concern language in filings and company headlines): WARN with evidence, MANUAL only when nothing was found.
  • manual.revealed suggests known or newly revealed from the guidance change: latest guidance vs the prior release and consensus, drop size vs cut size.
  • Saved answers to the manual checks (manual.kodak, manual.legal, manual.revealed) feed the verdict until they expire: a Kodak or legal FAIL is RED, a revealed FAIL caps at YELLOW, a PASS completes the check.
  • Portfolio-aware rules (cap): book.second_lot, book.consumer_discretionary, book.rate_sensitive, book.gaming, book.miners, book.latam_financials and book.crash_cap, each with the exact numbers after the policy's position size; book.wash_sale (soft) warns inside washSaleDays of a loss sale.
  • New rule timing.earnings_blackout (soft): a working buy order on a name that reports within earningsSoonDays is flagged with the date.
  • New thresholds: earningsReactionDropPct, earningsReactionSessions, minersMaxNames, latamFinancialsMaxNames, maxLotsPerName, washSaleDays.

Version 2 (2026-11-02)#

  • Quality-Velocity Framework v5 replaces the v1 low-zone-reversion policy: ATR-scaled entry gate, solvency filter, filing flags, sizing, exit target, 7-day estimate and the market regime.

Reading and changing the policy#

  • In the app: Settings, Strategy rules.
  • Over REST: GET /api/v1/policy returns the current version; PUT /api/v1/policy saves a new one (signed-in session only). See the REST API.
  • Over MCP: get_research_verdict and compare_verdicts report the policy version tag that produced each verdict. See Claude MCP.

The version tag has the form id@vN#xxxxxxxx, where the last part is a fingerprint of the thresholds. Changing any threshold changes the tag, so every stored verdict records exactly which rules produced it.