Now in early access

Connected Models at Portfolio Scale

Connected Models at Portfolio Scale

Connect to any data source and automate with reusable components

Background city image

Financial analysis framework designed for agents.
Deterministic. Traceable. Open.

Financial analysis framework designed for agents.
Deterministic. Traceable. Open.

Automated analysis that scales

Integrate data from every source

Fetch data securely from web APIs, databases, files, or even subagents. Retrieval occurs directly inside models following software best practices.

Abstract pattern of vertical purple wavy lines
Abstract pattern of vertical purple wavy lines

Reusable, programmable components

Models are built incrementally from component parts. Components can be abstracted into standalone, well-tested libraries that are reused across models.

Versioning and audit trail

Natively works with standard software version control systems like Git and GitHub.

Flip between model scenarios, track changes over time, and see who authored each change.

Abstract pattern of vertical purple wavy lines

Orcaset bridges the last mile from insight to financial outcome.

Orcaset bridges the last mile from insight to financial outcome.

Developer

Financial analysis in plain, modern Python

Financial analysis in plain, modern Python

Orcaset builds models in code using an open framework. Orcaset is type-safe so incompatible combinators are caught immediately at write time. All calculation dependencies are tracked, and the full call graph can be inspected.

@Series.define("Revenue", query.accrue(YF.cmonthly), seed=initial_period)
def revenue(period: Period):
    if period == initial_period:
        value = 100.0
    else:
        prior_value = yield from get_at(revenue, period.shift(-relativedelta(months=1)))
        value = maybe.mul_some(prior_value, 1.10)
    
    return period, value, period.from_end(relativedelta(months=1))


costs = ops.scale("Costs", revenue, -0.50)
profit = ops.add("Profit", revenue, costs, merge_keys=period_union)
@Series.define("Revenue", query.accrue(YF.cmonthly), seed=initial_period)
def revenue(period: Period):
    if period == initial_period:
        value = 100.0
    else:
        prior_value = yield from get_at(revenue, period.shift(-relativedelta(months=1)))
        value = maybe.mul_some(prior_value, 1.10)
    
    return period, value, period.from_end(relativedelta(months=1))


costs = ops.scale("Costs", revenue, -0.50)
profit = ops.add("Profit", revenue, costs, merge_keys=period_union)

Type-Safe Verification

Verify models are properly constructed at definition time. Make changes confidently at scale.

Type-Safe Verification

Verify models are properly constructed at definition time. Make changes confidently at scale.

Open & Flexible

No black boxes. Auditable and traceable. Integrate directly into your existing flows.

Open & Flexible

No black boxes. Auditable and traceable. Integrate directly into your existing flows.

Runs Everywhere

Runs in the cloud and locally. Only depends on Python 3.14+.

Runs Everywhere

Runs in the cloud and locally. Only depends on Python 3.14+.

Ready to try Orcaset with your own data?

Install the MCP connector to use with Claude or ChatGPT

Cityscape

Ready to try Orcaset with your own data?

Install the MCP connector to use with Claude or ChatGPT

Cityscape

Ready to try Orcaset with your own data?

Install the MCP connector to use with Claude or ChatGPT

Cityscape