一. 前言
一直在考虑用 Python 做一个预警的工具 ,其中就涉及到金融数据获取这个核心的环节。大多数情况下有两种方案 :
爬虫
或者调用接口查询
类似于新浪财经这类网站的信息- 核心用法 : 通过新浪财经的网页上, 就能找到很多可以调用的接口 ,从而获取信息(
有一定延迟
) - 新浪财经 API :"hq.sinajs.cn/list=sh6005…
- EastmoneyDion 东方财富 : push2.eastmoney.com/api/qt/stoc…
- 雪球 API :xueqiu.com/v4/stock/qu…
- Alpha Vantage / Yahoo Finance API /金融界 等等
- 核心用法 : 通过新浪财经的网页上, 就能找到很多可以调用的接口 ,从而获取信息(
- 直接按照第三方插件来获取财经金融数据
- TuShare : tushare.pro/register?re…
- AkShare : akshare.akfamily.xyz/introductio…
- Alpha Vantage : 主要用于欧美等市场
- Quandl / InvestPy / Finviz / Polygon 等
阶段总结 :
一般情况下 ,不推荐使用爬虫,主要在于功能少不方便 ,再一个合法性不可控,延时也高。
通常比较好的选择是 TuShare 和 AkShare ,这两个在国内都有完善的官方网站可以查阅资料。虽然 Tushare 需要 API Token ,但是大多数功能还是免费的。
两个框架后续都会看 ,这一篇先来看看 TuShare 的使用。
二. 场景使用
- S1 : 去官方网站 注册账号并且申请到 API Token
- S2 : 安装 Python Plugin :
pip install tushare
- S3 : 使用 API 获取数据
三. 开放的接口
这里列举一下初始化积分(120 = 注册 + 完善信息
)里面我认为比较好用的接口 :
核心行情数据 :
总的来说主要是通过日线行情就能满足绝大多数的股票分析需求,实时快照可以通过以下接口获取 :
其他的接口大部分是2000积分 ,这些接口暂时是没有太大需求的。
👉👉👉下面主要来看一下日线接口能满足哪些功能:
四. 一个简单的入门 Demo
4.1 调用接口获取日线行情
// 需要的组件 :
pip install tushare pandas matplotlib
// Python 代码
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
# 设置你的 Token (这里方便以后的Demo放在了TXT文件中)
with open('D:\\code\\python\\tushareToken.txt', 'r', encoding='utf-8') as file:
token = file.read().strip()
ts.set_token(token)
pro = ts.pro_api()
# 获取历史交易数据
df = pro.daily(ts_code='600519.SH', start_date='20240810', end_date='20240915')
# 数据处理
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date', inplace=True)
df.sort_index(inplace=True)
# 可视化收盘价
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(12, 6))
plt.plot(df.index, df['close'], label='收盘价', color='blue')
plt.title('贵州茅台(600519)收盘价走势图')
plt.xlabel('日期')
plt.ylabel('收盘价 (元)')
plt.xticks(rotation=45)
plt.legend()
plt.grid()
plt.tight_layout()
plt.show()
- 使用很简单 ,从接口拿到的数据如下 :
ts_code trade_date open high low close pre_close change pct_chg vol amount
0 600519.SH 20240913 1331.00 1332.00 1297.30 1304.13 1335.06 -30.93 -2.3167 56005.11 7329376.917
1 600519.SH 20240912 1380.00 1385.00 1334.91 1335.06 1380.00 -44.94 -3.2565 47948.31 6482445.000
2 600519.SH 20240911 1375.60 1385.88 1365.00 1380.00 1378.00 2.00 0.1451 20995.77 2892932.794
3 600519.SH 20240910 1370.02 1393.00 1370.02 1378.00 1375.00 3.00 0.2182 19802.84 2737295.644
// ...................
21 600519.SH 20240815 1405.03 1435.99 1403.95 1426.89 1413.30 13.59 0.9616 23038.97 3275699.572
22 600519.SH 20240814 1423.01 1424.90 1412.02 1413.30 1423.01 -9.71 -0.6824 13414.31 1898377.426
23 600519.SH 20240813 1433.00 1435.00 1412.01 1423.01 1436.10 -13.09 -0.9115 16308.43 2317037.756
24 600519.SH 20240812 1430.00 1443.00 1426.58 1436.10 1436.80 -0.70 -0.0487 13632.03 1956573.438
其中可以看到以下信息 :
字段 | 含义 | 示例 |
---|---|---|
ts_code | 股票代码 | 600519.SH |
trade_date | 交易日期 | 20220901 |
open | 开盘价 | 1800.00 |
high | 最高价 | 1820.00 |
low | 最低价 | 1790.00 |
close | 收盘价 | 1810.00 |
pre_close | 前收盘价 | 1795.00 |
change | 涨跌额 | 15.00 |
pct_chg | 涨跌幅(百分比) | 0.83% |
vol | 成交量(手) | 123456 |
amount | 成交金额(元) | 220000000 |
4.2 收集信息并且二次处理
- 案例 : 通过 Tushare 获取一个股票10年来的平均值并且查询超过平均值的天数
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
# 设置 TuShare API Token
with open('D:\\code\\python\\tushareToken.txt', 'r', encoding='utf-8') as file:
token = file.read().strip()
ts.set_token(token)
pro = ts.pro_api()
# 获取某个股票过去几年的交易数据
start_date = '20200101'
end_date = pd.Timestamp.now().strftime('%Y%m%d')
# 获取历史交易数据
df = pro.daily(ts_code='002670.SZ', start_date=start_date, end_date=end_date)
# 检查获取数据是否成功
if df.empty:
print("未能获取数据,请检查股票代码和日期范围。")
else:
# 计算收盘价的平均值
avg_close_price = df['close'].mean()
# 查询超过平均值的天数
days_above_avg = df[df['close'] > avg_close_price].shape[0]
# 打印结果
print(f"过去10年该股票的平均收盘价为:{avg_close_price:.2f} 元")
print(f"收盘价超过平均值的天数为:{days_above_avg} 天")
# 可选:打印超出平均值的日期和收盘价
print("\n超过平均值的日期和收盘价:")
print(df[df['close'] > avg_close_price][['trade_date', 'close']])
# 创建可视化图表
plt.figure(figsize=(14, 7))
# 绘制收盘价折线图
plt.plot(df.index, df['close'], label='Close Price', color='blue', linewidth=2)
# 绘制平均值的红色水平线
plt.axhline(y=avg_close_price, color='red', linestyle='--', linewidth=2, label=f'Avg Close Price ({avg_close_price:.2f})')
# 添加标题和标签
plt.title('收盘价及近几年平均值', fontsize=16)
plt.xlabel('日期', fontsize=12)
plt.ylabel('收盘价(元)', fontsize=12)
# 添加图例
plt.legend()
# 显示网格
plt.grid(True)
# 展示图表
plt.show()
这里通过红线来标注近10年的平均价 ,并且标为红线
4.3 其他扩展
除了查询数据并且放在表格里面 ,还可以进行存储 ,包括 SQLite 等框架的帮助 :
df = pro.daily(ts_code='002670.SZ', start_date=start_date, end_date=end_date)
# 检查是否成功获取数据
if df.empty:
print("未能获取数据,请检查股票代码和日期范围。")
else:
# 将 trade_date 转换为 datetime 格式,方便存储和查询
df['trade_date'] = pd.to_datetime(df['trade_date'])
# 连接 SQLite 数据库(如果不存在则会自动创建)
conn = sqlite3.connect('stock_data.db')
# 将数据保存到 SQLite 数据库中的名为 'stock_data' 的表里
# 如果表已经存在,数据将被追加
df.to_sql('stock_data', conn, if_exists='append', index=False)
# 查询保存结果
result_df = pd.read_sql('SELECT * FROM stock_data', conn)
# 打印保存后的数据
print(result_df)
# 关闭数据库连接
conn.close()
总结
我这边主要是针对每日行情进行一个二次分析 ,得到我想要关注的预警 ,所以免费的接口足够使用了。
如果需要更复杂的接口 ,可以通过赞助的方式去获取 ,也不贵。
最后的最后 ❤️❤️❤️👇👇👇
- 👈 欢迎关注 ,超200篇优质文章,未来持续高质量输出 🎉🎉
- 🔥🔥🔥 系列文章集合,高并发,源码应有尽有 👍👍
- 走过路过不要错过 ,知识无价还不收钱 ❗❗