☰
开源三合一AI工作台:打通量化研究、日常办公与交易下单的本地化实践
2026/9/26 14:28:23 网站建设 项目流程

1. 量化分析师的日常到底碎在哪里:为什么需要三合一的AI工作台

先说一个我自己的真实状态:白天盯盘、写策略回测、跑因子分析,晚上还要整理研究笔记、回复邮件、跟进交易计划。工具链长到离谱——研究用Notebook和本地脚本,办公用飞书/钉钉和WPS,下单用券商客户端和第三方API。每个环节之间靠手动切换,数据不互通,操作不连贯,经常出现"研究结论写完了,但下单时还要重新打开终端敲一遍参数"这种低效场景。

Quant、Work、Trade三个领域各有一套成熟工具,但彼此是割裂的。量化研究讲究可复现和回测验证,办公讲究文档协作和任务管理,交易下单讲究低延迟和风控校验。把它们硬凑在一个界面里,技术上并不难,难的是把三个域的数据模型、交互逻辑和权限边界理顺。这也是我决定自己动手做一个开源个人AI工作台的原因——不是为了造轮子,而是市面上确实没有一款工具能同时满足这三类诉求,还允许我按自己的习惯改。

这个项目不是给团队用的,是给个人用的。核心定位有四个:一是把研究、办公、交易的数据统一存放在本地,解决"数据孤岛"问题;二是通过LLM做自然语言到代码、自然语言到操作指令的转换,降低重复劳动;三是把交易下单做成带风控验证的半自动流程,不是全自动裸奔;四是整个系统完全开源,本地部署,自己掌控一切。

适合谁看?如果你是量化从业者、独立交易员、或者对"个人AI工作流"感兴趣的开发者,这篇内容应该能给你一个完整的落地参考。我会把架构设计、模块拆分、部署细节和踩坑经历都写出来,尽量做到可以照着复现,而不是只讲概念。

2. 整体架构设计:单机部署、事件驱动与分层权限

2.1 为什么选单机部署而不是服务端架构

做这种个人信息工作台,第一个决策就是部署形态。我的选择很明确:单机部署,数据全部落在本地。原因很简单——涉及交易账户信息和策略源码,任何上传到云端的行为都意味着信任第三方。LLM调用可以通过本地模型或外部API代理完成,但研究数据和交易凭证必须留在本地。

有人会问,单机部署会不会性能不够?实测下来,回测任务吃CPU和内存,办公任务基本无压力,交易下单的延迟瓶颈在网络而非机器。我用一台MAC Studio(M2 Ultra,128GB内存)跑整套系统,同时开回测、跑LLM推理、挂着行情推送,非常稳。如果只是日常使用,普通配置的PC也足够,后面部署章节我会给具体资源参考。

架构上用事件驱动而非传统的请求-响应模型。原因在于交易场景下,行情推送、风控告警、任务完成通知都是异步事件,如果全靠轮询或手动触发,体验会非常割裂。事件总线用的是Redis Streams,生产者和消费者解耦,模块之间通过事件交互,例如策略研究模块产出新信号后,自动发布一个signal_updated事件,交易模块订阅后进入人工确认流程,办公模块则生成对应的任务条目。

2.2 三大核心域的模块划分与通信机制

整个系统分为四个层次:数据层、能力层、应用层、接入层。

数据层只有一种数据库——SQLite,外加文件目录。为什么选SQLite而不是PostgreSQL或MySQL?个人工作台不需要高并发写入,SQLite的单文件备份和迁移极其方便,WAL模式下的读写性能完全够用。三个域的数据通过前缀区分,比如研究域的表以research_开头,办公域以work_开头,交易域以trade_开头。

能力层是系统的核心,封装了三个域的公共能力:

  • 研究能力:策略回测引擎、因子分析、数据拉取接口;
  • 办公能力:文档生成、日程任务、信息聚合;
  • 交易能力:行情订阅、订单管理、风控校验。

应用层是用户直接面对的界面,统一采用Web交互,本地起一个FastAPI服务,前端用Vue3构成的单页应用。之所以不用桌面客户端,是因为Web界面在扩展性和跨设备访问上更方便——手机浏览器也能连上局域网内的服务,交易下单时不用守在电脑前。

接入层管外部对接,包括券商API、数据源API、LLM接口。这里做了统一抽象,外部依赖全部走适配器模式,换一家券商或换一个数据源,不需要改动核心逻辑。

通信机制上,除了Redis Streams做异步事件,模块之间的同步调用用FastAPI的内部HTTP接口。为什么不直接用gRPC或消息队列做全部通信?大部分场景是低频率的操作请求,HTTP足够简单可靠;只有行情推送这类高频数据才走消息队列。做个人项目,架构要克制,不要为了技术炫技引入不必要的复杂度。

2.3 分层权限与数据隔离设计

一个同时管研究和交易的工具,权限设计不能马虎。我的做法是三级权限:

  • 只读层:研究模块生成的分析报告、办公模块的文档资料,只允许查看和导出;
  • 操作层:回测任务、参数修改、文档编辑,需要手动确认;
  • 交易层:所有下单操作必须经过二次确认,且通过独立的风控校验服务。

数据隔离方面,三个域的数据文件存放在不同目录,并做了读写权限区分。交易凭证和API密钥存在独立的加密目录下,其他模块无权读取。即便LLM在生成代码或分析文本时,也拿不到密钥内容——上下文构建时做了严格过滤。

这套设计看起来繁琐,但实际用下来非常必要。AI工作台最大的风险不是AI做错事,而是AI在权限边界模糊时做错事。分层清晰了,大部分风险在设计层面就被消解了。

3. 核心模块拆解:研究、办公、交易三个域的落地逻辑

3.1 Quant域的实质:让LLM从笔记本走进策略研发全流程

量化研究模块和传统的Notebook方案有很大区别。传统做法是在Jupyter里写代码做实验,记录冗长且难以结构化。我把研究工作流拆成四个阶段:数据准备、策略实验、回测验证、结论沉淀。

数据准备阶段,写了一个数据管道适配器,支持从AKShare、Tushare或本地CSV文件拉取行情数据,统一转成Parquet格式存储。Parquet在列式读取和分析性能上比CSV好太多,百万级K线数据在本地做因子计算的效率提升明显。

策略实验阶段,LLM在这里扮演"编码助手"的角色。用户用自然语言描述一个策略想法,比如"计算过去20日动量因子,按行业分组排序",系统会自动生成对应的Python代码框架,包含数据加载、因子计算、分组排序等骨架逻辑。用户再手动补充和完善细节。这里的关键不是让LLM全自动生成能直接跑的策略——那种想法在实操中基本不靠谱——而是让LLM处理重复性的样板代码,把人的精力留下做真正需要判断的部分。

回测验证阶段接入了自研的回测引擎。一个完整的回测配置示例:

{ "symbol_pool": ["000300.SH", "000905.SH"], "factor": "momentum_20d", "rebalance_freq": "weekly", "benchmark": "000300.SH", "cost_model": { "commission_rate": 0.0003, "slippage_rate": 0.001 }, "period": { "start": "2020-01-01", "end": "2024-12-31" } }

回测完成后自动生成一份包含收益曲线、最大回撤、夏普比率、换手率等指标的报告,并存入研究数据库。研究数据有了结构化沉淀之后,办公域的任务生成和信息聚合才有内容可用。过去"研究结论散落在各个Notebook里"的问题得到了根除。

3.2 Work域的难点:不是文档生成,而是信息流的自动流转

办公模块很多人以为就是接一个LLM生成周报和纪要,但我做下来发现最耗精力的其实是信息流转。研究模块产生的新结论、交易模块产生的订单记录、盘中产生的临时想法,这些信息如果不做结构化整合,办公模块就是无源之水。

这个模块实现的核心功能有三块:

第一,任务自动生成。研究模块回测完成一个策略、交易模块触发一次风控告警、或者自定义的事件规则命中时,系统会自动生成一条待办任务,包含事件来源、优先级、截止时间和关联上下文。比如"策略momentum_20d回测完成,夏普比率低于阈值,需要人工复核参数"。

第二,文档半自动生成。每天收盘后,系统自动聚合当日的行情总结、交易记录、策略信号变动,生成一份日报初稿。我再花几分钟修改补充细节,一份标准的交易日志就完成了。这个功能节省的时间不是几分钟的问题——过去手动写日报至少半小时,现在基本控制在五分钟以内。

第三,知识库管理。研究笔记、交易心得、技术文档全部存在本地目录,支持全文本搜索和语义搜索。这里的语义搜索用的是向量检索,本地部署一个轻量级向量库,嵌入模型选的是BGE系列的中文模型,效果比直接调远程API稳定得多。

工作域最核心的设计原则是"被动记录、主动提醒"。系统不替我做决策,但确保我该看到的信息一定能在我需要的时候出现。盘中来不及记录的临时想法,先甩进一个收件箱式的槽位,收盘后统一整理归档。

3.3 Trade域的底线思维:半自动下单加三层风控

交易模块是最敏感的部分,也是我设计时最谨慎的部分。这个系统不做全自动交易——所有下单都必须有人工确认环节。行情订阅和信号计算可以自动完成,但真正的订单提交需要用户点击确认,而且这个确认环节在Web界面和移动端都做了独立验证。

下单接口的适配器模式帮了大忙。国内不同券商的API差异很大,封装层统一了行情、查询、下单、撤单四个核心操作,接新券商时只需要实现对应的适配器。以某券商为例,下单函数的核心逻辑长这样:

def place_order(symbol: str, side: str, quantity: int, order_type: str = "limit"): # 校验方向 if side not in ["buy", "sell"]: return {"success": False, "error": "invalid_side"} # 检查标的代码合法性 if not is_valid_symbol(symbol): return {"success": False, "error": "invalid_symbol"} # 获取实时价格做参考 ref_price = get_market_price(symbol) order_params = { "account": config.trade_account, "symbol": symbol, "side": side, "quantity": quantity, "order_type": order_type, "price": ref_price } signature = generate_secure_signature(order_params) return broker_adapter.submit_order(order_params, signature)

三层风控设计是这套系统的底线:

  • 静态风控:下单前检查标的代码合法性、账户状态、可交易数量是否充足;
  • 动态风控:检查订单价格与实时行情的偏离度,比如限价单超过当前价5%直接拦截;单笔订单金额超过仓位阈值时触发预警;
  • 人工确认:所有订单在提交前必须在界面弹窗确认,显示完整的订单参数和风控检查结果。

这套机制跑了一年多,实际拦住过几次风险。有一次一个策略的信号计算出现数据源异常,生成的买入价格严重偏离市场,动态风控直接拦下订单,弹窗提示"价格偏离度超过阈值,请检查数据源"。如果不是这层拦截,那次会以非正常价格成交。所以交易域的设计原则就一句话:宁可漏掉交易机会,也不能让异常订单溜出去。

4. LLM在三个域里的应用边界:不是万能,但做对场景确实提效

4.1 把LLM当"翻译器"而不是"决策者"

这套系统里LLM的角色定位,我反复思考过,最后的结论是:LLM是翻译器和执行辅助工具,不是决策者。研究域的代码生成、办公域的文档整合、交易域的自然语言下单指令解析——本质上都在做"自然语言到结构化操作"的翻译。

自然语言下单指令解析是交易模块里一个典型的应用场景。盘中我想快速下单时,直接在对话框输入"买入沪深300ETF一万块,限价3.9",LLM会解析出交易参数,生成交易对象。但注意,解析完成后仍然走三层风控和人工确认流程,LLM不直接触碰订单提交接口。这是一个很重要的边界。

同理,研究域的LLM代码生成也不会直接修改策略文件,而是生成一个新版本草稿,用户确认后才切换。权限体系的约束同样作用在LLM的操作之上,相当于给AI套上了一件带安全锁的外套。

4.2 本地模型还是云端API:我的选型思路

LLM接口这块,我做了双轨支持:本地模型和远程API。本地模型用Ollama部署,跑的是7B到14B参数规模的量化版本模型,主要处理日常的文档整合和代码辅助任务。远程API用厂商提供的模型接口,主要处理复杂代码生成和深度分析任务。

选型的判断标准是任务延迟、隐私和成本三者权衡。处理交易相关的数据解析、本地文档的信息抽取,因为涉及敏感内容,全部使用本地模型,不出本机。处理公开信息的文本分析、通用代码的生成辅助,可以用远程API,成本更低效果也更好。

实际体验下来,本地7B模型做代码模板生成和摘要类任务完全够用,但做复杂策略的逻辑推理就有些吃力。所以架构上做了模型路由,按任务难度自动分配,而不是一个模型打天下。

4.3 上下文的构建与管理

LLM应用里最容易忽略的是上下文管理。这个工作台里,我给每个任务构建独立的对话上下文,任务结束时归档,避免不同任务之间的信息干扰。上下文里嵌入的数据做了白名单过滤——交易凭证字段、API密钥、个人信息等敏感内容在进入上下文前就被清理掉。

另一个细节是上下文压缩。长对话场景下,直接把全文塞给LLM既浪费token又影响效果。做法是分段摘要:对话超过一定轮数后,自动把早期内容压缩成摘要,保留关键结论和数据指标。实测下来,压缩后的对话在任务理解准确率上反而有所提升,因为噪声变少了。

5. 安全隔离与部署:本地跑这套系统的完整实操

5.1 部署步骤与资源占用参考

整个项目在GitHub上是MIT协议开源,代码仓库里包含了完整的部署脚本。我这里说几个关键步骤和实测数据,供你参考。

环境要求:Linux/macOS都支持,Windows需要WSL2。基础依赖是Python 3.11+、Redis 6.2+、Node.js 18+。数据库SQLite不需要单独装,Python自带支持。

克隆并初始化项目:

git clone https://github.com/yourname/quant-work-trade-workbench.git cd quant-work-trade-workbench # 创建虚拟环境并安装依赖 python -m venv .venv source .venv/bin/activate pip install -r requirements.txt # 初始化配置 cp config.example.yaml config.yaml vim config.yaml # 根据注释填入你的数据源和券商配置 # 启动事件总线和后端服务 docker compose up -d redis uvicorn app.main:app --host 0.0.0.0 --port 8000

前端部分:

cd frontend npm install npm run build # 构建产物由FastAPI直接托管,访问 http://localhost:8000 即可

资源占用方面实测参考:空闲状态内存占用约800MB(包含Redis和Python服务),日常使用CPU占用率在5%以下。跑一次常规策略回测,全速运行1-2分钟,CPU会拉到80%左右,回测结束后恢复正常。加载本地7B模型后,内存占用会额外增加5-6GB,建议机器内存不低于16GB。

5.2 交易凭证与API密钥的安全保存策略

这一块是整篇文章里我最想强调的。交易凭证泄露的后果比策略泄露严重得多——账户资金安全直接受威胁。

我的做法是独立的密钥管理模块,所有敏感信息加密后存储在独立目录,运行期间密钥只在内存中解密。加密方案用Fernet对称加密,主密钥本身通过环境变量或系统钥匙串保存,不写在代码和配置文件里。

动态令牌方面,部分券商的API要求在请求头注入签名或时间戳令牌。这部分逻辑写在适配器层,签名计算全部在本地完成,不经过LLM上下文。即便LLM被诱导输出信息,也接触不到动态令牌的生成逻辑和实时值。

网络隔离上,系统默认只监听127.0.0.1,局域网访问需要手动开启,并且建议配合防火墙规则限定访问来源IP。手机端远程操作我一般通过内网穿透工具临时暴露端口,用完即关,绝不长期开放。

5.3 数据备份与恢复方案

个人工作台最怕的是数据丢失。交易记录、策略研报、回测结果这些数据一旦丢失,损失无法量化。

SQLite单文件备份是最大的优势。我用系统自带的cron做每日备份,备份策略是保留最近30天的全量备份,外加每周一保留一份周备份。备份文件同步到外部硬盘和对象存储各一份,确保本机出问题时数据还有第二和第三落点。

恢复流程也做过演练:在新机器上安装依赖后,将备份文件拷入数据目录,重启服务即可恢复。整个过程不需要额外配置,比传统数据库的迁移简单一个量级。

6. 复盘机制与操作日志:让AI工作台自己"长记性"

6.1 全量操作日志的价值:不只是审计,更是AI进化的养料

系统里跑的所有重要操作都会记录日志,包括时间戳、操作者、操作类型、关联模块、输入输出摘要和最终结果。日志按天滚动存储,保留180天。交易操作日志永久保存。

这个日志体系的价值有两个层面。审计层面,每次下单都能追溯到完整的触发链——哪个策略信号触发的、参数是什么、经过哪些风控检查、人工确认耗时多久。发生问题时可以快速定位。数据层面,这些日志是后续训练个人专属模型和优化工作流的原材料——系统可以根据历史操作习惯,逐渐调整任务优先级、提醒方式和界面布局。

举个具体例子,日志数据显示我每周三和周五下午的研报整理耗时最长,系统就自动在这两个时段提前生成研报草稿,减少我的整理负担。这就是"主动提醒"设计的进阶版,从规则驱动变成数据驱动了。

6.2 操作日志的记录粒度:哪些该记,哪些不该记

日志不是记越多越好,粒度太多会导致噪声淹没信号。我的设计原则是"只记录影响状态变化的事件":

  • 回测任务的开始、结束、结果摘要;
  • 文档的创建、修改、发布;
  • 订单的草稿生成、风控检查、确认提交、成交回报;
  • 配置变更、模型切换、外部API连接状态变化。

像"用户打开了某个页面"、"光标移动"这类琐碎事件一律不记录,没意义且浪费存储空间。实际操作中,微信聊天式的连续操作记录完全没必要,真正起作用的是那些可以触发后续行动的事件日志。

6.3 复盘用例:一套真实的信号误报排查过程

记录完备的操作日志,在复盘时价值巨大。我分享一个真实的排查案例。

有段时间策略回测结果频繁出现信号误报,团队(就我自己)都快被搞疯了。研究模块生成的信号在纸上看起来正常,但实盘模拟时全无效果。打开操作日志按时间线排查,发现数据管道接入的行情源在特定时段出现了重复时间戳,导致因子计算时用了重复数据。

正常情况下这种问题很难定位,但因为有完整日志,能回溯到具体时间点的数据快照和计算参数,对比之后发现数据源异常是唯一变量。最终定位到是行情源的分片推送机制在处理节假日上有Bug,导致数据重复。修复方案很直接:数据管道里加重了去重逻辑,并在接入层增加时间戳连续性校验。

复盘机制的意义就在这里——不是等出了问题再猜,而是利用结构化日志快速缩小范围。这套方法论,从量化研究到日常办公再到交易执行,三个域通吃。

7. 避坑实录:我从这套三合一工作台踩过的几个典型问题

7.1 问题一:回测结果与实盘表现严重背离的固有陷阱

回测跟实盘之间永远有差距,这是无论用什么工具都避不开的。我在这个项目里踩过的最大一个坑是信号过拟合——策略在历史数据上表现惊艳,实盘却一塌糊涂。

原因分析下来主要有三方面:一是参数调节时过度依赖回测指标,忽略了样本外验证;二是成本模型太过理想化,没有充分考虑到实际滑点和冲击成本;三是策略逻辑里隐含了未来函数,比如使用了当时根本拿不到的数据。

现在的处理流程是所有策略在上线前必须过三关:样本外测试、参数敏感性检验、实盘模拟跟踪至少两个月。前两关在研究和回测模块里都有标准化接口,第三关通过交易模块的模拟盘模式完成。这套流程有效减少了很多"看起来很美好"的策略浪费。

7.2 问题二:API变动如何影响整个系统的稳定性

外部API的变动是个人工作台稳定的最大敌人。券商接口升级、数据源字段调整、LLM服务商模型弃用——任何一个变动都可能让系统某一模块失灵。

刚开始踩过几次坑,后来专门建了外部依赖监控模块,定期检查各API连通性和响应数据格式,一旦发现字段缺失或类型异常立即告警。同时所有第三方数据接入都有Schema校验层,格式变化时只报错不崩溃,方便定位是哪个字段出了问题。

更深一层的改进是,数据源抽象层设计了多源切换能力。同一类数据(比如日K线)支持从多个渠道获取,主源故障时自动降级到备用源。这层韧性设计对实盘场景尤其重要——行情源挂掉的时候不能影响交易判断。

7.3 问题三:模块间耦合过紧导致的连锁故障

最初版本的模块间通信做的是同步调用,研究模块直接调用交易模块的接口。结果有一次研究模块处理大数据时阻塞了事件循环,导致交易模块的行情推送延迟了几秒。对于高频场景来说这几秒是致命的。

后来重构为事件驱动架构才彻底解决这个问题。同步调用只在低频配置操作中使用,高频数据全部走消息队列异步处理,模块之间不再有直接的阻塞依赖。重构后系统稳定性提升非常明显,单个模块的故障被限制在局部,不会再引发连锁反应。

这个教训在个人项目里特别容易发生——因为是单人开发,架构边界容易模糊,但模糊一时爽,故障火葬场。个人项目也要用工程化的标准要求自己。

8. 一些值得复盘的设计决策和后续演进方向

8.1 开源协议与项目后续维护的取舍

项目开源时我选了MIT协议,原因很简单:MIT协议对使用者最友好,无论是个人使用还是商业集成都没有障碍。本身这就是个个人工具,开源出来是希望更多人用起来、提反馈,让项目在真实场景里打磨得更扎实。

开源项目的维护节奏是每两周一个迭代版本,优先修Bug和兼容性问题,新功能小步快跑。文档方面大概率做不到面面俱到,但README和部署文档是底线,必须保证新人能照着部署成功。

8.2 从个人工具到公共项目:可持续演进的路径

单机个人工作台做好之后,自然的演进方向是支持多用户和共享研究能力。比如同一个策略研究工作流,可以让多个协作者在各自的研究分支上独立开发,再通过合并机制整合成果。交易模块的权限控制升级为多角色管理,不同人只能看到各自权限范围内的信息。

另一个方向是把研究模块沉淀的因子库和策略模板做成一站式的策略研发框架,对外输出一部分可以独立使用的能力。这样项目就不只是一个工具,而是一个量化研究和交易辅助的基础设施了。

8.3 给想尝试这类项目的朋友几个建议

  • 先明确边界,不要一上来就追求大而全。Quant、Work、Trade三个域可以先做最核心的闭环,再逐步补齐;
  • 安全设计要前置,不要等出事了再补。交易凭证的加密、权限隔离、日志审计这些在第一天就要设计进去;
  • 日志的价值会比你想象的大得多,尤其是复盘和排错的时候。宁可多记也不要少记重要事件;
  • 外部依赖做好适配层和降级方案,API变动是常态而不是例外;
  • 这类工具最后拼的不是功能多强,而是它能不能融入你的工作习惯。界面和交互尽量贴合自己的使用逻辑。

我在这个项目上最深的体会是,个人AI工作台的核心不是"AI有多聪明",而是"它有没有真正帮你省时间、控风险、沉淀知识"。一个能够稳定运行、数据安全、操作透明的工具,哪怕AI能力平平,也比一个功能炫酷但不可靠的系统强得多。后续扩展方向我打算聚焦两条线:一是提升策略研究模块的自动化深度,让LLM在更多环节提供有效辅助;二是把复盘机制从操作日志升级为更完整的知识沉淀体系,让系统真正"越用越懂你"。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询