Use cases · Institutions
Index provider: 20 ways to use Ora
Rules-based selection screens, rebalance checks and corporate-action flags. Each example is a complete, runnable request with the real answers it returned (35 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.
ora-fin-0.1.1. Another model changes the request JSON and the Playground link; run it there to see its answers.Rule functions and facts used by this player (62)
sma 6max 4offset 3roc 3avg 2cut_last 2pays_dividend 2reverse_split_last 2abs 2atr 2ref 2years_of_growth 1div_ttm 1div_yield_ttm 1days_since_split 1days_to_split 1splits_5y 1days_since_earnings 1days_to_earnings 1last_earnings_move 1next_report_bmo 1log 1sqrt 1std 1crossdown 1crossup 1mean 1rsi 1median 1beats_last4 1eps_growth_yoy 1last_eps 1misses_last4 1revenue_growth_yoy 1days_since_reverse_split 1highest 1inside_bar 1outside_bar 1tr 1lowestbars 1min 1dragonfly_doji 1gravestone_doji 1hammer 1inverted_hammer 1marubozu 1tweezer_top 1days_since_ex_div 1days_to_ex_div 1last_div_amount 1next_div_amount 1adx 1diminus 1diplus 1stochd 1stochk 1hlc3 1ohlc4 1rec 1rma 1swinghigh 1swinglow 1
Examples 1–10 of 20 · page 1 of 2
Index provider · example 1
Momentum index selection screen on AAPL, NVDA, LLY
A rules-based momentum index admits names with positive 3-month momentum near their highs. Run the screen on candidates exactly as the methodology states it.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AAPL"} then NVDA, LLY, one request each. The server fills in the latest completed session.
Questions
leader | rule | roc(C, 63) > 10 and C >= 0.95 * max(H, 63)Up more than 10% in a quarter, near the high |
three_month | rule | C > C[-63]Higher than three months ago |
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
liquid | rule | avg(C * V, 20) > 100000000Trades more than $100 million a day |
Answers
| Symbol | leaderrule | three_monthrule | near_highrule | liquidrule |
|---|---|---|---|---|
AAPL | 0.7996 | 0.9442 | 0.4962 | 0.9463 |
NVDA | 0.0537 | 0.4138 | 0.0537 | 0.9463 |
LLY | 0.8246 | 0.9463 | 0.4572 | 0.9463 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 3 symbols: Up more than 10% in a quarter, near the high: true for AAPL, LLY of 3. Higher than three months ago: true for AAPL, LLY of 3. Within 2% of the 52-week high: true for none of 3. Trades more than $100 million a day: true for AAPL, NVDA, LLY of 3.
Each rule is the methodology written down: a name qualifies only when the rules are true, and the forecast model is never part of selection.
Request JSON (AAPL; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "AAPL"
},
"questions": {
"leader": {
"type": "yes_no",
"ask": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)"
},
"three_month": {
"type": "yes_no",
"ask": "C > C[-63]"
},
"near_high": {
"type": "yes_no",
"ask": "C >= 0.98 * max(H, 252)"
},
"liquid": {
"type": "yes_no",
"ask": "avg(C * V, 20) > 100000000"
}
}
}Response JSON (AAPL, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"leader": {
"yes_no": 0.7996,
"rule": "roc(C, 63) > 10 and C >= 0.95 * max(H, 63)",
"basis": "rule"
},
"three_month": {
"yes_no": 0.9442,
"rule": "C > C[-63]",
"basis": "rule"
},
"near_high": {
"yes_no": 0.4962,
"rule": "C >= 0.98 * max(H, 252)",
"basis": "rule"
},
"liquid": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 100000000",
"basis": "rule"
}
},
"context": {
"symbol": "AAPL",
"as_of": "2026-10-30"
}
}Index provider · example 2
Dividend growth index eligibility: KO, PG, JNJ
Check consecutive years of dividend growth and the absence of a cut for each constituent before the annual reconstitution.
- State3 symbols
- Questions4 asked
- Answersreal, captured
- Actions1 rule · dry run
State
{"symbol":"KO"} then PG, JNJ, one request each. The server fills in the latest completed session.
Questions
grow25 | English → rule | Has the stock grown its dividend for 25 years in a row? |
grow10 | rule | years_of_growth >= 10Ten years of dividend growth |
no_cut | rule | cut_last < 0.5Did not cut its last dividend |
pays | rule | pays_dividend > 0.5Pays a dividend |
Answers
| Symbol | grow25rule | grow10rule | no_cutrule | paysrule | Fired |
|---|---|---|---|---|---|
KO | 0.0683 | 0.9463 | 0.8591 | 0.8591 | review |
PG | 0.9463 | 0.9463 | 0.8591 | 0.8591 | none |
JNJ | 0.9463 | 0.9463 | 0.8591 | 0.8591 | none |
true false not known for rules; forecasts are odds. Hover a column for its question.
Actions
Rules on the answers decide what to send. Each symbol runs its own request, so each one can fire.
grow25 < 0.4→Webhookmethodology-queue{
"constituent": "KO",
"as_of": "2026-10-30",
"check": "dividend_growth_25y",
"p_pass": 0.0683,
"p_no_cut": 0.8591,
"action": "committee_review"
}What it means
Session of 2026-10-30, 3 symbols: Has the stock grown its dividend for 25 years in a row: true for PG, JNJ of 3. Ten years of dividend growth: true for KO, PG, JNJ of 3. Did not cut its last dividend: true for KO, PG, JNJ of 3. Pays a dividend: true for KO, PG, JNJ of 3. review fired for KO.
years_of_growth counts calendar-year totals, so an extra or missing payment can break a run; a failing name goes to the committee queue for a human decision, not straight out of the index.
Request JSON (KO; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "KO"
},
"questions": {
"grow25": {
"type": "yes_no",
"instructions": "Has the stock grown its dividend for 25 years in a row?"
},
"grow10": {
"type": "yes_no",
"ask": "years_of_growth >= 10"
},
"no_cut": {
"type": "yes_no",
"ask": "cut_last < 0.5"
},
"pays": {
"type": "yes_no",
"ask": "pays_dividend > 0.5"
}
},
"actions": [
{
"id": "review",
"when": "grow25 < 0.4",
"do": "webhook",
"connection": "methodology-queue",
"body": {
"constituent": "{{symbol}}",
"as_of": "{{as_of}}",
"check": "dividend_growth_25y",
"p_pass": "{{grow25}}",
"p_no_cut": "{{no_cut}}",
"action": "committee_review"
}
}
],
"dry_run": true
}Response JSON (KO, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"grow25": {
"yes_no": 0.0683,
"rule": "years_of_growth >= 25",
"basis": "pattern"
},
"grow10": {
"yes_no": 0.9463,
"rule": "years_of_growth >= 10",
"basis": "rule"
},
"no_cut": {
"yes_no": 0.8591,
"rule": "cut_last < 0.5",
"basis": "rule"
},
"pays": {
"yes_no": 0.8591,
"rule": "pays_dividend > 0.5",
"basis": "rule"
}
},
"context": {
"symbol": "KO",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "review",
"fired": true,
"status": "dry_run",
"do": "webhook",
"connection": "methodology-queue",
"preview": {
"body": {
"constituent": "KO",
"as_of": "2026-10-30",
"check": "dividend_growth_25y",
"p_pass": 0.0683,
"p_no_cut": 0.8591,
"action": "committee_review"
}
}
}
]
}Index provider · example 3
High-dividend index screen: XOM, VZ, MO, PM
Admit the highest trailing yields, but screen out names that just cut. Run the yield and cut rules on candidates.
- State4 symbols
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"XOM"} then VZ, MO, PM, one request each. The server fills in the latest completed session.
Questions
yield3 | rule | div_yield_ttm > 3Yield above 3% |
cut | English → rule | Did the stock cut its dividend last time? |
div2 | English → rule | Has the stock paid more than $2 per share in dividends over the past year? |
trend | English → rule | Is the stock above its 200-day moving average? |
Answers
| Symbol | yield3rule | cutrule | div2rule | trendrule |
|---|---|---|---|---|
XOM | 0.0537 | 0.1409 | 0.9463 | 0.9463 |
VZ | 0.9463 | 0.1409 | 0.9456 | 0.3448 |
MO | 0.9463 | 0.1409 | 0.9463 | 0.9463 |
PM | 0.355 | 0.1409 | 0.9463 | 0.9463 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 4 symbols: Yield above 3%: true for VZ, MO of 4. Did the stock cut its dividend last time: true for none of 4. Has the stock paid more than $2 per share in dividends over the past year: true for XOM, VZ, MO, PM of 4. Is the stock above its 200-day moving average: true for XOM, MO, PM of 4.
Yield above the threshold with no recent cut is eligible; a cut is the standard exclusion trigger in high-yield methodologies.
Request JSON (XOM; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "XOM"
},
"questions": {
"yield3": {
"type": "yes_no",
"ask": "div_yield_ttm > 3"
},
"cut": {
"type": "yes_no",
"instructions": "Did the stock cut its dividend last time?"
},
"div2": {
"type": "yes_no",
"instructions": "Has the stock paid more than $2 per share in dividends over the past year?"
},
"trend": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
}
}
}Response JSON (XOM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"yield3": {
"yes_no": 0.0537,
"rule": "div_yield_ttm > 3",
"basis": "rule"
},
"cut": {
"yes_no": 0.1409,
"rule": "cut_last > 0.5",
"basis": "pattern"
},
"div2": {
"yes_no": 0.9463,
"rule": "div_ttm > 2",
"basis": "pattern"
},
"trend": {
"yes_no": 0.9463,
"rule": "C > sma(C, 200)",
"basis": "comparison"
}
},
"context": {
"symbol": "XOM",
"as_of": "2026-10-30"
}
}Index provider · example 4
Corporate-action flag: is an NVDA split recent or announced?
Splits change divisors and share counts. Flag any announced or recent split for the corporate-actions team.
- StateNVDA
- Questions4 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
announced | rule | days_to_split <= 365A split is announced |
recent | English → rule | Has the stock split in the past three months? |
reverse | rule | reverse_split_last > 0.5Last split was a reverse split |
multi | rule | splits_5y >= 2Two or more splits in five years |
Answers
| Question | Answer | Reading |
|---|---|---|
announcedA split is announced | 0.0537 | false |
recentHas the stock split in the past three months compiled to days_since_split <= 91 | 0.0537 | false |
reverseLast split was a reverse split | 0.1409 | false |
multiTwo or more splits in five years | 0.1409 | false |
Actions
Rules on the answers decide what to send.
announced >= 0.6 or recent >= 0.6→Webhookcorporate-actionselse→Slackindex-ops{
"text": "NVDA (2026-10-30): no split recent or announced."
}What it means
For NVDA on the session of 2026-10-30: Not true: A split is announced; Has the stock split in the past three months; Last split was a reverse split; Two or more splits in five years. Fired: clear (Slack → index-ops).
A split recent or announced opens a ticket so the divisor adjustment is never missed; otherwise the ops channel logs a clear.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "NVDA"
},
"questions": {
"announced": {
"type": "yes_no",
"ask": "days_to_split <= 365"
},
"recent": {
"type": "yes_no",
"instructions": "Has the stock split in the past three months?"
},
"reverse": {
"type": "yes_no",
"ask": "reverse_split_last > 0.5"
},
"multi": {
"type": "yes_no",
"ask": "splits_5y >= 2"
}
},
"actions": [
{
"id": "ca_ticket",
"when": "announced >= 0.6 or recent >= 0.6",
"do": "webhook",
"connection": "corporate-actions",
"body": {
"symbol": "{{symbol}}",
"as_of": "{{as_of}}",
"event": "split",
"p_announced": "{{announced}}",
"p_recent": "{{recent}}",
"task": "adjust_divisor_and_shares"
}
},
{
"id": "clear",
"when": "else",
"do": "slack",
"connection": "index-ops",
"message": "{{symbol}} ({{as_of}}): no split recent or announced."
}
],
"dry_run": true
}Response JSON (NVDA, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"announced": {
"yes_no": 0.0537,
"rule": "days_to_split <= 365",
"basis": "rule"
},
"recent": {
"yes_no": 0.0537,
"rule": "days_since_split <= 91",
"basis": "pattern"
},
"reverse": {
"yes_no": 0.1409,
"rule": "reverse_split_last > 0.5",
"basis": "rule"
},
"multi": {
"yes_no": 0.1409,
"rule": "splits_5y >= 2",
"basis": "rule"
}
},
"context": {
"symbol": "NVDA",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "ca_ticket",
"fired": false,
"status": "skipped"
},
{
"id": "clear",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "index-ops",
"preview": {
"text": "NVDA (2026-10-30): no split recent or announced."
}
}
]
}Index provider · example 5
Rebalance week: does JPM report in the next 10 days?
A rebalance trade into a name that reports days later adds event risk for trackers. Check a large constituent's earnings timing against the rebalance date.
- StateJPM
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"JPM"} The server fills in the latest completed session.
Questions
earn10 | rule | days_to_earnings <= 10Reports earnings within 10 days |
bmo | English → rule | Does the stock report before the market opens next time? |
recent | rule | days_since_earnings <= 5Reported in the last 5 days |
big_react | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
Answers
| Question | Answer | Reading |
|---|---|---|
earn10Reports earnings within 10 days | 0.0537 | false |
bmoDoes the stock report before the market opens next time compiled to next_report_bmo > 0.5 | 0.8591 | true |
recentReported in the last 5 days | 0.0537 | false |
big_reactLast earnings move bigger than 5% | 0.0664 | false |
What it means
For JPM on the session of 2026-10-30: True now: Does the stock report before the market opens next time. Not true: Reports earnings within 10 days; Reported in the last 5 days; Last earnings move bigger than 5%.
This informs the rebalance notice to licensees; the index rules do not change, the communication does.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "JPM"
},
"questions": {
"earn10": {
"type": "yes_no",
"ask": "days_to_earnings <= 10"
},
"bmo": {
"type": "yes_no",
"instructions": "Does the stock report before the market opens next time?"
},
"recent": {
"type": "yes_no",
"ask": "days_since_earnings <= 5"
},
"big_react": {
"type": "yes_no",
"ask": "abs(last_earnings_move) > 5"
}
}
}Response JSON (JPM, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"earn10": {
"yes_no": 0.0537,
"rule": "days_to_earnings <= 10",
"basis": "rule"
},
"bmo": {
"yes_no": 0.8591,
"rule": "next_report_bmo > 0.5",
"basis": "pattern"
},
"recent": {
"yes_no": 0.0537,
"rule": "days_since_earnings <= 5",
"basis": "rule"
},
"big_react": {
"yes_no": 0.0664,
"rule": "abs(last_earnings_move) > 5",
"basis": "rule"
}
},
"context": {
"symbol": "JPM",
"as_of": "2026-10-30"
}
}abs days_since_earnings days_to_earnings last_earnings_move next_report_bmo
Index provider · example 6
Low-volatility index screen: does PG qualify?
Select the calmest names by realized volatility and ATR, written as exact rules, and test one candidate.
- StatePG
- Questions4 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"PG"} The server fills in the latest completed session.
Questions
hv_low | English → rule | Is 20-day historical volatility below 20%? |
atr_low | English → rule | Is the 14-day ATR less than 2% of the price? |
std | rule | std(log(C / C[-1]), 60) * sqrt(252) < 0.260-day realized volatility under 20%, annualized |
vol_rise | forecast | Will volatility rise over the next 5 days? Volatility rising over 5 days |
Answers
| Question | Answer | Reading |
|---|---|---|
hv_lowIs 20-day historical volatility below 20% compiled to std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2 | 0.0873 | false |
atr_lowIs the 14-day ATR less than 2% of the price compiled to atr(14) / C < 0.02 | 0.7818 | true |
std60-day realized volatility under 20%, annualized | 0.6133 | true |
vol_riseVolatility rising over 5 days | 0.208 | 21% · unlikely |
What it means
For PG on the session of 2026-10-30: True now: Is the 14-day ATR less than 2% of the price; 60-day realized volatility under 20%, annualized. Not true: Is 20-day historical volatility below 20%. Forecasts: Volatility rising over 5 days 21%.
Selection uses the three exact volatility rules; the forecast is shown to licensees as context only.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "PG"
},
"questions": {
"hv_low": {
"type": "yes_no",
"instructions": "Is 20-day historical volatility below 20%?"
},
"atr_low": {
"type": "yes_no",
"instructions": "Is the 14-day ATR less than 2% of the price?"
},
"std": {
"type": "yes_no",
"ask": "std(log(C / C[-1]), 60) * sqrt(252) < 0.2"
},
"vol_rise": {
"type": "yes_no",
"instructions": "Will volatility rise over the next 5 days?"
}
}
}Response JSON (PG, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"hv_low": {
"yes_no": 0.0873,
"rule": "std(log(C / C[-1]), 20) * sqrt(20 / 19) * sqrt(252) < 0.2",
"basis": "pattern"
},
"atr_low": {
"yes_no": 0.7818,
"rule": "atr(14) / C < 0.02",
"basis": "pattern"
},
"std": {
"yes_no": 0.6133,
"rule": "std(log(C / C[-1]), 60) * sqrt(252) < 0.2",
"basis": "rule"
},
"vol_rise": {
"yes_no": 0.208
}
},
"context": {
"symbol": "PG",
"as_of": "2026-10-30"
}
}Index provider · example 7
Trend-following index: SPY risk-on or risk-off this month?
A trend index holds equities above the 200-day and moves to bills below it. Compute the switch exactly, and log it.
- StateSPY
- Questions5 asked
- Answersreal, captured
- Actions3 rules · dry run
State
{"symbol":"SPY"} The server fills in the latest completed session.
Questions
risk_on | English → rule | Is the stock above its 200-day moving average? |
cross_dn | rule | crossdown(C, sma(C, 200))Crossed below the 200-day today |
cross_up | rule | crossup(C, sma(C, 200))Crossed above the 200-day today |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
risk_onIs the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9451 | true |
cross_dnCrossed below the 200-day today | 0.05 | false |
cross_upCrossed above the 200-day today | 0.05 | false |
drawdownMore than 20% off the 52-week high | 0.0537 | false |
drop5A 5% drawdown within a month | 0.203 | 20% · unlikely |
Actions
Rules on the answers decide what to send.
cross_dn >= 0.6→Webhookindex-calccross_up >= 0.6→Webhookindex-calcelse→Slackindex-ops{
"text": "SPY (2026-10-30): no 200-day cross; trend index holds (above the 200-day 95%)."
}What it means
For SPY on the session of 2026-10-30: True now: Is the stock above its 200-day moving average. Not true: Crossed below the 200-day today; Crossed above the 200-day today; More than 20% off the 52-week high. Forecasts: A 5% drawdown within a month 20%. Fired: hold (Slack → index-ops).
Only a cross changes the index state; every other day the calculation agent gets a hold message for the audit trail.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SPY"
},
"questions": {
"risk_on": {
"type": "yes_no",
"instructions": "Is the stock above its 200-day moving average?"
},
"cross_dn": {
"type": "yes_no",
"ask": "crossdown(C, sma(C, 200))"
},
"cross_up": {
"type": "yes_no",
"ask": "crossup(C, sma(C, 200))"
},
"drawdown": {
"type": "yes_no",
"ask": "C < 0.8 * max(H, 252)"
},
"drop5": {
"type": "yes_no",
"instructions": "Will it drop at least 5% at some point in the next month?"
}
},
"actions": [
{
"id": "switch_off",
"when": "cross_dn >= 0.6",
"do": "webhook",
"connection": "index-calc",
"body": {
"index": "trend-us-large",
"signal": "risk_off",
"underlying": "{{symbol}}",
"as_of": "{{as_of}}",
"p_cross": "{{cross_dn}}"
}
},
{
"id": "switch_on",
"when": "cross_up >= 0.6",
"do": "webhook",
"connection": "index-calc",
"body": {
"index": "trend-us-large",
"signal": "risk_on",
"underlying": "{{symbol}}",
"as_of": "{{as_of}}",
"p_cross": "{{cross_up}}"
}
},
{
"id": "hold",
"when": "else",
"do": "slack",
"connection": "index-ops",
"message": "{{symbol}} ({{as_of}}): no 200-day cross; trend index holds (above the 200-day {{risk_on|pct}})."
}
],
"dry_run": true
}Response JSON (SPY, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"risk_on": {
"yes_no": 0.9451,
"rule": "C > sma(C, 200)",
"basis": "comparison"
},
"cross_dn": {
"yes_no": 0.05,
"rule": "crossdown(C, sma(C, 200))",
"basis": "rule"
},
"cross_up": {
"yes_no": 0.05,
"rule": "crossup(C, sma(C, 200))",
"basis": "rule"
},
"drawdown": {
"yes_no": 0.0537,
"rule": "C < 0.8 * max(H, 252)",
"basis": "rule"
},
"drop5": {
"yes_no": 0.203
}
},
"context": {
"symbol": "SPY",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "switch_off",
"fired": false,
"status": "skipped"
},
{
"id": "switch_on",
"fired": false,
"status": "skipped"
},
{
"id": "hold",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "index-ops",
"preview": {
"text": "SPY (2026-10-30): no 200-day cross; trend index holds (above the 200-day 95%)."
}
}
]
}Index provider · example 8
RSP vs SPY: is the equal-weight index keeping up?
Monitor breadth by comparing the equal-weight and cap-weight S&P funds on the same rules for the monthly index commentary.
- State2 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"RSP"} then SPY, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > sma(C, 50)Above the 50-day average |
roc | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
mean | rule | C > mean(C, 100)Above its 100-day mean |
rsi50 | rule | rsi(C, 14) > 50RSI above 50 |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | rocrule | meanrule | rsi50rule | beat_spyforecast |
|---|---|---|---|---|---|
RSP | 0.7858 | 0.3398 | 0.7606 | 0.8288 | 0.446 |
SPY | 0.1128 | 0.0537 | 0.3575 | 0.0919 | 0.514 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 2 symbols: Above the 50-day average: true for RSP of 2. Up more than 5% in 20 sessions: true for none of 2. Above its 100-day mean: true for RSP of 2. RSI above 50: true for RSP of 2. Highest odds for “Beating SPY over a month”: SPY at 51%.
When equal weight fails the trend rules while cap weight passes, the commentary describes a narrow market.
Request JSON (RSP; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "RSP"
},
"questions": {
"trend": {
"type": "yes_no",
"ask": "C > sma(C, 50)"
},
"roc": {
"type": "yes_no",
"ask": "roc(C, 20) > 5"
},
"mean": {
"type": "yes_no",
"ask": "C > mean(C, 100)"
},
"rsi50": {
"type": "yes_no",
"ask": "rsi(C, 14) > 50"
},
"beat_spy": {
"type": "yes_no",
"instructions": "Will it beat SPY over the next month?"
}
}
}Response JSON (RSP, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"trend": {
"yes_no": 0.7858,
"rule": "C > sma(C, 50)",
"basis": "rule"
},
"roc": {
"yes_no": 0.3398,
"rule": "roc(C, 20) > 5",
"basis": "rule"
},
"mean": {
"yes_no": 0.7606,
"rule": "C > mean(C, 100)",
"basis": "rule"
},
"rsi50": {
"yes_no": 0.8288,
"rule": "rsi(C, 14) > 50",
"basis": "rule"
},
"beat_spy": {
"yes_no": 0.446
}
},
"context": {
"symbol": "RSP",
"as_of": "2026-10-30"
}
}Index provider · example 9
Liquidity eligibility: does SMCI trade enough for the index?
Index rules require minimum traded value. Check average and median dollar volume for a small-cap candidate.
- StateSMCI
- Questions4 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"SMCI"} The server fills in the latest completed session.
Questions
liquid50 | English → rule | Does the stock trade more than $50 million a day on average? |
liquid100 | rule | avg(C * V, 20) > 100000000Trades more than $100 million a day |
median | rule | median(C * V, 20) > 50000000Median daily traded value over 20 days above $50 million |
vol_dry | rule | V < 0.6 * avg(V, 20)Volume under 60% of normal |
Answers
| Question | Answer | Reading |
|---|---|---|
liquid50Does the stock trade more than $50 million a day on average compiled to avg(C * V, 20) > 50000000 | 0.9463 | true |
liquid100Trades more than $100 million a day | 0.9463 | true |
medianMedian daily traded value over 20 days above $50 million | 0.9463 | true |
vol_dryVolume under 60% of normal | 0.1739 | false |
Actions
Rules on the answers decide what to send.
liquid50 < 0.4 or median < 0.4→Webhookmethodology-queueelse→Slackindex-ops{
"text": "SMCI (2026-10-30) passes liquidity (average 95%, median 95%)."
}What it means
For SMCI on the session of 2026-10-30: True now: Does the stock trade more than $50 million a day on average; Trades more than $100 million a day; Median daily traded value over 20 days above $50 million. Not true: Volume under 60% of normal. Fired: pass (Slack → index-ops).
Average and median traded value together guard against one heavy day making a thin name look liquid.
Request JSON
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "SMCI"
},
"questions": {
"liquid50": {
"type": "yes_no",
"instructions": "Does the stock trade more than $50 million a day on average?"
},
"liquid100": {
"type": "yes_no",
"ask": "avg(C * V, 20) > 100000000"
},
"median": {
"type": "yes_no",
"ask": "median(C * V, 20) > 50000000"
},
"vol_dry": {
"type": "yes_no",
"ask": "V < 0.6 * avg(V, 20)"
}
},
"actions": [
{
"id": "fail_liquidity",
"when": "liquid50 < 0.4 or median < 0.4",
"do": "webhook",
"connection": "methodology-queue",
"body": {
"candidate": "{{symbol}}",
"as_of": "{{as_of}}",
"rule": "min_traded_value_50m",
"p_avg": "{{liquid50}}",
"p_median": "{{median}}",
"proposed": "ineligible"
}
},
{
"id": "pass",
"when": "else",
"do": "slack",
"connection": "index-ops",
"message": "{{symbol}} ({{as_of}}) passes liquidity (average {{liquid50|pct}}, median {{median|pct}})."
}
],
"dry_run": true
}Response JSON (SMCI, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"liquid50": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 50000000",
"basis": "pattern"
},
"liquid100": {
"yes_no": 0.9463,
"rule": "avg(C * V, 20) > 100000000",
"basis": "rule"
},
"median": {
"yes_no": 0.9463,
"rule": "median(C * V, 20) > 50000000",
"basis": "rule"
},
"vol_dry": {
"yes_no": 0.1739,
"rule": "V < 0.6 * avg(V, 20)",
"basis": "rule"
}
},
"context": {
"symbol": "SMCI",
"as_of": "2026-10-30"
},
"actions": [
{
"id": "fail_liquidity",
"fired": false,
"status": "skipped"
},
{
"id": "pass",
"fired": true,
"status": "dry_run",
"do": "slack",
"connection": "index-ops",
"preview": {
"text": "SMCI (2026-10-30) passes liquidity (average 95%, median 95%)."
}
}
]
}Index provider · example 10
Earnings-quality index screen on MSFT, COST, LLY
A quality index admits names with a record of beating estimates and growing EPS. Run the fact rules on candidates.
- State3 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MSFT"} then COST, LLY, one request each. The server fills in the latest completed session.
Questions
beats | English → rule | Has the stock beaten EPS estimates in at least 3 of the last 4 quarters? |
eps_g | rule | eps_growth_yoy > 10EPS up more than 10% on the year |
rev_g | English → rule | Did revenue grow more than 5% year over year? |
pos | English → rule | Was EPS positive last quarter? |
miss | English → rule | Has the stock missed EPS estimates in any of the last 4 quarters? |
Answers
| Symbol | beatsrule | eps_grule | rev_grule | posrule | missrule |
|---|---|---|---|---|---|
MSFT | 0.8591 | 0.8327 | 0.9463 | 0.9463 | 0.1409 |
COST | 0.55 | 0.9463 | 0.9463 | 0.9463 | 0.55 |
LLY | 0.8591 | 0.0537 | 0.9463 | 0.9463 | 0.1409 |
true false not known for rules; forecasts are odds. Hover a column for its question.
What it means
Session of 2026-10-30, 3 symbols: Has the stock beaten EPS estimates in at least 3 of the last 4 quarters: true for MSFT, LLY of 3. EPS up more than 10% on the year: true for MSFT, COST of 3. Did revenue grow more than 5% year over year: true for MSFT, COST, LLY of 3. Was EPS positive last quarter: true for MSFT, COST, LLY of 3.
All facts come from the earnings record as known on each report's reaction session, so the screen has no look-ahead.
Request JSON (MSFT; the others differ only in the symbol)
{
"model": "ora-fin-0.1.1",
"state": {
"symbol": "MSFT"
},
"questions": {
"beats": {
"type": "yes_no",
"instructions": "Has the stock beaten EPS estimates in at least 3 of the last 4 quarters?"
},
"eps_g": {
"type": "yes_no",
"ask": "eps_growth_yoy > 10"
},
"rev_g": {
"type": "yes_no",
"instructions": "Did revenue grow more than 5% year over year?"
},
"pos": {
"type": "yes_no",
"instructions": "Was EPS positive last quarter?"
},
"miss": {
"type": "yes_no",
"instructions": "Has the stock missed EPS estimates in any of the last 4 quarters?"
}
}
}Response JSON (MSFT, real)
{
"model": "ora-fin-0.1.1",
"answers": {
"beats": {
"yes_no": 0.8591,
"rule": "beats_last4 >= 3",
"basis": "pattern"
},
"eps_g": {
"yes_no": 0.8327,
"rule": "eps_growth_yoy > 10",
"basis": "rule"
},
"rev_g": {
"yes_no": 0.9463,
"rule": "revenue_growth_yoy > 5",
"basis": "pattern"
},
"pos": {
"yes_no": 0.9463,
"rule": "last_eps > 0",
"basis": "pattern"
},
"miss": {
"yes_no": 0.1409,
"rule": "misses_last4 >= 1",
"basis": "pattern"
}
},
"context": {
"symbol": "MSFT",
"as_of": "2026-10-30"
}
}beats_last4 eps_growth_yoy last_eps misses_last4 revenue_growth_yoy
Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Institutions: ETF issuer, Insurance investment office, Pension fund, Endowment, Sovereign wealth fund.