企业微信

快速上手tushare获取股票价格

要使用tushare,首先需要安装并注册获取token。安装命令如下:


pip install tushare

注册后,在代码中初始化接口:

如何利用tushare获取股票价格数据并进行量化分析


import tushare as ts

pro = ts.pro_api('你的token')

获取股票日线价格的基本接口是pro.daily,参数包括股票代码、起始日期和结束日期。返回的DataFrame包含开高低收、成交量等核心字段。直接调用即可获得历史价格。

获取单只股票价格


df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231')

print(df.head())

返回的数据按日期降序排列,处理时注意排序。

批量获取股票列表价格

获取多只股票的价格,可以循环调用,但效率低。更高效的方法是利用pro.stock_basic获取股票列表,然后分批请求。结合pandasconcat合并数据。


# 获取股票列表

stocks = pro.stock_basic(exchange='', list_status='L', fields='ts_code')

# 循环获取每只股票的价格(示例仅前5只)

all_data = []

for code in stocks['ts_code'].head(5):

    df = pro.daily(ts_code=code, start_date='20230101', end_date='20231231')

    df['ts_code'] = code

    all_data.append(df)

import pandas as pd

result = pd.concat(all_data, ignore_index=True)

这种方法在股票数量多时,要控制请求频率以避免被限流。

tushare价格数据的深度处理

获取原始价格后,通常需要清洗和计算指标,用于策略开发。

数据清洗与标准化

价格数据中可能包含停牌导致的缺失值,处理方式包括向前填充或删除。同时要将日期列设为索引,并确保数据类型正确。


df['trade_date'] = pd.to_datetime(df['trade_date'])

df.set_index('trade_date', inplace=True)

df.sort_index(inplace=True)

# 处理缺失值

df = df.fillna(method='ffill')

计算技术指标

基于价格数据计算移动平均线、相对强弱指数等。这些指标是策略的输入。


# 计算简单移动平均线(MA20)

df['ma20'] = df['close'].rolling(window=20).mean()

# 计算相对强弱指数(RSI14)

delta = df['close'].diff()

up = delta.clip(lower=0)

down = -delta.clip(upper=0)

ema_up = up.ewm(com=13, adjust=False).mean()

ema_down = down.ewm(com=13, adjust=False).mean()

df['rsi14'] = 100 - 100 / (1 + ema_up / ema_down)

这些指标可以用于生成交易信号。

基于价格数据的量化策略示例

以双均线策略为例,说明如何利用tushare数据构建完整策略。

策略逻辑

短期均线上穿长期均线时买入,下穿时卖出。

实现步骤

  1. 获取价格数据,计算MA5和MA20。

  2. 生成信号:当MA5上穿MA20时,信号为1;下穿为-1。

  3. 根据信号持仓,计算策略收益。


# 获取贵州茅台价格

df = pro.daily(ts_code='600519.SH', start_date='20200101', end_date='20231231')

df = df.sort_values('trade_date')

df['ma5'] = df['close'].rolling(5).mean()

df['ma20'] = df['close'].rolling(20).mean()

# 生成信号

df['signal'] = 0

signal = np.where(df['ma5'] > df['ma20'], 1, 0)

df['signal'] = np.where(signal.diff() != 0, signal, 0)

# 持仓

df['position'] = df['signal'].replace(to_replace=0, method='ffill')

# 计算收益

df['market_return'] = df['close'].pct_change()

df['strategy_return'] = df['position'].shift(1) * df['market_return']

# 回测

df['cumulative_return'] = (1 + df['strategy_return']).cumprod()

print(df[['trade_date', 'close', 'signal', 'position', 'strategy_return', 'cumulative_return']].tail())

这个简单的回测框架可以评估策略表现。

策略优化与注意点

实际应用中,要考虑交易成本、滑点以及信号延迟。调整均线参数可以优化策略,但需防止过拟合。

tushare价格数据的进阶应用

除了日线数据,tushare还提供分钟线、复权因子等,对高频策略和长期分析很有价值。

复权价格处理

分析长期收益时,使用复权价格消除分红送股影响。tushare中的pro.adj_factor接口可以获取复权因子,然后计算后复权价格。


# 获取复权因子

adj = pro.adj_factor(ts_code='000001.SZ')

# 合并到价格数据

df = df.merge(adj, on='trade_date')

df['adj_close'] = df['close'] * df['adj_factor']  # 后复权价格

实时行情获取

tushare提供ts.realtime_quote获取实时价格,但权限和频率有限,适合低频监控。

期货价格数据

tushare同样支持期货数据,接口为pro.fut_daily,字段类似。获取交易所、合约代码等参数,可用于期货量化


# 获取螺纹钢期货主力连续合约

fut_df = pro.fut_daily(ts_code='RB.SHF', start_date='20230101', end_date='20231231')

风险管理与数据质量

利用价格数据进行量化时,风险管理不可忽视。tushare数据准确性高,但网络波动可能导致请求失败,需编写重试机制。异常值如涨停跌停价格可能影响指标计算,需及时处理。


def fetch_with_retry(func, **kwargs):

    for i in range(3):

        try:

            return func(**kwargs)

        except Exception as e:

            time.sleep(2)

    raise e

tushare价格获取的核心在于掌握接口参数和数据处理能力。建议初学者从日线数据入手,熟悉pandas操作,逐步扩展到多品种、多周期。定期检查数据接口的更新,确保数据连续性。量化成功的关键在于数据的准确性和策略的稳健性。利用tushare,可以低成本获取高质量数据,从而在股票和期货市场中提升竞争力。