Tushare Day1——通过Tushare读取数据并存入MySQL

本文介绍了如何通过Tushare接口获取金融数据,并利用sqlalchemy和pymysql将数据存储到MySQL数据库中。内容包括Tushare接口的使用、ORM工具SQLAlchemy的简介、PyMySQL的安装,以及stock_basic数据的结构和意义。同时,展示了创建数据库表和存储股票交易信息的步骤。

通过Tushare读取数据并存入MySQL

任务:

  • 从api(应用程序编程接口)读取数据并存入mysql

  • 了解stock_basic数据

了解Tushare

Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas DataFrame类型,非常便于用pandas/NumPy/Matplotlib进行数据分析和可视化

下载sqlalchemy和pymysql包

sqlalchemy

  • SQLAlchemy是Python中最有名的ORM工具。

  • 关于ORM:全称Object Relational Mapping(对象关系映射)。

1.用tuple表示一行很难看出表的结构:

[
    ('1', 'Michael'),
    ('2', 'Bob'),
    ('3', 'Adam')
]
[('1', 'Michael'), ('2', 'Bob'), ('3', 'Adam')]

2.如果把一个tuple用class实例来表示,就可以更容易地看出表的结构来:

class User(object):
    def __init__(self, id, name):
        self.id = id
        self.name = name

要在 **飞牛 NAS 的 Docker 环境中**,让 **AkShare 定时抓取股票/指数等金融数据并存 MySQL**,你可以通过以下架构实现: > `Python (AkShare) + APScheduler/Cron + MySQL` > 所有组件运行在 Docker 中(推荐使用 `docker-compose` 统一管理) --- ## ✅ 最终目标 - 📅 每天上午 9:30 自动运行 - 📥 使用 AkShare 抓取 A 股行情(如贵州茅台 600519) - 💾 存储到本地 MySQL 数据库 - 🔁 容器自动重启、数据持久化 - 🧩 部署简单,适合飞牛 NAS 用户操作 --- ## 🛠️ 解决方案:使用 `docker-compose.yml` 一键部署 ### 目录结构 ```bash feiniu-akshare-mysql/ ├── docker-compose.yml ├── akshare_cron.py ├── requirements.txt └── data/ # 映射MySQL数据目录(可选) ``` --- ### 第一步:创建 `requirements.txt` ```txt akshare>=1.9.0 pandas PyMySQL SQLAlchemy APScheduler ``` --- ### 第二步:编写定时任务脚本 `akshare_cron.py` ```python # akshare_cron.py import time import pandas as pd from apscheduler.schedulers.blocking import BlockingScheduler from sqlalchemy import create_engine import akshare as ak # 数据库连接配置 DB_USER = "root" DB_PASS = "your_password" # 请修改为你设置的密码 DB_HOST = "mysql-db" # Docker 内服务名 DB_NAME = "quant_db" TABLE_NAME = "stock_daily" # 创建数据库引擎 engine = create_engine(f"mysql+pymysql://{DB_USER}:{DB_PASS}@{DB_HOST}/{DB_NAME}?charset=utf8mb4") def fetch_and_save_stock(): """抓取指定股票日线数据并保存到 MySQL""" symbols = { "600519": "贵州茅台", "000858": "五粮液", "300750": "宁德时代" } print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] 开始抓取最新行情...") for code, name in symbols.items(): try: # 构造代码缀 if code.startswith("6"): symbol = "sh" + code else: symbol = "sz" + code # 获取数据 df = ak.stock_zh_a_daily(symbol=symbol, adjust="qfq") df['symbol'] = code df['name'] = name df['date'] = pd.to_datetime(df['date']) df.rename(columns={ 'open': 'open_price', 'close': 'close_price', 'high': 'high_price', 'low': 'low_price' }, inplace=True) # 写 MySQL,忽略重复主键(建议添加联合唯一索引) df.to_sql(TABLE_NAME, engine, if_exists='append', index=False, method='multi', chunksize=1000) print(f"✅ 成功更新 {name}({code}) 共 {len(df)} 条记录") except Exception as e: print(f"❌ 更新 {code} 失败: {str(e)}") print("✅ 本次更新完成!\n") if __name__ == "__main__": # 初始化调度器 scheduler = BlockingScheduler() # 添加每日任务:每天 9:30 执行(避开凌晨系统维护) scheduler.add_job(fetch_and_save_stock, 'cron', hour=9, minute=30) # 立即执行一次(容器启动时) fetch_and_save_stock() # 启动定时任务 print("⏰ 定时任务已启动,等待下次执行...") scheduler.start() ``` --- ### 第三步:创建 `docker-compose.yml` ```yaml version: '3.8' services: mysql-db: image: mysql:8.0 container_name: fnas-mysql environment: MYSQL_ROOT_PASSWORD: your_password MYSQL_DATABASE: quant_db ports: - "3306:3306" volumes: - ./data/mysql:/var/lib/mysql # 持久化数据库文件 - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro # 初始化建表(可选) restart: unless-stopped command: --default-authentication-plugin=mysql_native_password akshare-cron: build: context: . dockerfile: Dockerfile container_name: akshare-to-mysql depends_on: - mysql-db restart: unless-stopped ``` --- ### 第四步:创建 `Dockerfile` ```dockerfile FROM python:3.10-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY akshare_cron.py . EXPOSE 8000 CMD ["python", "akshare_cron.py"] ``` --- ### 第五步:初始化建表 SQL(可选)`init.sql` ```sql -- init.sql CREATE TABLE IF NOT EXISTS stock_daily ( `date` DATE, `open_price` DECIMAL(10,4), `high_price` DECIMAL(10,4), `low_price` DECIMAL(10,4), `close_price` DECIMAL(10,4), `volume` BIGINT, `symbol` VARCHAR(10), `name` VARCHAR(50), UNIQUE KEY unique_day_symbol (`symbol`, `date`) ) CHARSET=utf8mb4; ``` > 此表会在 MySQL 启动时自动创建,并防止重复插。 --- ### 第六步:启动服务 在 SSH 终端中运行(确保已安装 Docker 和 Docker Compose): ```bash cd feiniu-akshare-mysql docker-compose up -d ``` ✅ 输出: - 启动两个容器:`fnas-mysql` 和 `akshare-to-mysql` - 首次运行会立即抓取一次数据 - 之后每天 9:30 自动更新 --- ### 第七步:验证结果 #### 查看日志 ```bash docker logs akshare-to-mysql ``` 你应该看到类似输出: ``` [2025-04-05 09:30:01] 开始抓取最新行情... ✅ 成功更新 贵州茅台(600519) 共 20 条记录 ✅ 成功更新 五粮液(000858) 共 20 条记录 ✅ 成功更新 宁德时代(300750) 共 20 条记录 ✅ 本次更新完成! ``` #### 登录 MySQL 查看数据 ```bash docker exec -it fnas-mysql mysql -uroot -pyour_password ``` ```sql USE quant_db; SELECT * FROM stock_daily WHERE symbol = '600519' ORDER BY date DESC LIMIT 5; ``` --- ## 💡 进阶建议 | 功能 | 实现方式 | |------|---------| | 增量更新 | 在查询先查最大日期,只获取新数据 | | 更多股票 | 从 CSV 或数据库读取关注列表 | | 微信通知 | 加 `requests.post()` 调用 Server酱推送 | | Grafana 展示 | 将 MySQL Grafana 做 K 线图 | | 备份策略 | 使用 `mysqldump` 定时导出 SQL 文件 | --- ## ⚠️ 注意事项(针对飞牛 NAS 用户) | 问题 | 建议 | |------|------| | 是否支持 Docker? | 确保开启 SSH 和 Docker 服务 | | 磁盘空间不足? | 将 `data/mysql` 挂载到大容量硬盘 | | 时间不同步? | 添加 `-v /etc/localtime:/etc/localtime:ro` 到 mysql-db | | 安装慢? | 可在国内镜像源加速,或预构建镜像 | | 想开机自启? | `restart: unless-stopped` 已支持断电恢复 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值