Skip to main content
The engine is Itoflow’s own Python quant library and the data services that feed it. Agents call it from their sandbox, and Itoflow’s own scheduled jobs call the same library, so an agent can do anything the system does. It is production code with its own tests, not a folder of scripts.

Data

Prices, fundamentals, filings, news and exchange rates for stocks and ETFs on 24 exchanges in 22 markets, plus crypto. GET /symbols/exchanges lists the exchanges, and Find a symbol resolves a ticker, company name, broker symbol or ISIN. Four rules keep the data honest:
  • One named source for each kind of data and market. If that source fails, the request fails or the gap is reported. Itoflow never switches silently to another source.
  • Currency comes from the data provider. Itoflow never infers it from a ticker or exchange.
  • Only what was known at the time. Fund holdings count from the day the SEC accepted the filing. Company statements count from when they became public, such as the results announcement, and the history reports any statement it couldn’t date that way. Historical datasets keep their retrieval times and source hashes, so you can check what a backtest saw. One known exception: for older dates, the risk model may use today’s sector and country labels, and the response’s provenance says so.
  • Missing stays missing. A missing price, volume or factor input stays empty and is reported. It is never filled with zero or a guess.
Point-in-time history matters. In our factor-model study, holding today’s S&P MidCap 400 members back in time, equal-weight and rebalanced monthly, returned 14.3% a year, against 9.3% for the names actually in the index on each date: 177 of today’s 400 names weren’t yet in the index when the test began. For a historical index, the research agent applies dated listing, liquidity and size rules at each rebalance, and states how far its universe relies on hindsight. Your own data comes in through files in the app, your GitHub repositories, your own MCP servers, or the local worker, which runs steps on your machine. See Market data for the endpoints.

Signal tests and backtests

  • Signal tests. Information coefficients across the cross-section, chronological train and test splits, and multiple-testing control.
  • Walk-forward and out-of-sample backtests, with trading costs, turnover and position limits.
  • Overfitting checks in code: the probability of backtest overfitting, the deflated Sharpe ratio and false-discovery-rate control. The research contract can require them, and the system works out an out-of-sample choice again itself rather than trust the agent’s claim. See the research contract.
  • Stress tests, such as the Covid crash, an inflation shock or a jump in rates. Stress scenarios on the risk model are overlays; they never change the base model.

Portfolio construction

  • Mean-variance, minimum variance, risk parity and hierarchical risk parity.
  • Covariance shrinkage, and covariance from the factor model when a sample would be too short or noisy.
  • Trading costs, turnover limits and position limits.
  • Long and short books, with long, short, gross and net kept apart rather than summed into one figure. Long-short books, such as a 130/30, run on paper portfolios.
  • Volatility forecasts, including conditional volatility models.
Combining fundamental quality with quantitative optimization: GOOGL vs AAPL shows one request that weighs two stocks for a diversified book on both fundamentals and their effect on the book’s risk and return.

Factor risk model

Itoflow’s factor risk model splits each holding’s risk into what it shares with others and what is its own:
X holds each stock’s exposures to the factors, F is the factor covariance, and D is each stock’s specific risk.
  • Factors. Market, country, industry and style factors such as size, value, momentum, quality and liquidity. Each style input is cleaned of outliers and standardized.
  • Fitted daily. Factor returns are fitted across stocks each day. Each stock uses its own exchange’s calendar, so a holiday is never counted as a zero return. An exchange counts as shut on a day when under 40% of its stocks have a price that differs from their last one and under half of its active stocks traded (a day on which no price moved is shut whatever the volume; a small exchange is shut when under half of its active stocks have a price that traded). A shut day leaves out that exchange’s prices, and the next return spans the gap. A stock counts toward its exchange from its first price until 21 weekdays after its last. The same happens to the placeholder prices a new listing carries before its first trade (a stock whose price never changes has none left). Every price counts on its own date, whatever its size: a large move is as likely real as wrong. A price that jumps or falls tenfold for up to three of the stock’s own prices and then comes back is dropped once the later price shows it came back, and later fits leave it out; a fit already stored stays as it was. While such a jump is the latest price, nothing has shown yet whether it lasts, so the fit leaves it out until the next prices decide, and the stock’s specific risk says which close it waits on. A move that lasts becomes the new level. The fit counts each company once, on its main listing, when it can tell the lines are one company: of two lines with one ISIN, one leads, and a depositary receipt carries no weight only when the data provider gives the same registry number for it and for another line of its company in the model. It never matches by name, so a receipt with no such number stays in the fit beside its company’s share. A stock that traded on under 80% of its exchange’s open days, one with a median daily turnover under $100,000 (dollars that traded as they traded, which a later dividend adjustment does not change), and one with a market cap under $100 million carry no weight in the fit. Each is still scored, and its warnings state the reason. A country or industry factor is not estimated on a day when stocks with under half of its weight traded: its return is zero that day, and the stocks that traded keep their own moves.
  • Specific risk for each stock, with a floor and shrinkage toward similar stocks.
  • ETF look-through. An equity ETF’s exposures are the weighted sum of its holdings’ exposures, read from the holdings on file at that date. Funds held inside a book, and the benchmark, are read through the same way.
  • Beyond equities. Gold, Treasury and cash-like funds are modeled from their own return history, with their covariance to the equity factors. That is as far as the model reaches beyond stocks today: futures, options and individual bonds aren’t covered.
  • Gaps are named. A missing input is never set to zero. A risk run lists each name the model doesn’t cover, with its weight and the reason.
  • Published apart from the agents. A daily build publishes dated snapshots. Agents and the API read published snapshots; they never refit the model.
  • Point in time. A past date reads the newest snapshot on or before it. Itoflow refuses a date or symbol the snapshot doesn’t cover rather than fill the gap, and the response’s provenance says when an input, such as sector labels, reflects today. A risk measure’s answer lists from which date month-end and daily snapshots exist.

How the model measures up

How our factor risk model measures up against institutional providers, September 8, 2026, scored the model with the bias statistic and its 95% band as MSCI defines it, which is 0.82 to 1.18 for 59 month-ends. The test forecast risk at each month-end from September 2021 to July 2026 on a point-in-time S&P MidCap 400 and scored it against the next 21 trading days. All 9 portfolio families had a mean bias inside the band, from 0.94 to 1.03, and so did 107 of the 116 single portfolios. The bias of specific-risk forecasts sat between 0.93 and 1.03 in every decile, over 23,069 stock-months. Against a plain sample covariance:

The engine computes; the agent explains

Every figure in a risk report or monitor report comes from the engine. The agent decides which figures matter, writes the findings and explains them. Before a monitor report goes out, its figures are checked against the engine’s output, and a figure the engine can’t produce shows as “not known”. When the engine has evidence that a figure is wrong, the report drops it and anything built on it.

Use the engine from your code

Use a risk run for today’s full report on one book, and a risk measure for past dates, a range of dates, or several books side by side. Agents use the same engine in chat research, monitors and strategies.