绿联NAS私有云社区 门户 查看主题

【邪修】用你的nas设备24小时跑python量化交易,金钱永不眠

发布者: 0001 | 发布时间: 2026-6-6 23:22| 查看数: 57| 评论数: 2|帖子模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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快速演示.gif
2.png
五层量化引擎闭环:想法 → 指标 → 策略 → 回测 → 优化 → 执行 → 监控——行情进,审计订单出。

指标 IDE、图表研究、回测与快速交易.png test.png 交易机器人工作台与自动化模板.png 策略实盘运营、绩效与监控.png

技术亮点
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,对照下面我修改好的变量修改文件内容:
  1. # Optional custom ports
  2. # FRONTEND_PORT=8888
  3. # BACKEND_PORT=127.0.0.1:5000
  4. DB_PORT=127.0.0.1:5439 # postgres默认端口附近几个端口可能被nas系统占用,没有深入检查验证。更换其他端口正常。
  5. REDIS_PORT=127.0.0.1:6380 # redis端口同理
复制代码
  1. # Global image source switch
  2. # Leave empty for official Docker Hub:
  3. IMAGE_PREFIX=docker.m.daocloud.io/library/  # 增加镜像代理
复制代码

3)创建后端配置(必做)
把 backend_api_python/env.example 文件复制一份并重命名为 .env
绝大多数运行时行为由 backend_api_python/.env 控制(数据库、管理员、LLM、工作进程、计费等)。仓库根目录下的 .env 仅用于 Compose 级变量(如 端口、镜像前缀 `IMAGE_PREFIX`),与业务配置是两层概念。
  1. 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)
  1. # =============================================================================
  2. # QuantDinger - 绿联 NAS DXP4800 Plus 部署配置
  3. # =============================================================================
  4. #
  5. # 适用设备:绿联 DXP4800 Plus(Intel N100 / 16GB RAM / UGOS Pro)
  6. # 8GB 版本用户请手动调低各项资源限制
  7. #
  8. # 特性:
  9. #   - 后端从本地源码构建(NAS 编译),前端使用 GHCR 预构建镜像
  10. #   - 内存限制适配 16GB 设备,预留 NAS 系统 + Docker 约 10GB
  11. #   - 持久化卷映射到 NAS 存储池,方便备份
  12. #   - 端口已调整,避免与 UGOS Web 面板冲突
  13. #   - 可选国内镜像加速
  14. #
  15. # ===================== 绿联 NAS 特殊说明 =====================
  16. #
  17. # 1. 存储路径:
  18. #    - 所有持久化数据使用绑定挂载(bind mount),路径为 compose 文件所在目录的子目录
  19. #    - 即:./postgres_data、./redis_data、./backend_logs、./backend_data
  20. #    - 方便备份和查看——直接在 NAS 文件管理器中可见
  21. #
  22. # 2. 端口冲突:
  23. #    - UGOS Web 面板默认使用 80/443 端口
  24. #    - 前端默认映射到 8888,不会冲突
  25. #    - PostgreSQL 默认仅绑定 127.0.0.1(仅本机访问),安全且无冲突
  26. #
  27. # 3. 国内网络:
  28. #    - 设置 IMAGE_PREFIX=docker.m.daocloud.io/library/ 加速基础镜像拉取
  29. #    - GHCR 前端/后端镜像可能需要代理;如拉取失败,可在 NAS 上配置 Docker 代理
  30. #
  31. # 4. 资源限制:
  32. #    - 本配置针对 16GB 版本优化,整个栈约 6GB
  33. #    - 为 UGOS 系统和其他 Docker 服务预留约 10GB
  34. #
  35. # =============================================================================

  36. services:
  37.   # ========================
  38.   # PostgreSQL 数据库
  39.   # ========================
  40.   postgres:
  41.     image: ${IMAGE_PREFIX:-}postgres:16-alpine
  42.     container_name: quantdinger-db
  43.     restart: unless-stopped
  44.     # === NAS 资源限制(16GB 版本)===
  45.     mem_limit: 1g
  46.     memswap_limit: 1g
  47.     cpus: "1.5"
  48.     # ===================================
  49.     environment:
  50.       POSTGRES_DB: ${POSTGRES_DB:-quantdinger}
  51.       POSTGRES_USER: ${POSTGRES_USER:-quantdinger}
  52.       POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-quantdinger123}
  53.       TZ: ${TZ:-Asia/Shanghai}
  54.       PUID: 1000
  55.       PGID: 10
  56.     command:
  57.       - "postgres"
  58.       - "-c"
  59.       - "max_connections=${PG_MAX_CONNECTIONS:-120}"
  60.       - "-c"
  61.       - "shared_buffers=${PG_SHARED_BUFFERS:-256MB}"
  62.       - "-c"
  63.       - "effective_cache_size=768MB"
  64.       - "-c"
  65.       - "maintenance_work_mem=64MB"
  66.       - "-c"
  67.       - "wal_buffers=16MB"
  68.       - "-c"
  69.       - "work_mem=8MB"
  70.     volumes:
  71.       # 绑定挂载到 compose 文件所在目录的 postgres_data 子目录
  72.       - ./postgres_data:/var/lib/postgresql/data
  73.       - ./backend_api_python/migrations/init.sql:/docker-entrypoint-initdb.d/01-init.sql
  74.     ports:
  75.       - "${DB_PORT:-127.0.0.1:5432}:5432"
  76.     networks:
  77.       - quantdinger-network
  78.     healthcheck:
  79.       test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-quantdinger} -d ${POSTGRES_DB:-quantdinger}"]
  80.       interval: 15s
  81.       timeout: 10s
  82.       retries: 5
  83.       start_period: 20s

  84.   # ========================
  85.   # Redis 缓存
  86.   # ========================
  87.   redis:
  88.     image: ${IMAGE_PREFIX:-}redis:7-alpine
  89.     container_name: quantdinger-redis
  90.     restart: unless-stopped
  91.     # === NAS 资源限制(16GB 版本)===
  92.     mem_limit: 512m
  93.     memswap_limit: 512m
  94.     cpus: "0.5"
  95.     # ===================================
  96.     command: ["redis-server", "--maxmemory", "128mb", "--maxmemory-policy", "allkeys-lru", "--save", "900", "1", "--save", "300", "10"]
  97.     volumes:
  98.       # 绑定挂载到 compose 文件所在目录的 redis_data 子目录
  99.       - ./redis_data:/data
  100.     ports:
  101.       # 注意:NAS 系统可能占用 6379 端口,遇到冲突时通过环境变量 REDIS_PORT 修改
  102.       - "${REDIS_PORT:-127.0.0.1:6379}:6379"
  103.     networks:
  104.       - quantdinger-network
  105.     healthcheck:
  106.       test: ["CMD", "redis-cli", "ping"]
  107.       interval: 15s
  108.       timeout: 5s
  109.       retries: 5
  110.       start_period: 10s

  111.   # ========================
  112.   # 后端 API(Python/Flask)
  113.   # ========================
  114.   backend:
  115.     # 从本地源码构建(NAS 编译)
  116.     build:
  117.       context: ./backend_api_python
  118.       dockerfile: Dockerfile
  119.       args:
  120.         BASE_IMAGE: ${IMAGE_PREFIX:-}python:3.12-slim-bookworm
  121.         BUILD_REGION: ${BUILD_REGION:-cn}
  122.     container_name: quantdinger-backend
  123.     restart: unless-stopped
  124.     # === NAS 资源限制(16GB 版本,后端是主要内存消耗者)===
  125.     mem_limit: 4g
  126.     memswap_limit: 4g
  127.     cpus: "2.5"
  128.     # ==========================================================
  129.     depends_on:
  130.       postgres:
  131.         condition: service_healthy
  132.       redis:
  133.         condition: service_healthy
  134.     ports:
  135.       # 默认仅绑定本机,前端 nginx 通过内部网络访问
  136.       - "${BACKEND_PORT:-127.0.0.1:5000}:5000"
  137.     volumes:
  138.       # 绑定挂载到 compose 文件所在目录的子目录
  139.       - ./backend_logs:/app/logs
  140.       - ./backend_data:/app/data
  141.       # 后端运行时配置(必须存在)
  142.       - ./backend_api_python/.env:/app/.env
  143.     environment:
  144.       - PUID=1000
  145.       - PGID=10
  146.       - PYTHON_API_HOST=0.0.0.0
  147.       - PYTHON_API_PORT=5000
  148.       - TZ=${TZ:-Asia/Shanghai}
  149.       - DATABASE_URL=postgresql://${POSTGRES_USER:-quantdinger}:${POSTGRES_PASSWORD:-quantdinger123}@postgres:5432/${POSTGRES_DB:-quantdinger}
  150.       - DB_TYPE=postgresql
  151.       - REDIS_HOST=redis
  152.       - REDIS_PORT=6379
  153.       - CACHE_ENABLED=true
  154.       # === 16GB 版本的连接池参数 ===
  155.       - DB_POOL_MIN=${DB_POOL_MIN:-5}
  156.       - DB_POOL_MAX=${DB_POOL_MAX:-40}
  157.       - DB_POOL_ACQUIRE_TIMEOUT=${DB_POOL_ACQUIRE_TIMEOUT:-15}
  158.       - DB_POOL_HEALTH_CHECK=${DB_POOL_HEALTH_CHECK:-true}
  159.       # === 16GB 版本的并发参数 ===
  160.       - MARKET_EXECUTOR_WORKERS=${MARKET_EXECUTOR_WORKERS:-6}
  161.       - PORTFOLIO_EXECUTOR_WORKERS=${PORTFOLIO_EXECUTOR_WORKERS:-3}
  162.       - GUNICORN_WORKERS=${GUNICORN_WORKERS:-1}
  163.       - GUNICORN_THREADS=${GUNICORN_THREADS:-8}
  164.       - ALLOW_LOCAL_DESKTOP_BROKERS=${ALLOW_LOCAL_DESKTOP_BROKERS:-true}
  165.       - STRATEGY_MAX_THREADS=${STRATEGY_MAX_THREADS:-32}
  166.       # 前端 URL(NAS 访问地址)
  167.       - FRONTEND_URL=${FRONTEND_URL:-http://localhost:8888}
  168.     networks:
  169.       - quantdinger-network
  170.     healthcheck:
  171.       test: ["CMD", "curl", "-f", "http://localhost:5000/api/health"]
  172.       interval: 30s
  173.       timeout: 15s
  174.       retries: 5
  175.       start_period: 60s

  176.   # ========================
  177.   # 前端(Nginx + Vue SPA)
  178.   # ========================
  179.   frontend:
  180.     # 使用 GHCR 预构建多架构镜像
  181.     image: ${FRONTEND_IMAGE:-ghcr.io/brokermr810/quantdinger-frontend}:${FRONTEND_TAG:-${IMAGE_TAG:-latest}}
  182.     pull_policy: always
  183.     container_name: quantdinger-frontend
  184.     restart: unless-stopped
  185.     # === NAS 资源限制 ===
  186.     mem_limit: 256m
  187.     memswap_limit: 256m
  188.     cpus: "0.5"
  189.     # =====================
  190.     ports:
  191.       # NAS Web 面板占用 80/443,使用 8888 避免冲突
  192.       # 如需局域网其他设备访问,去掉 127.0.0.1 前缀:
  193.       #   "${FRONTEND_PORT:-8888}:80"
  194.       - "${FRONTEND_PORT:-8888}:80"
  195.     environment:
  196.       - PUID=1000
  197.       - PGID=10
  198.       # nginx 启动时通过 envsubst 注入后端地址
  199.       - BACKEND_URL=${BACKEND_URL:-http://backend:5000}
  200.     depends_on:
  201.       - backend
  202.     networks:
  203.       - quantdinger-network
  204.     healthcheck:
  205.       test: ["CMD", "curl", "-f", "http://localhost/health"]
  206.       interval: 30s
  207.       timeout: 10s
  208.       retries: 3
  209.       start_period: 10s

  210. # ========================
  211. # Docker 命名卷(已废弃 — 所有持久化数据改用绑定挂载)
  212. # ========================
  213. volumes: {}

  214. # ========================
  215. # 内部网络
  216. # ========================
  217. networks:
  218.   quantdinger-network:
  219.     driver: bridge
复制代码

5)验证与登录
检查项地址 / 命令
Webhttp://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,先 测试连接,最后按需使用 实盘策略 或 快速交易 并选对执行模式。这样能在上真实资金前尽早暴露配置问题。

截屏2026-06-06 22.44.31.png
随便截个策略的一笔小交易吧
截屏2026-06-06 22.45.12.png


最新评论

ewesVR发表于  2 小时前
要有个详细的部署教程就好了,开始有点看不懂
0001发表于  1 小时前
ewesVR 发表于 2026-6-7 12:01
要有个详细的部署教程就好了,开始有点看不懂

都已经好久没有追着人喂饭了
屏幕截图 2026-06-07 121126.png
Copyright © 2026 绿联NAS私有云社区 版权所有 All Rights Reserved. 粤公网安备44030002002555号| 粤ICP备12028978号
关灯 在本版发帖
联系技术支持
返回顶部
快速回复 返回顶部 返回列表