Python爬虫实战:用Tushare和Baostock爬取股票历史数据及K线图与技术指标计算

Python爬虫实战:用Tushare和Baostock爬取股票历史数据及K线图与技术指标计算

在金融数据分析和量化交易中,股票历史数据的获取是进行技术分析、回测和策略研究的第一步。传统上,投资者需要依赖付费数据服务,然而如今,借助Python强大的爬虫工具和开源数据接口,我们能够轻松地爬取免费的历史股票数据,并结合K线图与技术指标来进行深入分析。

Tushare和Baostock是两个非常流行的开源金融数据接口。Tushare提供了丰富的国内外金融数据,特别是A股市场的历史数据和实时数据,而Baostock也提供了高质量的股票历史数据,尤其适合量化研究。

本文将带你一步步实现如何通过Python爬虫,利用Tushare和Baostock爬取股票历史数据,绘制K线图,并计算一些常见的技术指标,如移动平均线(MA)、相对强弱指数(RSI)、MACD等。

一、环境准备与库安装

在开始之前,我们需要安装一些必要的Python库:

pip install tushare baostock pandas matplotlib numpy talib

Tushare:用于获取股票历史数据。Baostock:用于获取股票历史数据的另一种选择。Pandas:数据处理和分析。Matplotlib:用于绘制K线图。NumPy:用于数值计算。TA-Lib:用于计算技术指标(如MACD、RSI、MA等)。

二、使用Tushare获取股票历史数据

Tushare提供了简单易用的API来获取股票的历史数据。首先,我们需要申请Tushare的token并进行初始化。

2.1 获取Tushare的API Token

访问Tushare官网(https://tushare.pro/)并注册账号。申请API token,并将其保存在代码中。

import tushare as ts

# 设置Tushare的API Token

ts.set_token('your_token_here')

pro = ts.pro_api()

2.2 获取股票历史数据

Tushare提供了pro.daily()接口,用于获取单只股票的日K线数据。我们可以通过指定股票代码和日期范围来爬取历史数据。

import tushare as ts

import pandas as pd

# 设置Tushare的API Token

ts.set_token('your_token_here')

pro = ts.pro_api()

# 获取股票历史数据

def get_stock_data(stock_code, start_date, end_date):

df = pro.daily(ts_code=stock_code, start_date=start_date, end_date=end_date)

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

df = df.set_index('trade_date')

return df

# 示例:获取某只股票的历史数据(例如:000001.SZ)

stock_data = get_stock_data('000001.SZ', '20210101', '20211231')

print(stock_data.head())

输出示例:

ts_code open high low close pre_close change pct_chg vol amount

trade_date

2021-01-04 000001.SZ 13.91 14.22 13.91 14.15 13.91 0.24 1.73 214634 30289856

2021-01-05 000001.SZ 14.15 14.21 14.03 14.11 14.15 -0.04 -0.28 126561 17896062

三、使用Baostock获取股票历史数据

Baostock也是一个非常优秀的免费金融数据接口。它提供了丰富的A股数据,并且无需注册即可直接使用。

3.1 安装与初始化

import baostock as bs

import pandas as pd

# 初始化Baostock

bs.login()

3.2 获取股票历史数据

使用bs.query_history_k_data()接口获取历史数据,并转化为DataFrame。

def get_stock_data_baostock(stock_code, start_date, end_date):

rs = bs.query_history_k_data(stock_code,

"date,open,high,low,close,volume",

start_date=start_date, end_date=end_date, frequency="d", adjustflag="3")

data = []

while (rs.error_code == '0') & rs.next():

data.append(rs.get_row_data())

df = pd.DataFrame(data, columns=rs.fields)

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

df = df.set_index('date')

return df

# 示例:获取股票历史数据(例如:sh.600000)

stock_data = get_stock_data_baostock('sh.600000', '2021-01-01', '2021-12-31')

print(stock_data.head())

输出示例:

open high low close volume

date

2021-01-04 11.62 11.85 11.53 11.78 136630

2021-01-05 11.75 11.90 11.67 11.83 161540

四、绘制K线图

K线图是股票技术分析中非常重要的工具,它能够直观地展示股票的价格波动。我们使用Matplotlib库来绘制K线图。

4.1 绘制K线图

import matplotlib.pyplot as plt

import matplotlib.dates as mdates

import matplotlib.ticker as ticker

import matplotlib.finance as mpf

def plot_candlestick(df):

fig, ax = plt.subplots(figsize=(10, 6))

ax.xaxis.set_major_locator(mdates.WeekdayLocator())

ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))

ax.plot(df.index, df['close'], label='Close Price', color='blue', linewidth=0.8)

ax.bar(df.index, df['high'] - df['low'], bottom=df['low'], color='gray', width=0.6)

ax.plot(df.index, df['open'], label='Open Price', color='red', linewidth=0.8)

ax.set_xlabel('Date')

ax.set_ylabel('Price')

ax.legend()

plt.xticks(rotation=45)

plt.title("K-Line Chart")

plt.show()

# 绘制某只股票的K线图

plot_candlestick(stock_data)

五、技术指标计算与应用

技术分析中的常用指标包括 移动平均线(MA)、相对强弱指数(RSI)、MACD 等。我们可以通过TA-Lib库轻松地计算这些指标。

5.1 移动平均线(MA)

移动平均线是最常见的技术分析工具,常用的有5日、10日、30日等。

import talib

# 计算5日、10日、30日移动平均线

def calculate_ma(df):

df['MA5'] = talib.MA(df['close'], timeperiod=5)

df['MA10'] = talib.MA(df['close'], timeperiod=10)

df['MA30'] = talib.MA(df['close'], timeperiod=30)

# 示例:计算移动平均线

calculate_ma(stock_data)

# 绘制移动平均线图

plt.figure(figsize=(10, 6))

plt.plot(stock_data.index, stock_data['close'], label='Close Price')

plt.plot(stock_data.index, stock_data['MA5'], label='MA5')

plt.plot(stock_data.index, stock_data['MA10'], label='MA10')

plt.plot(stock_data.index, stock_data['MA30'], label='MA30')

plt.legend()

plt.title('Stock Close Price with MA')

plt.xlabel('Date')

plt.ylabel('Price')

plt.xticks(rotation=45)

plt.show()

5.2 相对强弱指数(RSI)

相对强弱指数(RSI)是常用的超买超卖指标,值在0到100之间,通常超过70为超买,低于30为超卖。

# 计算RSI

def calculate_rsi(df):

df['RSI'] = talib.RSI(df['close'], timeperiod=14)

# 示例:计算RSI

calculate_rsi(stock_data)

# 绘制RSI图

plt.figure(figsize=(10, 6))

plt.plot(stock_data.index, stock_data['RSI'], label='RSI', color='orange')

plt.axhline(y=70, color='r', linestyle='--')

plt.axhline(y=30, color='g', linestyle='--')

plt.legend()

plt.title('RSI with Overbought and Oversold Zones')

plt.xlabel('Date')

plt.ylabel('RSI')

plt.xticks(rotation=45)

plt.show()

5.3 MACD(平滑异同移动平均线)

MACD是股票市场中广泛使用的技术分析指标,帮助判断股票的买入卖出时机。

# 计算MACD

def calculate_macd(df):

df['MACD'], df['MACD_signal'], df['MACD_hist'] = talib.MACD(df['close'], fastperiod=12, slowperiod=26, signalperiod=9)

# 示例:计算MACD

calculate_macd(stock_data)

# 绘制MACD图

plt.figure(figsize=(10, 6))

plt.plot(stock_data.index, df['MACD'], label='MACD', color='b')

plt.plot(stock_data.index, df['MACD_signal'], label='MACD Signal', color='r')

plt.bar(stock_data.index, df['MACD_hist'], label='MACD Histogram', color='g')

plt.legend()

plt.title('MACD Indicator')

plt.xlabel('Date')

plt.ylabel('MACD')

plt.xticks(rotation=45)

plt.show()

六、总结

本文通过使用Tushare和Baostock两个开源金融数据接口,展示了如何爬取股票历史数据,并结合常用的技术指标,如K线图、移动平均线(MA)、相对强弱指数(RSI)和MACD进行分析。你可以根据实际需求,结合更多的数据源和技术指标,构建自己的股票分析工具。

掌握这些爬虫与数据分析技巧,将使你能够更好地进行股票市场的分析与决策,进而帮助你在投资和量化交易中获得优势。

相关推荐