Python自动化炒股:使用FastAPI和Docker Compose部署股票数据服务的实战案例
Python自动化炒股:使用FastAPI和Docker Compose部署股票数据服务的实战案例
引言
在当今数字化时代,自动化炒股已经成为许多投资者的选择。Python以其强大的数据处理能力和丰富的库支持,成为自动化炒股的首选语言。本文将带你了解如何使用FastAPI和Docker Compose部署一个股票数据服务,为你的自动化炒股之旅提供技术支持。
什么是FastAPI和Docker Compose?
FastAPI
FastAPI是一个现代、快速(高性能)的Web框架,用于构建APIs,使用Python 3.6+基于标准Python类型提示。它旨在帮助你更快地开发API,减少样板代码,并提高代码质量。
Docker Compose
Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。使用Docker Compose,你可以通过一个YAML文件来配置你的应用服务,然后使用一个命令来启动和停止所有服务。
环境准备
在开始之前,请确保你已经安装了以下软件:
- Python 3.6+
- Docker
- Docker Compose
构建FastAPI应用
1. 创建项目结构
首先,创建一个新的项目目录,并在其中创建以下文件和目录:
stock_service/
│
├── app/
│ ├── __init__.py
│ ├── mAIn.py
│ └── dependencies.py
├── requirements.txt
└── docker-compose.yml
2. 安装依赖
在requirements.txt
文件中,列出你的项目依赖:
fastapi==0.95.1
uvicorn==0.19.0
3. 编写FastAPI应用
在app/main.py
中,创建一个简单的FastAPI应用:
from fastapi import FastAPI
from typing import List
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/stock/{symbol}")
def read_stock(symbol: str):
# 这里将添加获取股票数据的逻辑
return {"symbol": symbol, "price": "100.00"}
4. 配置Docker Compose
在docker-compose.yml
文件中,定义你的服务:
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/code
- logvolume:/var/log
environment:
- PYTHONUNBUFFERED=1
command: uvicorn app.main:app --host 0.0.0.0 --port 8000
volumes:
logvolume:
运行和测试
1. 构建和运行服务
在项目根目录下,运行以下命令来构建和启动服务:
docker-compose up --build
2. 测试API
使用浏览器或Postman访问http://localhost:8000/
,你应该能看到返回的JSON数据:
{
"Hello": "World"
}
访问http://localhost:8000/stock/AAPL
,你应该能看到:
{
"symbol": "AAPL",
"price": "100.00"
}
深入股票数据服务
1. 获取股票数据
为了获取真实的股票数据,我们可以使用yfinance
库。首先,在requirements.txt
中添加yfinance
:
yfinance==0.1.70
然后,在app/main.py
中,修改read_stock
函数以使用yfinance
获取数据:
import yfinance as yf
@app.get("/stock/{symbol}")
def read_stock(symbol: str):
stock = yf.Ticker(symbol)
hist = stock.history(period="1d")
return {"symbol": symbol, "price": hist['Close'][0]}
2. 处理数据
你可以进一步处理数据,例如计算移动平均线等。在app/dependencies.py
中,添加一个依赖项来计算移动平均线:
import pandas as pd
def calculate_moving_average(data, window):
return data.rolling(window=window).mean()
然后在read_stock
函数中使用这个依赖项:
from .dependencies import calculate_moving_average
@app.get("/stock/{symbol}")
def read_stock(symbol: str):
stock = yf.Ticker(symbol)
hist = stock.history(period="30d")
moving_average = calculate_moving
