Factor Infrastructure · Build · Manage · Distribute

Infrastructure for Building and Managing
Your Factors

Investment teams run on libraries of hundreds of factors, and the library keeps growing. MDO is the software that makes each one easy to build and keeps the whole library managed: refreshed, versioned, accessible across the firm, and correct every single time. It runs inside your own environment, so every factor stays proprietary to your firm. Custom Formulas are how it works.

A library of hundreds is constant work.

A serious factor library is not a handful of signals. It is dozens, often hundreds, and it keeps growing as researchers test new ideas. Every one has to be built correctly, then kept alive: refreshed on a schedule so the numbers stay current, versioned when a methodology changes so last year's backtest still reproduces, kept consistent so a factor means the same thing on the quant desk and in a portfolio manager's attribution report, auditable so any number traces back to its definition, and delivered into the tools people actually work in.

That is a large, ongoing, specialized effort. As the library grows, the code grows with it and gets harder to keep clean. Refresh pipelines, versioning, access, and consistency all have to hold together, every day, for years. And the work never stops, because the next idea always means another factor to build and fold into the library.

MDO is the infrastructure that carries all of it, running inside your own Snowflake account. It makes building a factor easy, whether it is the first one or the three hundredth, and it keeps the whole library managed automatically: the refresh, the versioning, the access, the consistency, the audit trail. The factors stay proprietary to your firm and never leave your environment. MDO is the software that manages them, not a service you hand them to. Custom Formulas are how a firm puts it to work.

Managing a factor is a lifecycle, not a step.

Each stage below is real work to get right. MDO manages all of them, so a Custom Formula moves through the whole lifecycle without anyone rebuilding plumbing.

01 · Create
Define once
Plain Python against MDO's engine. Point-in-time, fiscal alignment, currency, and corporate actions are handled underneath, not re-solved in every formula.
02 · View & Modify
A glass box
The definition is readable. Anyone with access can open it, see exactly how the number is computed, and change it. Not a vendor black box.
03 · Refresh
Automatic
Once registered, a formula refreshes on the same incremental cadence as the rest of the data. No cron job to babysit, no script to rerun.
04 · Discover
Named & listable
A researcher sees what the firm already has instead of rebuilding a factor that exists three desks over.
05 · Access
Firm-wide
Because MDO is a Snowflake Native Application, a formula is queryable by anyone the firm grants access. Quant, PM, risk, data team. One source of truth.
06 · Distribute
Into your tools
The output lands where Snowflake reaches: a notebook, a SQL query, a BI dashboard, an internal app. No reimplementation in each one.
07 · Audit
Reproducible
The definition is plain Python in the library. Six months later the number reproduces and the reasoning is right there.

A Custom Formula is code you can read.

Not a number handed down from a vendor. Not a black box an AI spat out. Here is an example, a price acceleration factor. The entire definition:

FL_TEC_PRICEACC · Price Acceleration
def FL_TEC_PRICEACC(universe, params=None):
    """Price acceleration: current 3M total return minus the prior, non-overlapping 3M total return."""
    import mdosnow as mdo
    from snowflake.snowpark.functions import expr
    dims = ['day', 'security']
    universe = mdo.as_universe(universe[dims], dimensions=dims)

    # Total-return index now (PX0) and 3 and 6 months back (PX_T3, PX_T6)
    mdo.PlugData(universe, items={'PX0': 'DS_TOTRET'}, toCurrency='USD', recent=-10)
    mdo.PlugData(universe, items={'PX': 'DS_TOTRET'}, shift=[-3, -6],
                 periodType='month', toCurrency='USD', recent=-10)

    # recent quarter (PX0/PX_T3) minus prior quarter (PX_T3/PX_T6)
    universe.with_column('FL_TEC_PRICEACC',
        expr('(PX0 / NULLIFZERO(PX_T3) - PX_T3 / NULLIFZERO(PX_T6)) * 100.0'))
    return mdo.as_universe(universe[dims + ['FL_TEC_PRICEACC']], dimensions=dims)

Anyone on the team can open that, see precisely how the factor is computed, and change it. The methodology is not a guess. It is the source. That is what makes a library trustworthy enough to run a process on.

Calling a formula is one line. The same line for everyone.

Whether the caller is a quant, a PM, or an internal dashboard, the call is identical:

Any consumer, any date
mdo.CFData(universe, name='FL_TEC_PRICEACC', formulaGroup='MDO_DEMO_FACTORS_V2')

That returns the factor for every name in the universe, alongside any other formula in the library called the same way. A slice of global large caps on a recent month-end:

CompanyPrice AccelerationFwd Earnings Yield
Apple27.03.2%
Microsoft30.35.2%
Nvidia33.25.3%
Amazon32.23.8%
Alphabet43.53.7%
Meta Platforms24.55.7%
Tesla40.20.5%
Broadcom44.94.5%
Berkshire Hathaway10.74.1%

Factor values as of the 2026-06-30 month-end.

Whatever your process runs on, every factor sits in the same library, named, categorized, refreshed on the same cadence, and callable through the same one line. Common categories:

Value Quality Growth Momentum Risk Technical

A screen, a risk report, a PM dashboard, and a backtest all pull from the same definitions. Every consumer sees the same number because they are all calling the same formula. And that number does not drift: MDO runs the saved factor, not an AI, so the same factor on the same date returns the same result every time, whether in a backtest today or an audit six months from now.

Different firms, same shape.

The pattern shows up again and again across the teams MDO works with.

Scale
A large multi-strategy asset manager runs hundreds of factors. Inventing signals was never the challenge. Creating, managing, running, and continually extending a library at that scale without maintenance swallowing the research was. MDO is the foundation that holds all of it in one place.
Speed
A global active manager kept hitting a wall building new factors from vendor data. The plumbing around each signal made every idea a project. On MDO, building a new factor is no longer a project. It takes a small fraction of the time each one used to.
Leverage
A small team of portfolio managers stood up and now runs a factor library that would normally take a much larger group to build and maintain. With MDO carrying the infrastructure, they point a lean team at the signals instead of the plumbing, and cover the ground a bigger team usually would.

Why MDO already has this, and AI makes it faster.

None of this is new to MDO. The management layer, the point-in-time engine, the Custom Formula lifecycle, and the firm-wide distribution were built into the product over years. That is the part that is genuinely hard to build and easy to underestimate, and it is why teams that assemble it in-house spend quarters on plumbing before they run a single new signal. What changed recently is speed: Surge, MDO's AI agent, knows the engine, so a researcher describes a factor in plain English and gets correct, production-ready code in minutes. The AI knows how to use the infrastructure, so building is fast. The infrastructure runs the result, so it stays durable, deterministic, and shared. MDO is the infrastructure AI knows how to use, fast and deterministic.

See it on your own library. Twenty minutes, live on your data and your factor conventions. We will walk through how a formula gets built, managed, and distributed across your firm.
Book a Walkthrough →
MDO is a Snowflake Native Application that investment teams use to build, manage, and distribute custom factors and formulas without the data engineering tax. Surge is MDO's AI agent, available through Claude Code and other AI environments.  ·  mydataoutlet.com