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

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

TushareBaostock是两个非常流行的开源金融数据接口。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()

六、总结

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

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

你可能感兴趣的:(Python爬虫实战:用Tushare和Baostock爬取股票历史数据及K线图与技术指标计算)