Bitcoin 价格分析与实时数据 API:使用 Python、PostgreSQL 与 FastAPI 打造开箱即用的加密工具

·

从 Trust Wallet 里第一笔 BTC 转账开始,我亲历了比特币的狂热、恐慌与漫长的均线修复。2022 年初,我完全放弃日内炒币,转而用“低买高持”的长线策略持续定投;2024 年,为了让每一次仓位调整都有据可循,我正式开源了 Bitcoin 价格分析与实时数据 API。这套工具把 9 年历史行情、实时成交价与简洁的统计指标打包成 RESTful 接口,开发者、交易员和量化研究员都能在 30 秒内集成到自己的系统里。本文将分章节拆解搭建全过程,并给出可直接跑起来的代码片段,方便你在本地一键启动自己的“私人行情中心”。


一、为什么 Bitcoin 需要独立 API?

“历史数据 + 实时价格 + 交易所汇总”看似唾手可得,但真正做策略回测时,你会发现:

因此,我为自己设计了一个 Bitcoin API,满足三类场景:

  1. 历史数据:一键获取任意年份或减半事件前后的日线 OHLCV(开盘价、最高价、最低价、收盘价、成交量)。
  2. 实时数据:毫秒级聚合 Binance、CoinGecko、Kraken 等主流交易所最新成交价。
  3. 统计指标:快速返回日均波动率、7 日均值、历史最大回撤等常用量化字段。

在这一过程中,我深度体验到了 FastAPI 的异步能力让实时请求跑得飞快,而 PostgreSQL 表分区则把历年几十 GB 数据压缩到 1 s 内即可聚合完毕。


二、FastAPI 技术栈如何选型?

技术选择理由关键词
FastAPI原生异步、自动生成 OpenAPI 文档FastAPI 入门、Python 构建 API
PostgreSQL支持窗口函数和 JSONB,分析型查询快PostgreSQL 时间序列优化、分区表设计
SQLAlchemy & AlembicORM 与迁移同步管理,不怕改表SQLAlchemy 快速上手、Alembic 使用教程
Pydantic运行时类型检查,拒绝脏数据闯入Pydantic Schema 校验

整个项目在 GitHub Actions 中跑 pytest,每次合并请求都会自动跑单元测试与代码覆盖率报告,确保主分支始终 CI/CD 就绪


三、目录结构最佳实践

btc_api/
├── alembic/              # 数据库迁移脚本
├── app/
│   ├── models/           # SQLAlchemy ORM
│   ├── routers/          # 历史数据 & 实时数据路由
│   ├── schemas/          # Pydantic 模型
│   └── main.py           # FastAPI 实例
├── data/                 # 历史 CSV 备份
├── docker-compose.yml    # 一行命令起服务
└── README.md             # 本地部署手册

重点看两行文件即可启动:

随时可在 Swagger UI 上调试接口:http://localhost:8000/docs


四、核心路由拆解与代码片段

1. 历史行情接口

基于 SQLAlchemy 创建 bitcoin_prices 表,按日期分区,主索引建在 (date, close)

# app/routers/historical.py
@router.get("/prices/{year}")
async def get_year_prices(year: int, db: AsyncSession = Depends(get_db)):
    query = select(BitcoinPrice).where(BitcoinPrice.date.between(
        datetime(year, 1, 1),
        datetime(year, 12, 31)
    ))
    rows = await db.execute(query)
    return rows.scalars().all()

访问示例:

GET /prices/2023
// 返回 2023-01-01 至 2023-12-31 的每日 OHLCV 列表

2. 比特币减半价格区间

内置一张 halvings 表记录减半日期,提供 ±100 天参考数据:

GET /prices/halving/4

为参数 4 对应的 2024 年减半事件返回前后 200 天价格,一键观察“减半效应”。

3. 实时价格聚合

通过异步任务并发请求 4 大交易所,取中位数作为最可信价格:

# app/routers/realtime.py
async def aggregate_price():
    urls = {
        "Binance": "https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT",
        "CoinGecko": "https://api.coingecko.com/api/v3/simple/price?ids=bitcoin&vs_currencies=usd",
        ...
    }
    results = await asyncio.gather(*[fetch(url) for url in urls.values()])
    return median_price(results)

日均延迟 ≈ 280 ms,可支撑量化脚本秒级调仓。


五、部署与二次开发

开箱即用的 Dockerfile 支持 ARM64 与 x86,本地 Mac Apple Silicon 与 AWS EC2 AMD 服务器均可一键运行:

docker build -t btc-api .
docker run -p 8000:8000 btc-api

若想扩展:

👉 出门左转,一分钟上手 Docker 版 API 示例与源码仓库,免费克隆即用。


六、常见问题与解答(FAQ)

Q1:历史数据完整吗?

A1:目前涵盖 2015-01-01 至昨日收盘,共 3300 万+ 条分钟线。可通过 load_data.py 自动补齐遗漏日期。

Q2:如何把实时端点改造为 WebSocket 推送?

A2:FastAPI 自带 WebSocket,升级代码不到 30 行。示例在 /examples/websocket.py,直接 pip install websockets 即可。

Q3:PostgreSQL 表分区会不会影响写性能?

A3:按月分区 + B-tree 索引实测写入 1 万条/秒,CPU 占用 <15%,推荐 SSD + fillfactor=90

Q4:Docker 镜像体积大吗?

A4:基于 python:3.11-slim,最终镜像 146 MB;启用多阶段构建后可压缩到 98 MB。

Q5:我想跑 ARIMA 建模,Python 环境预装哪些库?

A5:requirements.txt 已集成 pandas, statsmodels, scikit-learn,启动容器即可 import

Q6:能否私有化部署且不开源我的改动?

A6:项目 MIT 许可证,允许闭源二次发行,只需保留原始版权文件与协议文本。


七、未来路线图


八、一起共建

本 API 完全 开源 在 GitHub,欢迎用 issue 提需求、Pull Request 送新功能。👉 点击获取一键启动脚本与开发指南,零门槛零广告体验。 如果你在量化、数据科学或区块链开发遇到任何卡点,在评论区留个邮箱,我会把最精简的部署清单邮件给你。
让我们把 Bitcoin 的数据价值 🔓 彻底释放出来!