在金融数据分析和量化交易中,股票历史数据的获取是进行技术分析、回测和策略研究的第一步。传统上,投资者需要依赖付费数据服务,然而如今,借助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进行分析。你可以根据实际需求,结合更多的数据源和技术指标,构建自己的股票分析工具。
掌握这些爬虫与数据分析技巧,将使你能够更好地进行股票市场的分析与决策,进而帮助你在投资和量化交易中获得优势。