Python : 用 TuShare 构建你自己的量化引擎

1,645 阅读5分钟

一. 前言

一直在考虑用 Python 做一个预警的工具 ,其中就涉及到金融数据获取这个核心的环节。大多数情况下有两种方案 :

阶段总结 :

一般情况下 ,不推荐使用爬虫,主要在于功能少不方便 ,再一个合法性不可控,延时也高。

通常比较好的选择是 TuShare 和 AkShare ,这两个在国内都有完善的官方网站可以查阅资料。虽然 Tushare 需要 API Token ,但是大多数功能还是免费的。

两个框架后续都会看 ,这一篇先来看看 TuShare 的使用。

二. 场景使用

  • S1 : 去官方网站 注册账号并且申请到 API Token
  • S2 : 安装 Python Plugin : pip install tushare
  • S3 : 使用 API 获取数据

image.png

三. 开放的接口

这里列举一下初始化积分(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()


image.png

  • 使用很简单 ,从接口拿到的数据如下 :
  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()

image.png

这里通过红线来标注近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()

image.png

总结

我这边主要是针对每日行情进行一个二次分析 ,得到我想要关注的预警 ,所以免费的接口足够使用了。

如果需要更复杂的接口 ,可以通过赞助的方式去获取 ,也不贵。

最后的最后 ❤️❤️❤️👇👇👇