构建一个智能投顾AI助手

# 简述

今年的工作全部精力都投入到Agent相关内容了,惊叹于AI发展过于迅速,尤其是AI编程在今年实现了商业化,自己也买了一年GLM订阅。今年也是我的投资生涯元年,看了几本书就妄想能在股市中大展手脚,好在今年是牛市,收益也超出了自己的预期,我的原则是不追求短期利益,着眼于长期投资。投资也是一个技术活,要看懂周期,看懂行业,看懂技术指标,在繁忙的工作中,这些分析会占用很大的精力,我在想,能否自己来做一个投资Agent来帮我分析呢?

接下来便投入到了研究和探索。最早接触到的是TradingAgents,它是Github一个开源的股票分析项目,多个Agent根据获取的不同信息,左右互搏,帮助投资者实现分析目的。为了深入分析这套体系,我用trpc-Agent-go重新实现了改项目,获取资源的工具统一用mcp实现,这一套下来,看起来分析的是头头是道,但是内容太多普通人难以辨别,运行一次就需要10-20分钟,并且该项目没有一个好的前端用户体验,遂作废。

TradingAgents学到的经验,我总结了要做好一个投资助手要满足以下条件: 1.架构上要够简单,能够泛化 2.数据源要稳定,市场上开源数据很难同时一次性满足A股、港股、美股 3.要有一个好的客户端用户体验,电脑、手机设备

为此以下,我设计了这套解决方案:使用开源客户端,接入大模型,接入MCP数据源,设计提示词,只需要输入股票代码便能够分析。下面将详细记录我的做法。

  graph TB
    A[用户] --> B[AI客户端<br/>Cherry Studio/Kelivo/RikkaHub]
    B --> C[AI Agent<br/>GLM4.6/OpenRouter]
    C --> D[MCP工具层]
    D --> E[LongPort MCP<br/>行情数据/交易执行]
    E --> F[长桥OpenAPI<br/>A股/港股/美股]

    B --> G[提示词引擎]
    C --> H[投资分析逻辑]
    D --> I[风险监控]

    style A fill:#e1f5fe
    style B fill:#f3e5f5
    style C fill:#e8f5e8
    style D fill:#fff3e0
    style E fill:#ffebee

# 数据源选型

开源仓库:https://github.com/longportapp/openapi

数据源选择的是长桥,长桥是一家位于香港的券商,他们有着阿里的背景,核心创始团队很多来自阿里,在2025年5月16日便开放了mcp,据说是券商行业首个mcp,一次性可以接入A股、港股、美股数据。

他们的mcp是使用的rust实现,很多mcp客户端可能是由于协议差异原因,无法接入,后面我会详细讲解。

# 大模型选型

这部分其实选择最好的模型即可,需要支持Function Call。我自己付费了OpenrouterGLM,目前用的是GLM4.6较多一些。

# 客户端选型

以下都是开源的客户端

# 构建MCP服务

这部分原本我觉得会很快完成的,没想到长桥的mcp在手机的客户端无法使用,付出了很大精力寻找手机客户端,在项目Issues中提问,寻找解决方案,退而求其次web版的lobe-chat总应该行吧?连接是正常的,但是调用异常。

后来我偶然间想到是否有mcp代理服务,比如将stdio协议转换成streamable http协议,将sse协议转换成stdio等,也就是协议的互转。也许能够解决协议不兼容的部分。fastmcp proxy可以完美实现我的想法。

接下来还要解决访问权限的问题,长桥mcp并没有该功能,我的解决方案是加一层nginx,使用http用户名/密码基本身份验证,作为个人使用足够了。最后完美方案是nginx + fastmcp-proxy + longport-mcp架构。

# 项目目录

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
.
├── docker-compose.yaml
├── longport
│   ├── Dockerfile
│   ├── mcp-servers.json
│   ├── proxy_server.py
│   └── requirements.txt
└── nginx
     ├── .htpasswd
     └── conf.d
          └──api.conf

# nginx

# api.conf

1
2
3
4
5
6
7
8
9
server {
    listen 80;

    location /mcp {
        auth_basic "please input password";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://longport:8000/mcp;
    }
}

# .htpasswd

  • 安装工具
1
2
3
4
# Debian/Ubuntu
sudo apt-get install apache2-utils
# CentOS/RHEL
sudo yum install httpd-tools
  • 生成密码文件

请特别注意 -c参数只在第一次创建文件时使用,后续添加用户时去掉 -c,以免覆盖现有文件

1
sudo htpasswd -c /etc/nginx/.htpasswd myuser
  • 添加更多用户
1
sudo htpasswd /etc/nginx/.htpasswd anotheruser

# nginx + longport-mcp架构

这是直接使用长桥mcp服务,该方案存在大部分客户端兼容性问题

  flowchart LR
    A[AI客户端] --> B{HTTP请求<br/>:8080}
    B --> C[Nginx<br/>Basic Auth]
    C --> D[LongPort MCP<br/>HTTP服务]
    D --> E[长桥证券API]

    C --> F[认证失败]
    F --> G[401错误]

    D --> H[协议兼容性问题]
    H --> I[连接异常]

    style C fill:#fff3e0
    style D fill:#ffebee
    style H fill:#ffcdd2

# longport-mcp(Dockerfile)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM debian:bookworm-slim

# 安装必要的运行时依赖
RUN apt-get update && apt-get install -y \
    curl \
    ca-certificates \
    unzip \
    tar \
    sudo \
    && rm -rf /var/lib/apt/lists/*

# 创建目录和日志
RUN mkdir -p /app/logs

# 下载并安装 longport-mcp
RUN curl -sSL https://raw.githubusercontent.com/longportapp/openapi/refs/heads/main/mcp/install | bash

# 暴露端口
EXPOSE 8000

# 设置工作目录
WORKDIR /app

# 启动命令 (直接使用环境变量,程序自动读取)
CMD ["longport-mcp", "--http", "--readonly", "--bind", "0.0.0.0:8000", "--log-dir", "/app/logs"]

# docker-compose.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
version: '3.8'

services:
  longport-nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      # 挂载配置文件目录
      - ./nginx/conf.d:/etc/nginx/conf.d
      # 挂载Lua脚本和依赖库目录
      - ./nginx/.htpasswd:/etc/nginx/.htpasswd
    depends_on:
      - longport
    restart: unless-stopped
  longport:
    build: ./longport
    environment:
      # 中国地区配置
      - LONGPORT_REGION=CN
      # 认证信息 (请填入你的真实信息)
      - LONGPORT_APP_KEY=your-app-key
      - LONGPORT_APP_SECRET=your-app-secret
      - LONGPORT_ACCESS_TOKEN=your-access-token
      # 日志配置
      - RUST_LOG=info
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

# nginx + fastmcp-proxy + longport-mcp架构

完美兼容性方案

  flowchart TB
    A[用户设备] --> B[AI客户端]
    B --> C[HTTP请求]
    C --> D{Nginx反向代理<br/>端口8080}
    D --> E[Basic Auth认证]
    E --> F[FastMCP Proxy<br/>协议转换]
    F --> G[LongPort MCP<br/>Stdio协议]
    G --> H[长桥证券API]

    subgraph "安全边界"
        D --> E --> F
    end

    subgraph "协议转换层"
        F --> G
    end

    subgraph "数据服务层"
        G --> H
    end

    style D fill:#ffebee
    style F fill:#e8f5e8
    style G fill:#e1f5fe

# fastmcp-proxy + longport-mcp(Dockerfile)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
FROM python:3.11-slim

# Set working directory
WORKDIR /app

# Install system dependencies
RUN apt-get update && apt-get install -y \
    curl \
    ca-certificates \
    unzip \
    tar \
    sudo \
    && rm -rf /var/lib/apt/lists/*

# Copy requirements and install Python dependencies
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

RUN mkdir -p /app/logs

# Download and Install longport-mcp
RUN curl -sSL https://raw.githubusercontent.com/longportapp/openapi/refs/heads/main/mcp/install | bash

# Copy the proxy server code
COPY . .

# Expose port
EXPOSE 8000

# Run the proxy server
CMD ["python", "proxy_server.py"]

# proxy_server.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
import json
from fastmcp import FastMCP

# Load config from JSON file
config_path = "/app/mcp-servers.json"
with open(config_path, 'r') as f:
    config = json.load(f)

# Create and run proxy
proxy = FastMCP.as_proxy(config, name="MCP Proxy")

if __name__ == "__main__":
    proxy.run(
        stateless_http=True,
        transport="http",
        host="0.0.0.0",
        port=8000
    )

# mcp-servers.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "mcpServers": {
    "longport-mcp": {
      "command": "/usr/local/bin/longport-mcp",
      "env": {
        "LONGPORT_APP_KEY": "your-app-key",
        "LONGPORT_APP_SECRET": "your-app-secret",
        "LONGPORT_ACCESS_TOKEN": "your-access-token"
      }
    }
  }
}

# requirements.txt

1
fastmcp==2.14.0

# docker-compose.yaml

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
version: "3.8"

services:
  longport-nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      # 挂载配置文件目录
      - ./nginx/conf.d:/etc/nginx/conf.d
      # 挂载Lua脚本和依赖库目录
      - ./nginx/.htpasswd:/etc/nginx/.htpasswd
    depends_on:
      - longport
    restart: unless-stopped
  longport:
    build: ./longport
    environment:
      # 日志配置
      - RUST_LOG=info
    volumes:
      - ./logs:/app/logs
      - ./longport/mcp-servers.json:/app/mcp-servers.json
    restart: unless-stopped

# 编写提示词

提示词可以根据自己的投资风格进行编写,千人千面,这里就不进行分享了。

# 结语

工具只是辅助,万不可全部都相信工具、大V,投资需谨慎。最后,祝大家在投资的道路上都能挣大钱!

# 参考

Licensed under CC BY-NC-SA 4.0