使用pandas和matplotlib分析各类股票数据

本篇内容:网络数据采集美交所、沪深交所的多种不同题材股票交易信息,使用python的pandas和matplotlib分析趋势、相关性、可视化等。


以下均在ipython notebook中进行分析。 从Yahoo! Finance下载美交所特斯拉、58同城、网易、百度以及亚马逊的股票数据; 下载豫能控股、申能股份、东材科技、盾安环境以及博威合金等沪深交所新能源类股票; 下载中国太保、中国人寿、天茂集团、中国平安以及新华保险等沪深交所保险类股票; 下载游族网络、浪潮软件、皖通科技、北纬科技以及浙大网新等沪深交所互联网类股票。

import pandas as pd
from pandas import DataFrame
import numpy as np
from pandas_datareader import data
import pandas_datareader as pdr

%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib as mpl

mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]
mpl.rcParams[‘font.serif’] = [‘SimHei’]
import seaborn as sns
sns.set_style(“darkgrid”,{“font.sans-serif”:[‘simhei’, ‘Arial’]})

stocks = [‘TSLA’, ‘WUBA’, ‘NTES’, ‘BIDU’, ‘AMZN’,
‘001896.SZ’, ‘600642.SS’, ‘601208.SS’, ‘002011.SZ’, ‘601137.SS’,
‘601601.SS’, ‘601628.SS’, ‘000627.SZ’, ‘601318.SS’, ‘601336.SS’,
‘002174.SZ’, ‘600756.SS’, ‘002331.SZ’, ‘002148.SZ’, ‘600797.SS’,]
names = [ ‘特斯拉’, ‘58同城’, ‘网易’, ‘百度’, ‘亚马逊’,
‘豫能控股’, ‘申能股份’, ‘东材科技’, ‘盾安环境’, ‘博威合金’,
‘中国太保’, ‘中国人寿’, ‘天茂集团’, ‘中国平安’, ‘新华保险’,
‘游族网络’, ‘浪潮软件’, ‘皖通科技’, ‘北纬科技’, ‘浙大网新’]
for i in range(len(stocks)):
name = pdr.get_data_yahoo(stocks[i])
path = ‘data/‘ + names[i] + ‘.csv’
out_file = open(path, ‘w’)
name.to_csv(out_file)
out_file.close()

下面是对股票数据进行整理,并且绘制图表的过程: 对原始数据按各项指标(开盘价、收盘价、最高价以及最低价等)进行分类,并且有必要对数据进行归一化处理,消除价格因素对股票趋势判断的影响;并对股票进行趋势分析、相关性分析等。

要点说明

  • 在选取股票时,为了方便分析,尽量选取记录超过1000个交易日的股票,并且取今天以前1000个交易日的数据进行分析
  • 在对多支股票的趋势进行分析时,股票价格会影响趋势的判断,需要对股价进行归一化处理。
    • 常见的归一化方法(链接):
      • min-max标准化
      • Z-score标准化方法
    • 这里采用min-max标准化方法
  • 采用pearson相关系数进行相关性分析

股价总览

data_set = {}
data_set[‘美股科技类’] = [ names[i] for i in range(0, 5)]
data_set[‘新能源类’] = [ names[i] for i in range(5, 10)]
data_set[‘保险类’] = [ names[i] for i in range(10, 15)]
data_set[‘互联网类’] = [ names[i] for i in range(15, 20)]

data_all = {}
for i in names:
file_name = ‘data/‘ + i + ‘.csv’
f = open(file_name)
data = pd.read_csv(f)
data = data.head(1000)
# print(i, data[‘close’].median())
data_all[i] = data[‘adjclose’]
data_all[‘date’] = data[‘date’]
data_all = DataFrame(data_all)
data_all.set_index([‘date’], inplace=True)
data_all.index = pd.to_datetime(data_all.index)

data_all.plot(kind=’line’, figsize=(12,8),
title=’所有股票原始数据(1000个交易日)’)
plt.legend(bbox_to_anchor=(1.0, 1))

# data_all.corr()

df = data_all
for i in data_all.columns:
df[i] = df[i].rolling(window=42, center=False).mean()

df.plot(kind=’line’, figsize=(12,8),
title=’所有股票移动平均值42d(1000个交易日)’)
plt.legend(bbox_to_anchor=(1.0, 1))

# data_all.corr()

此图表显示了所有股票在过去1000个交易日内的收盘价格 此图表显示了所有股票在过去1000个交易日中42d移动平均值 由此可见,除个别股票趋势明显外,大多数股票趋势难以判断,需要分类别进行后续分析。

美股科技类

data_all_1 = {}
for i in data_set[‘美股科技类’]:
file_name = ‘data/‘ + i + ‘.csv’
f = open(file_name)
data = pd.read_csv(f)
data = data.head(1000)
data_all_1[i] = data[‘adjclose’]
# data_all_1[i] = (data[‘adjclose’] - data[‘adjclose’].min())/(data[‘adjclose’].max() - data[‘adjclose’].min())
data_all_1[‘date’] = data[‘date’]
data_all_1 = DataFrame(data_all_1)
data_all_1.set_index([‘date’], inplace=True)
data_all_1.index = pd.to_datetime(data_all_1.index)
data_all_1.plot(kind=’line’, figsize=(10,6), title=’美股科技类股票原始数据(1000个交易日)’)
# plt.legend(bbox_to_anchor=(1.0, 1))

df = data_all_1
for i in data_all_1.columns:
df[i] = df[i].rolling(window=42, center=False).mean()

df.plot(kind=’line’, figsize=(10,6),
title=’美股科技类移动平均值42d(1000个交易日)’)
# plt.legend(bbox_to_anchor=(1.0, 1))

data_all_1 = {}
for i in data_set[‘美股科技类’]:
file_name = ‘data/‘ + i + ‘.csv’
f = open(file_name)
data = pd.read_csv(f)
data = data.head(1000)
data_all_1[i] = data[‘adjclose’]
data_all_1[i] = (data[‘adjclose’] - data[‘adjclose’].min())/(data[‘adjclose’].max() - data[‘adjclose’].min())
data_all_1[‘date’] = data[‘date’]
data_all_1 = DataFrame(data_all_1)
data_all_1.set_index([‘date’], inplace=True)
data_all_1.index = pd.to_datetime(data_all_1.index)
data_all_1.plot(kind=’line’, figsize=(10,6), title=’美股科技类股票数据(1000个交易日)’)
# plt.legend(bbox_to_anchor=(1.0, 1))

df = data_all_1
for i in data_all_1.columns:
df[i] = df[i].rolling(window=42, center=False).mean()

df.plot(kind=’line’, figsize=(10,6),
title=’经归一化处理的美股科技类移动平均值42d(1000个交易日)’)
# plt.legend(bbox_to_anchor=(1.0, 1))

data_all_1.corr()

此图表显示了科技类美股在过去1000个交易日内的收盘价格 此图显示了科技类美股在过去1000个交易日内42d移动平均值 通过该图表可以看到,亚马逊股票在此期间上升趋势明显,并且价格明显高于其他股票。 为了消除价格因素对股票趋势分析的影响,需要对股票数据采用归一化处理。 此图表显示了经归一化处理后的科技类美股1000个交易日内42d移动平均值 通过此图表可以看出亚马逊和网易股价呈明显上升趋势;特斯拉股价在2016年末以前在特定区间内呈震荡走势,过后呈明显上升趋势;58同城和百度股价处于波动状态。 此表显示了科技类美股Pearson相关系数矩阵 从表中可以看出亚马逊和网易股价相关系数为0.95,相关性很强;其次特斯拉与网易之间、特斯拉与亚马逊之间相关系数皆约为0.7,相关性较强;并且所有股票价格均呈正相关。

沪深交所新能源类

代码略。 此图表显示了科技类美股在过去1000个交易日内的收盘价格 可以看出,所选新能源类股票走势基本相同,可以通过42d移动平均值来进一步验证结论。 此图显示了沪深交所新能源类股票在过去1000个交易日内42d移动平均值 通过该图表可以看到,所有新能源类股票在2015年有较大幅度的上涨,并且在下半年股价有所回调;2016年至今,所有新能源类股票都呈震荡趋势。 为了消除价格因素对股票趋势分析的影响,下面对股票数据采用归一化处理。 此图表显示了经归一化处理后的沪深交所新能源类股票1000个交易日内42d移动平均值 通过此图表可以看出所有股票在2015年四月之前呈上涨趋势,并且在2015年下半年有较大幅度的回调;其中博威合金在回调后走出了第二轮上涨趋势,其余股票在波动后都有所回落。 此表显示了沪深交所新能源类股票Pearson相关系数矩阵 从表中可以看出东财科技与除博威合金之外的其他所有股票相关性都比较强,豫能控股、申能股份、盾安环境也是如此;博威合金与其他所有股票相关性都比较弱。

沪深交所保险类

代码略。 此图表显示了沪深交所保险类股票在过去1000个交易日内的收盘价格 由图可见,各个股票走势大致相同,可以通过下面的42d移动平均值进行验证。 此图显示了沪深交所保险类股票在过去1000个交易日内42d移动平均值 通过该图表可以看到,所有股票在2015年和2018年都有个阶段性上涨阶段,随后回落;总体趋势是类似的,股价在震荡上涨。 为了消除价格因素对股票趋势分析的影响,需要对股票数据采用归一化处理。 此图表显示了经归一化处理后的沪深交所保险类股票1000个交易日内42d移动平均值 通过此图表可以看出所有股票在2015年与2018年出现了大幅上涨的趋势,并且在过后都有所回落,与之前讨论结果相同。 此表显示了科技类美股Pearson相关系数矩阵 从表中可以看出大部分保险类股票之间是强相关的;相关性最弱的天茂集团与中国平安之间的相关系数也为0.53,说明该行业之间股票的走势是联动的,相关性很强。

沪深交所互联网类

代码略。 此图显示了沪深交所互联网类股票在过去1000个交易日内的收盘价格 此图显示了沪深交所互联网类股票在过去1000个交易日内42d移动平均值 通过该图表可以看到,皖通科技、浪潮软件和游族网络股价波动较大;北纬科技和浙大网新股价波动相对较小;总体呈区间内震荡趋势。 为了消除价格因素对股票趋势分析的影响,需要对股票数据采用归一化处理。 此图表显示了经归一化处理后的沪深交所互联网类股票1000个交易日内42d移动平均值 通过此图表可以看出所有股票皆为波动趋势;2015年上半年除浪潮软件外所有股票大幅上涨,随后回落,浪潮软件上涨较为滞后。 此表显示了科技类美股Pearson相关系数矩阵 从表中可以看出游族网络、浙大网新以及皖通科技三者之间相关性较强;其他股票相关性较弱,且北纬科技与浪潮软件之间呈现较弱的负相关状态。

  • 沪深交所绝大部分股票在2015年出现了大幅度的上涨趋势,随后有较大的回落。美交所股票并无明显的此种现象。
  • 沪深交所同题材下的股票价格走势有比较强的相关性。由此猜测,国内一些政策性的利好、利空消息会对股票价格产生较大的影响。