马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 0001 于 2026-6-6 23:32 编辑
我所知道的文化程度、财富地位高一些的人都有自己的个人量化交易系统。以前量化交易只属于机构和大佬,然现在时代变了。
以前大家都是自己写量化交易小型系统,适配某个市场的回测程序和社会情绪风控。属于小圈子里的小众赚钱渠道。后来大模型开源了可以用本地nvidia cuda和256g+内存的mac设备跑开源大模型的ai量化了,再后来大模型api降价到没有门槛了。
2026年我愿称为个人ai量化交易元年,有ai的辅助每个人都应该有自己的个人ai量化系统,ai选股->回测->评分->决策->双ai风控->执行买入/卖出决策。以前需要自己写专门程序来交易,现在不需要了。(如果想要定制自己的ai量化系统,还是可以根据这个流程自己写一份轻量化的量化交易系统,更适合在nas上跑)
先简单介绍一下这个QuantDinger:
QuantDinger 是可自托管、本地优先的量化 OS——不是带买入按钮的聊天机器人。它在同一套生产级栈里统一 多 LLM 研究、Python 原生策略引擎、服务端回测 与 多券商实盘(10+ 加密货币 venue、IBKR、MT5、Alpaca),数据与密钥完全由你掌控。
五层量化引擎闭环:想法 → 指标 → 策略 → 回测 → 优化 → 执行 → 监控——行情进,审计订单出。
技术亮点
| QuantDinger 的差异化 | | 全栈量化 OS | 图表、指标 IDE、AI 研究、回测、实盘机器人、快速交易、券商账户管理——一个产品,一个 Postgres 状态库。 | | Agent 原生 | 一等公民 Agent Gateway(/api/agent/v1)+ PyPI 上的 quantdinger-mcp——Cursor、Claude Code、Codex 可读行情、跑回测、下单(默认纸面),全链路审计。 | | 双策略运行时 | IndicatorStrategy(向量化 dataframe 信号 + 图表叠加)与 ScriptStrategy(事件驱动 on_bar、显式下单)——研究与生产同一套代码库。 | | 多 venue 执行 | CCXT 加密货币(Binance、OKX、Bybit…)、IBKR 美股、MT5 外汇、Alpaca 美股/ETF/加密货币——统一经纪商账户页,多租户会话隔离。 | | 生产级基础设施 | PostgreSQL 16 + Redis 7、连接池、后台 Worker(挂单、组合监控、反思任务)、幂等 schema 引导、GHCR 多架构镜像(amd64/arm64)。 | | 安全默认开启 | 拒绝默认 SECRET_KEY、Agent token 哈希存储、默认仅纸面交易(服务端显式解锁才可实盘)、每次 Agent 调用写审计日志。 | | 运营商就绪 | OAuth、多用户角色、积分/会员/USDT 计费开关、AWS Marketplace AMI、7 语言文档——可在此基础上做商业化量化产品,而不只是 hobby bot。 |
准备与部署:
1)克隆仓库
项目地址: brokermr810/QuantDinger ,打包下载源码文件,或者使用git clone命令(git clone https://github.com/brokermr810/QuantDinger.git && cd QuantDinger)clone本仓库。(也可以使用预构建后台镜像,不用下载到本地,但拉取有点慢,故采用自主编译)。
2)修改compose端口和镜像代理
把仓库根目录下的 env.example 文件复制一份并重命名为 .env,对照下面我修改好的变量修改文件内容:
- # Optional custom ports
- # FRONTEND_PORT=8888
- # BACKEND_PORT=127.0.0.1:5000
- DB_PORT=127.0.0.1:5439 # postgres默认端口附近几个端口可能被nas系统占用,没有深入检查验证。更换其他端口正常。
- REDIS_PORT=127.0.0.1:6380 # redis端口同理
复制代码- # Global image source switch
- # Leave empty for official Docker Hub:
- IMAGE_PREFIX=docker.m.daocloud.io/library/ # 增加镜像代理
复制代码
3)创建后端配置(必做)
把 backend_api_python/env.example 文件复制一份并重命名为 .env
绝大多数运行时行为由 backend_api_python/.env 控制(数据库、管理员、LLM、工作进程、计费等)。仓库根目录下的 .env 仅用于 Compose 级变量(如 端口、镜像前缀 `IMAGE_PREFIX`),与业务配置是两层概念。 - SECRET_KEY=xxx (≥ 32 字节用于 HS256(JWT)。生成方式:python -c "import secrets; print(secrets.token_hex(32))" 发给ai生成一个就行,不用再去部署python环境)
复制代码 其他参数按需修改,不想修改再后台也可单独修改。
4)启动
整个完整的仓库上传到你nas到docker文件夹中,项目->创建->填写项目名称、填写存放路径->填写compose(项目介绍的命令行部署方式不太方便直接应用在nas,我修改了一下docker-compose内容,适配绿联的nas)
- # =============================================================================
- # QuantDinger - 绿联 NAS DXP4800 Plus 部署配置
- # =============================================================================
- #
- # 适用设备:绿联 DXP4800 Plus(Intel N100 / 16GB RAM / UGOS Pro)
- # 8GB 版本用户请手动调低各项资源限制
- #
- # 特性:
- # - 后端从本地源码构建(NAS 编译),前端使用 GHCR 预构建镜像
- # - 内存限制适配 16GB 设备,预留 NAS 系统 + Docker 约 10GB
- # - 持久化卷映射到 NAS 存储池,方便备份
- # - 端口已调整,避免与 UGOS Web 面板冲突
- # - 可选国内镜像加速
- #
- # ===================== 绿联 NAS 特殊说明 =====================
- #
- # 1. 存储路径:
- # - 所有持久化数据使用绑定挂载(bind mount),路径为 compose 文件所在目录的子目录
- # - 即:./postgres_data、./redis_data、./backend_logs、./backend_data
- # - 方便备份和查看——直接在 NAS 文件管理器中可见
- #
- # 2. 端口冲突:
- # - UGOS Web 面板默认使用 80/443 端口
- # - 前端默认映射到 8888,不会冲突
- # - PostgreSQL 默认仅绑定 127.0.0.1(仅本机访问),安全且无冲突
- #
- # 3. 国内网络:
- # - 设置 IMAGE_PREFIX=docker.m.daocloud.io/library/ 加速基础镜像拉取
- # - GHCR 前端/后端镜像可能需要代理;如拉取失败,可在 NAS 上配置 Docker 代理
- #
- # 4. 资源限制:
- # - 本配置针对 16GB 版本优化,整个栈约 6GB
- # - 为 UGOS 系统和其他 Docker 服务预留约 10GB
- #
- # =============================================================================
- services:
- # ========================
- # PostgreSQL 数据库
- # ========================
- postgres:
- image: ${IMAGE_PREFIX:-}postgres:16-alpine
- container_name: quantdinger-db
- restart: unless-stopped
- # === NAS 资源限制(16GB 版本)===
- mem_limit: 1g
- memswap_limit: 1g
- cpus: "1.5"
- # ===================================
- environment:
- POSTGRES_DB: ${POSTGRES_DB:-quantdinger}
- POSTGRES_USER: ${POSTGRES_USER:-quantdinger}
- POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-quantdinger123}
- TZ: ${TZ:-Asia/Shanghai}
- PUID: 1000
- PGID: 10
- command:
- - "postgres"
- - "-c"
- - "max_connections=${PG_MAX_CONNECTIONS:-120}"
- - "-c"
- - "shared_buffers=${PG_SHARED_BUFFERS:-256MB}"
- - "-c"
- - "effective_cache_size=768MB"
- - "-c"
- - "maintenance_work_mem=64MB"
- - "-c"
- - "wal_buffers=16MB"
- - "-c"
- - "work_mem=8MB"
- volumes:
- # 绑定挂载到 compose 文件所在目录的 postgres_data 子目录
- - ./postgres_data:/var/lib/postgresql/data
- - ./backend_api_python/migrations/init.sql:/docker-entrypoint-initdb.d/01-init.sql
- ports:
- - "${DB_PORT:-127.0.0.1:5432}:5432"
- networks:
- - quantdinger-network
- healthcheck:
- test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-quantdinger} -d ${POSTGRES_DB:-quantdinger}"]
- interval: 15s
- timeout: 10s
- retries: 5
- start_period: 20s
- # ========================
- # Redis 缓存
- # ========================
- redis:
- image: ${IMAGE_PREFIX:-}redis:7-alpine
- container_name: quantdinger-redis
- restart: unless-stopped
- # === NAS 资源限制(16GB 版本)===
- mem_limit: 512m
- memswap_limit: 512m
- cpus: "0.5"
- # ===================================
- command: ["redis-server", "--maxmemory", "128mb", "--maxmemory-policy", "allkeys-lru", "--save", "900", "1", "--save", "300", "10"]
- volumes:
- # 绑定挂载到 compose 文件所在目录的 redis_data 子目录
- - ./redis_data:/data
- ports:
- # 注意:NAS 系统可能占用 6379 端口,遇到冲突时通过环境变量 REDIS_PORT 修改
- - "${REDIS_PORT:-127.0.0.1:6379}:6379"
- networks:
- - quantdinger-network
- healthcheck:
- test: ["CMD", "redis-cli", "ping"]
- interval: 15s
- timeout: 5s
- retries: 5
- start_period: 10s
- # ========================
- # 后端 API(Python/Flask)
- # ========================
- backend:
- # 从本地源码构建(NAS 编译)
- build:
- context: ./backend_api_python
- dockerfile: Dockerfile
- args:
- BASE_IMAGE: ${IMAGE_PREFIX:-}python:3.12-slim-bookworm
- BUILD_REGION: ${BUILD_REGION:-cn}
- container_name: quantdinger-backend
- restart: unless-stopped
- # === NAS 资源限制(16GB 版本,后端是主要内存消耗者)===
- mem_limit: 4g
- memswap_limit: 4g
- cpus: "2.5"
- # ==========================================================
- depends_on:
- postgres:
- condition: service_healthy
- redis:
- condition: service_healthy
- ports:
- # 默认仅绑定本机,前端 nginx 通过内部网络访问
- - "${BACKEND_PORT:-127.0.0.1:5000}:5000"
- volumes:
- # 绑定挂载到 compose 文件所在目录的子目录
- - ./backend_logs:/app/logs
- - ./backend_data:/app/data
- # 后端运行时配置(必须存在)
- - ./backend_api_python/.env:/app/.env
- environment:
- - PUID=1000
- - PGID=10
- - PYTHON_API_HOST=0.0.0.0
- - PYTHON_API_PORT=5000
- - TZ=${TZ:-Asia/Shanghai}
- - DATABASE_URL=postgresql://${POSTGRES_USER:-quantdinger}:${POSTGRES_PASSWORD:-quantdinger123}@postgres:5432/${POSTGRES_DB:-quantdinger}
- - DB_TYPE=postgresql
- - REDIS_HOST=redis
- - REDIS_PORT=6379
- - CACHE_ENABLED=true
- # === 16GB 版本的连接池参数 ===
- - DB_POOL_MIN=${DB_POOL_MIN:-5}
- - DB_POOL_MAX=${DB_POOL_MAX:-40}
- - DB_POOL_ACQUIRE_TIMEOUT=${DB_POOL_ACQUIRE_TIMEOUT:-15}
- - DB_POOL_HEALTH_CHECK=${DB_POOL_HEALTH_CHECK:-true}
- # === 16GB 版本的并发参数 ===
- - MARKET_EXECUTOR_WORKERS=${MARKET_EXECUTOR_WORKERS:-6}
- - PORTFOLIO_EXECUTOR_WORKERS=${PORTFOLIO_EXECUTOR_WORKERS:-3}
- - GUNICORN_WORKERS=${GUNICORN_WORKERS:-1}
- - GUNICORN_THREADS=${GUNICORN_THREADS:-8}
- - ALLOW_LOCAL_DESKTOP_BROKERS=${ALLOW_LOCAL_DESKTOP_BROKERS:-true}
- - STRATEGY_MAX_THREADS=${STRATEGY_MAX_THREADS:-32}
- # 前端 URL(NAS 访问地址)
- - FRONTEND_URL=${FRONTEND_URL:-http://localhost:8888}
- networks:
- - quantdinger-network
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:5000/api/health"]
- interval: 30s
- timeout: 15s
- retries: 5
- start_period: 60s
- # ========================
- # 前端(Nginx + Vue SPA)
- # ========================
- frontend:
- # 使用 GHCR 预构建多架构镜像
- image: ${FRONTEND_IMAGE:-ghcr.io/brokermr810/quantdinger-frontend}:${FRONTEND_TAG:-${IMAGE_TAG:-latest}}
- pull_policy: always
- container_name: quantdinger-frontend
- restart: unless-stopped
- # === NAS 资源限制 ===
- mem_limit: 256m
- memswap_limit: 256m
- cpus: "0.5"
- # =====================
- ports:
- # NAS Web 面板占用 80/443,使用 8888 避免冲突
- # 如需局域网其他设备访问,去掉 127.0.0.1 前缀:
- # "${FRONTEND_PORT:-8888}:80"
- - "${FRONTEND_PORT:-8888}:80"
- environment:
- - PUID=1000
- - PGID=10
- # nginx 启动时通过 envsubst 注入后端地址
- - BACKEND_URL=${BACKEND_URL:-http://backend:5000}
- depends_on:
- - backend
- networks:
- - quantdinger-network
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost/health"]
- interval: 30s
- timeout: 10s
- retries: 3
- start_period: 10s
- # ========================
- # Docker 命名卷(已废弃 — 所有持久化数据改用绑定挂载)
- # ========================
- volumes: {}
- # ========================
- # 内部网络
- # ========================
- networks:
- quantdinger-network:
- driver: bridge
复制代码
5)验证与登录
| 检查项 | 地址 / 命令 | | Web | http://nas ip:8888(可用根目录 .env 中 FRONTEND_HOST / FRONTEND_PORT 覆盖) | | API 健康 | http://nas ip:5000/api/health |
默认管理员(生产环境请立即修改):
- 用户名:quantdinger
- 密码:123456(来自 env.example;也可在首次登录前于 backend_api_python.env 中设置 ADMIN_USER / ADMIN_PASSWORD)
6)可选:打开 AI 能力
AI 分析、自然语言生成代码等需至少配置一个 LLM 供应商。打开 backend_api_python/env.example 中的 AI / LLM 小节,将对应变量复制到你的 .env(例如 LLM_PROVIDER + OPENROUTER_API_KEY)。修改后需重启 backend 容器。
或 登录后台-系统设置-AI/LLM配置 进行修改AI API设置。
现货全仓平仓若因手续费导致「可卖数量略小于持仓」,可在管理后台 设置 → 实盘交易(Live Trading) 调整 SPOT_CLOSE_SAFETY_RATIO(平仓安全系数,默认 0.998)与 SPOT_OPEN_QUOTE_BUFFER(开仓占用 USDT 比例,默认 0.995);也可直接写入 backend_api_python/.env。保存设置后会热加载,无需重建镜像。
首次使用建议路径(产品功能)
栈健康后建议顺序:(1)做一次 AI 资产/市场分析,确认 LLM 与数据链路;(2)打开 指标 IDE,选合约/现货,做小区间 信号回测;(3)需要时用 AI 写指标/策略 再手改 Python;(4)再在个人中心绑定 交易所 API,先 测试连接,最后按需使用 实盘策略 或 快速交易 并选对执行模式。这样能在上真实资金前尽早暴露配置问题。
随便截个策略的一笔小交易吧
|
|