ibkr终端
一个MCP服务器,将盈透证券变成一个问答投资组合分析师。
用简单的英语问你的投资组合-- *“如果利率飙升100个基点,美元升值5%,我的书怎么能坚持下去?”* --LLM会选择合适的工具,将它们链接起来,并写出答案。32个只读分析工具,涵盖利润率、风险、市场数据和投资组合情报,在全球范围内公开 模型上下文协议.
此回购以 拆卸 --我为自己的交易构建和运行的系统的面向公众的服务器层。32个工具实现存在于一个私有包中,此处不包括在内。目的是展示这些零件的贴合度,我做了什么权衡,以及针对IBKR API的运输实际上是什么样子。看 状态 在......下面
Account dashboard, morning briefing, and 1-day parametric VaR — all from a single claude.ai prompt against the MCP. Consolidated NLV across two accounts, leverage and margin health bars, full position table with weights, allocation pie, top movers, leaders/laggards, cash posture, and VaR analysis.
______________________________________________________________________
它做什么
每个工具都做一件可组合的事情。该模型处理编排——拉取头寸、获取实时价格、模拟、分解、格式化。 *“早间简报”* 一次性获取头寸、损益表、利润率、主要推动者、论文一致性和地缘政治标志。跟进: *“如果我削减30%的最大头寸,转而持有第二大头寸,我的利润率和行业集中度会发生什么变化?”* --跑步 what_if, margin, sector_exposure 按顺序返回一个段落。
投资组合 头寸、损益、成本基础、集中度、多账户合并视图、股息。 边距 实时保证金分析,模拟,每符号效率(RegT与投资组合保证金)。 风险 使用自定义场景(利率、外汇、交易量、提款)、相关矩阵、参数VaR、提款跟踪器对高水位线进行压力测试。 市场数据 报价、历史柱状图、盘中、希腊期权链、技术指标(SMA/RSI/MACD/Bollinger)、合约搜索。 智能 货币敞口分解、行业敞口、再平衡计划、投资组合贝塔系数、头寸水平论文检查、地缘政治风险评分。 简报 一份即时的每日简报——头寸、损益、利润、主要推动者、论文状态、地缘政治旗帜。
所有这些都是只读的——没有订单,没有LLM自己亏损的表面积。
______________________________________________________________________
这如何改善财务模型的反应?
普通法学硕士不知道你的投资组合中有什么,你的杠杆率有多高,你的论文是什么,或者给定股票的当前买卖价差是多少。这些工具弥补了这一差距。实际响应形状的几个例子——被净化为虚构的股票代码:
ibkr_briefing --一次性投资组合快照
*“给我一个关于我主要账户的晨间简报。”*
# Briefing: U████████
_2026-05-03 17:17:44 UTC_
## Account Health
| Metric | Value |
|---------------------|----------------------|
| NLV | $24,618.00 CAD |
| Gross Position Value| $64,124.00 CAD |
| Leverage | 2.61x |
| Cushion | 10.5% — OK (watch) |
| Margin Utilization | 98.4% |
| Excess Liquidity | $2,604.00 CAD |
## Daily P&L
**Daily**: +$312.48 CAD (+0.02% of NLV)
**Unrealized**: +$2,603.00 CAD
## Positions
| Symbol | Shares | Price | Value | Daily P&L | Weight |
|--------|--------|-------------|-----------------|---------------|--------|
| KRYX | 340 | $54.18 USD | $18,414 USD | $-952 (-4.9%) | 38.1% |
| VLTX | 86 | $94.32 USD | $8,112 USD | $-892 (-1.1%) | 22.3% |
| OMRA | 76 | $120.10 USD | $9,128 USD | +$256 (+2.9%) | 18.9% |
| FELN | 51 | $130.40 USD | $6,651 USD | +$498 (+8.1%) | 14.4% |
| HDRX | 162 | $33.04 USD | $5,353 USD | +$309 (+6.1%) | 6.4% |
## Risk Metrics
| Metric | Value |
|-----------------|----------------------|
| Top Position | KRYX (38.1%) |
| Top 3 Weight | 79.3% |
| HHI | 2,432 |
| Position Count | 5 |
## Connection
**Status**: connected
**Last Data**: 2s ago香草模型无法产生任何这些——NLV、缓冲、重量、每日损益都是实时的IBKR状态。工具聚合 accountSummary, portfolio,PnL订阅和连接健康状况合并为一个响应,因此模型可以在不扇出的情况下对整个画面进行推理。
ibkr_thesis_check --这个消息威胁到我的论文了吗?
*“请对照我的论点:‘AcmeCorp预计下一季度平台收入将比超大规模定制硅订单的共识高出12%;云业务量将攀升至下半年。首席财务官称基础设施支出为多年结构性支出。’”*
# Thesis Check: Platform Buildout
**Overall**: 🟢 THESIS INTACT
### End-market demand growth 🟢 INTACT
### Major-customer capex trajectory 🟢 INTACT
### Competitive threat (emerging entrants) 🟢 INTACT
### Cycle positioning 🟢 INTACT
### Revenue materialization 🟢 INTACT
_Keyword check against invalidation/confirmation signals defined
in thesis_config.json. For nuance, use this as context in chat._用户拥有 thesis_config.json --支柱、失效信号、确认信号。tool关键字将传入的新闻与用户的 *拥有* 框架。这是一个故意愚蠢的第一通滤波器;该模型采用判决+新闻,并编写实际推理。表面上的结构胜过把原始消息交给模型并问“这不好吗?”
ibkr_quote --实时多符号比较
*“引用苹果、微软、谷歌、亚马逊、特斯拉的话。”*
# Symbol Comparison
| Symbol | Last | Change | Change % | Volume |
|--------|-----------|------------|-----------|--------------|
| AAPL | $198.12 | -$1.91 | -0.95% | 99,909,074 |
| MSFT | $420.27 | +$5.88 | +1.42% | 9,224,500 |
| GOOGL | $255.97 | -$0.41 | -0.16% | 5,181,434 |
| AMZN | $182.41 | +$2.18 | +1.21% | 34,254,734 |
| TSLA | $238.05 | -$3.42 | -1.42% | 22,590,382 |实时IBKR市场数据,支持延长时间回退。单符号形式返回买入/卖出/点差;multi-symbol返回比较表。实时报价是表桩功能,使其他工具能够将其分析作为基础 *现在*不是昨天的收盘价。
ibkr_what_if --纸品交易保证金模拟
*“如果我购买100韩元,我的保证金会怎么样?”*
# What-If: BUY 100 KRYX
Account: U████████
## Current State
**Equity**: $24,618.00 CAD
**Initial Margin**: $24,201.34 CAD
**Maint Margin**: $22,012.81 CAD
**Excess Liquidity**: $2,604.66 CAD
## Post-Trade Estimate
**Equity**: $24,617.51 CAD
**Initial Margin**: $24,201.34 CAD
**Maint Margin**: $22,012.81 CAD
**Excess Liquidity**: $415.83 CAD
## Margin Impact
**Init Margin Additional**: $0.00 CAD
**Maint Margin Additional**: $0.00 CAD
**Equity Change**: $-0.49 CAD没有IBKR,该模型无法模拟纸质订单 whatIfOrder API这将通过网关的保证金引擎路由虚假订单,返回交易后状态,模型可以回答 *“这笔交易会让我追加保证金吗?”* 对于实数,没有下订单,没有什么东西是只读的。
ibkr_stress_test --缩编生存能力
*“如果投资组合下跌20%,我的利润会怎么样?”*
# Stress Test: -20.00% Drawdown
Account: U████████
## Current State
**NLV**: $24,618.00 CAD
**Cushion**: +10.54%
## After -20.00% Drawdown (estimated)
**Estimated Loss**: $-14,127.40 CAD
**Stressed NLV**: $10,490.60 CAD
**Stressed Excess (Maint)**: $-7,693.16 CAD
## Survivability
**Max DD before buying power restricted**: ~1.0%
**Max DD before forced liq**: ~4.0%
⚠️ BUYING POWER RESTRICTED: a 20% drawdown breaches initial
margin by $9,498.32 CAD.
🚨 FORCED LIQUIDATION: a 20% drawdown breaches maintenance
margin by $7,693.16 CAD.
_Approximation. Real margin requirements may increase during
drawdowns as volatility rises._如果没有投资组合边际背景,这是模型根本无法猜测的问题。它通过以1%的增量逐步模拟并观察保证金比率何时超过阈值来计算购买力限制和强制清算的盈亏平衡提款,从而在经纪人介入之前显示账簿实际有多少“空间”。
ibkr_correlation_matrix --另一个名称的集中风险
*“我的职位真的多样化了吗?”*
# Correlation Matrix (60D)
Account: U████████
| | KRYX | VLTX | OMRA | FELN | HDRX |
|-------|-----:|-----:|-----:|-----:|-----:|
| KRYX | 1.00 | 0.59 | 0.57 | 0.36 | 0.18 |
| VLTX | 0.59 | 1.00 | 0.56 | 0.49 | 0.29 |
| OMRA | 0.57 | 0.56 | 1.00 | 0.71 | 0.35 |
| FELN | 0.36 | 0.49 | 0.71 | 1.00 | 0.31 |
| HDRX | 0.18 | 0.29 | 0.35 | 0.31 | 1.00 |
**Highest correlation**: OMRA/FELN = 0.71
**Lowest correlation**: KRYX/HDRX = 0.18
**Average pairwise correlation**: 0.44
**Data points**: 60 daily returns五个不同行业的五个股票行情仍然可以是一个单一的赌注。该矩阵直接从IBKR中提取每个位置60天的每日条形图,成对计算皮尔逊相关性,并告诉你哪个“多样化”是真实的,哪个是戏剧。平均成对>0.7意味着你实际上是在用额外的步幅完成一个位置。
______________________________________________________________________
建筑
此回购是 服务器层 -传输、生命周期、仪表板REST API。32种工具实现和共享基础设施(core/, tools/)住在私人包裹里, ibkr-terminal-core,在运行时作为可编辑依赖项安装。
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ ibkr-terminal (this repo) │ │ ibkr-terminal-core (private) │
│ │ │ │
│ server.py stdio / MCP │ │ core/ │
│ server_http streamable │ │ connection · cache · calc │
│ app.py FastMCP │ ◄─────► │ formatting · persistence │
│ dashboard.py REST endpoints│ imports │ errors │
│ config.py env vars │ │ │
│ tests/ transport │ │ tools/ 9 modules │
└──────────┬───────────────────┘ │ account · briefing │
│ │ portfolio · market_data │
│ ib_insync │ live_data · risk │
▼ │ intelligence · monitoring │
┌──────────────────────────────┐ │ orders │
│ IB Gateway / TWS │ │ │
│ primary + optional 2nd │ │ → 32 tools, registered │
└──────────────────────────────┘ │ on app.mcp via @mcp.tool │
└──────────────────────────────┘两个运输工具,一个工具表面。 server.py 在stdio上运行本地Claude代码。 server_http.py 通过claude.ai和任何远程MCP客户端的可流式HTTP运行。两者共享 app.py的FastMCP实例——工具注册一次,可在任何地方访问。 server_http.py 互换 app.mcp 具有HTTP配置的实例 *之前* 导入工具模块,以便 @mcp.tool() 装饰人员对正确的运输方式进行了抨击。
仪表板侧车。 dashboard.py 寄存器 /api/* 路线通过 @mcp.custom_route() 在同一个Starlette应用程序上——Vite前端的REST端点(位置、摘要、FX、技术、历史),与MCP协议从同一端口提供服务。前端位于一个单独的仓库中。
______________________________________________________________________
为什么它是这样建造的
为什么选择FastMCP而不是原始MCP。 装饰器驱动的工具注册(@mcp.tool())使工具定义与其输入模式(Pydantic模型)位于同一位置。9个文件中的32个工具意味着另一种选择——手动连接处理器——将是一个维护坑。FastMCP的痛苦在于它的生命周期模型在不同的传输方式之间有所不同(stdio为单次射击,HTTP为每次会话),这迫使了下面的拆分。
为什么后台重新连接循环而不是按需连接。 IB网关每天断开连接以自动重启,当用户从另一台机器登录TWS时,会话会中断,并在空闲TCP超时时自动终止(更多信息见下文)。这种天真的方法——在生命周期内连接,如果关闭则请求失败——意味着在5分钟的停机期间,每个面向用户的提示都返回了一个错误。重新连接循环每30秒运行一次,拥有锁,在中断期间击中它的工具通过带有过时横幅的缓存层优雅地降级。寿命永远不会中断。
为什么是无状态HTTP。 Claude Code(当时是一个有缺陷的版本)正在缓存死会话ID,并且从未重新初始化。claude.ai在重叠的SSE流上驾驶409赛车。无状态模式——每个请求都是独立的,没有会话ID,没有GET SSE——修复了这两者。安全,因为所有真实状态都存在于网关中,而不是MCP中。
为什么都是只读的。 这个模型很好。它不是那么好,我希望它在没有人参与的情况下下单。IBKR API具有订单处理原语;此服务器不会公开它们。仪表板仅将它们显示为日志/历史视图(ibkr_trades, ibkr_get_orders)--读,不写。
为什么要单独的仪表板前端仓库。 MCP服务器是真理的来源;仪表板是它的一个消费者。将它们分开意味着前端可以迭代而无需重建服务器,服务器也不会长出Vite/Node形状的触手。
为什么是私有核心包。 当这是一个单一的回购时,工具层每隔一天就会随着投资组合特定的校准(论文支柱、行业映射、风险因素、损益阈值)而变化。(头痛)欲裂的 core/ 和 tools/ 将面向公众的服务器整合到一个私有包中,使其在拆卸时稳定下来,而不会泄露我的实际书籍或使分析对以下方面有用的校准 *我的* 交易风格。
______________________________________________________________________
刀具目录
9个模块中的32个工具。实现是私有的;这里记录了曲面,这样你就可以看到模型必须使用什么。Account组在下面;展开查看完整列表。
| 工具 | 目的 |
|---|---|
| 账户 | |
ibkr_get_account_summary | NLV、GPV、现金、购买力、保证金、缓冲、杠杆 |
ibkr_margin | 呼叫余量距离、每符号效率、净空(3种模式) |
ibkr_list_accounts | 所有已连接的帐户,标记为主要/次要帐户 |
ibkr_get_account_pnl | 通过PnL订阅实现的每日已实现+未实现损益 |
ibkr_consolidated_view | 带FX转换的跨网关聚合 |
Show all 32 tools — Briefing, Portfolio, Market data, Live data, Risk, Intelligence, Monitoring, Orders
| 工具 | 目的 |
|---|---|
| 简报 | |
ibkr_briefing | 9节早间简报(健康、损益、头寸、推动者、风险、警报、订单、外汇、连接) |
ibkr_geopolitical_risk | 实时新闻搜索已筛选至持有的职位,并进行了严重性评级 |
ibkr_thesis_check | 根据支柱论文对新闻项目的判决 |
| 投资组合 | |
ibkr_get_positions | 带有成本基础、损益和权重的位置表 |
| 市场数据 | |
ibkr_quote | 报价工具(投资组合模式/单品种详细信息/2-8品种比较) |
ibkr_get_historical_bars | 具有可配置持续时间、条大小、数据类型、RTH的OHLCV条 |
ibkr_get_contract_details | 长名称、行业、交易所、报价单大小、交易类别 |
ibkr_get_option_chain | 到期+ATM罢工,或与希腊人接近ATM的通话/看跌 |
ibkr_dividends | 单次股息/投资组合日历/年收入估算 |
ibkr_search_contracts | 按符号或公司名称发现合同 |
| 实时数据 | |
ibkr_get_fx_rate | 实时外汇对定价、点差、每日变化 |
ibkr_get_intraday | 最后N分钟的1分钟酒吧(最多120个) |
ibkr_compare_performance | N个符号的相对绩效记分卡 |
ibkr_technicals | SMA/RSI/MACD/布林线1年内每日 |
| 风险 | |
ibkr_what_if | 通过以下方式模拟利润率影响 whatIfOrder() |
ibkr_correlation_matrix | 成对相关性,60或252个交易日 |
ibkr_portfolio_beta | 按头寸和加权贝塔系数与基准 |
ibkr_stress_test | 飞行前/下降曲线/隔夜缺口(3种情况) |
| 智能 | |
ibkr_sector_exposure | 行业集中度与HHI、ETF回退映射 |
ibkr_currency | 多币种风险敞口分解 |
ibkr_position_detail | 深入探讨——成本基础、重量、损益、利润率、技术指标、近期柱状图 |
ibkr_rebalance_planner | SYM:PCT 求解器——当前与目标、行动、股票、美元 |
| 监控 | |
ibkr_drawdown_tracker | 从峰值NLV(SQLite支持的历史)中减少 |
ibkr_connection_status | 每个网关TCP/数据新鲜度/事件日志 |
| 订单 | |
ibkr_trades | 填充/日记账/已实现收益/已完成(4种查看模式) |
ibkr_get_orders | 未结订单快照 |
______________________________________________________________________
堆栈
Python 3.11+· mcp (快速MCP)· ib_insync · pydantic · uvicorn · httpx · yfinance (当IB市场数据子不可用时,仪表板回退)·用于NLV历史的SQLite·使用模拟IB进行pytest。
______________________________________________________________________
状态
此仓库是公共服务器层。32个工具实现和共享基础设施位于一个私有包中(ibkr-terminal-core)并且是 未重新分配因此,此仓库中的代码不能独立运行——它是作为拆解/案例研究发布的,而不是作为fork and run项目发布的。
如果你想构建类似的东西 战争故事 和 建筑 这些零件值得偷。
______________________________________________________________________
许可证
专有——见 许可证代码以拆解/参考的形式发布,不用于生产。重新分发和衍生作品需要书面同意。
