Skip to main content
The ResearchAgent reads from positions, risk metrics, feeds, alpha decay, execution quality, hypotheses, and the knowledge graph. It runs threshold-based rules and returns a list of findings sorted by severity. No LLM calls. Same fund state always produces the same report.

Quick Start

fund = FundManager(FundConfig(total_capital=100_000))
agent = fund.research_agent

report = agent.investigate("Why is strategy political_mm underperforming?")
health = agent.health_check()
diagnosis = agent.explain_underperformance("political_mm")
opportunities = agent.market_research("election markets")
risk = agent.risk_assessment()
Works standalone too. Both fund and knowledge_graph are optional:
from horizon.fund import ResearchAgent, KnowledgeGraph

agent = ResearchAgent(fund=fund, knowledge_graph=kg)
agent = ResearchAgent(fund=fund)           # no graph tools
agent = ResearchAgent(knowledge_graph=kg)  # no fund tools

How It Works

1

Parse intent

Keyword matching extracts the focus area, strategy name, and topics from the query.
2

Plan

Each focus area maps to a set of internal tools to call.
3

Observe

Tools query fund subsystems. Failed tools are skipped.
4

Analyze

Analyzers run threshold rules against observations and produce findings.
5

Report

Findings are deduplicated, sorted by severity, and returned as a dict.

Query Types

FocusKeywordsScope
riskrisk, exposure, drawdown, var, stressVaR, drawdown, concentration, regime, stress test
diagnosisunderperform, losing, decline, why isPerformance, execution, alpha decay, feeds, risk
opportunityopportunity, enter, should weUniverse, graph, hypotheses, correlations, regime
healthhealth, status, overview, fullEverything
correlationscorrelation, cross-market, clusterCorrelations, graph clusters, positions
alphaalpha, edge, decay, signalAlpha decay, hypotheses, performance
general(default)Positions, performance, risk, strategies

Tools

15 internal query tools. Each returns a dict or skips if its subsystem is missing.

Fund tools

positions, markets, risk, performance, feeds, strategies

Quant tools

correlations, regime, hypotheses, alpha_decay, execution_quality, stress_test

Graph tools

graph_context, graph_opportunities, graph_correlations

Analyzers

12 analyzers with fixed thresholds. All thresholds are class attributes you can override.
AnalyzerWhat it checksThresholds
fund_overviewKill switch, fund drawdown, inactive strategies15% critical, 8% high, 3% medium
risk_exposureVaR budget90% critical, 70% high
drawdownPer-strategy drawdown20% critical, 10% high
concentrationCorrelation alertsAny alert = high
regime_riskMarket regimeCrisis = critical, stressed = high
strategy_performanceNAV loss, paused strategiesNAV below 950 + 5% drawdown = high
executionSlippage, fill rate2% slippage = high, 50% fill rate = medium
alpha_healthEdge decay30% remaining = high, 50% = medium
feed_healthStale feeds300s = high
market_opportunitiesGraph and hypothesis signals60% confidence = medium
edge_signalsHypothesis lifecycleValidated = info, decaying = medium
correlation_opportunitiesGraph correlation clustersCluster found = medium
agent.DD_CRITICAL = 0.20
agent.VAR_HIGH = 0.60
agent.FEED_STALE_SECS = 600

Output

Every call returns a dict with findings, data_sources, reasoning_trace, summary, duration_secs. Each finding has:
FieldDescription
categoryrisk, opportunity, anomaly, recommendation, insight
severitycritical (0), high (1), medium (2), low (3), info (4)
titleShort description
detailContext and suggested action
evidenceRaw data backing the finding
report = agent.health_check()

for f in report["findings"]:
    print(f"[{f['severity']}] {f['title']}")

print(report["summary"])
# {"total_findings": 3, "by_severity": {"critical": 1, ...}, "by_category": {"risk": 1, ...}}