一、选题的背景
股票市场一直是金融领域的焦点之一,对股票数据进行大数据分析有助于了解市场趋势、预测价格波动、优化投资策略等。随着大数据技术的快速发展和 应用,越来越多的投资者、交易员和分析师开始利用大数据技术来解读和分析股票市场数据。通过对股票数据的大数据分析可以提供有关市场走势、投资机会和风险的深入洞察,帮助投资者和交易员做出明智的决策,并提高投资和交易的效果。结合Python强大的数据分析和可视化工具,可以提供全面、准确的市场洞察和投资决策支持,为投资者和交易员带来更好的交易体验和投资回报。
二、大数据分析设计方案
下载老师提供的数据集,导入并理解数据集,观察数据集属性,经过数据清洗得到全新的数据集用于数据分析与可视化,用数据可视化分析股票股价趋势,股价的分布和股票之间的联系与对比。
三、数据分析步骤
1.导入库
import pandas as pd
import matplotlib.pylab as plt
2.导入数据集并显示数据
1 #读取数据
2 import pandas as pd
3 data = pd.read_csv('D:\python\股票数据集.csv')
4 #显示数据
5 data
3.数据处理:查看是否含有缺失值,如果有删除缺失值并检查是否删除
1 #查看缺失值
2 data.isnull().sum()
其中open,high,low列含有空值
1 #删除缺失值
2 data.dropna(inplace=True)
3 #查看是否删除
4 data.isnull().sum()
可以看出空值已删除
4.查看数据类型
1 #查看数据基本信息和数据类型。
2 data.info()
data为日期
Open为开盘价,
High为当天最高价,
Low为最低价,
Close为当天收盘价,
Volume指当天总共的股票交易数。
5.重命名列并基于日期列创建两个新列“mouth”和“day”便于可视化
1 import pandas as pd
2 data = pd.read_csv('D:\python\股票数据集.csv')
3
4 # 重命名列
5 data.columns = ['date', 'open', 'high', 'low',
6 'close', 'volume', 'stock_name']
7
8 data['date']=pd.to_datetime(data['date'])
9 data = data.assign(month=data['date'].dt.month)
10 data = data.assign(day=data['date'].dt.day)
11 data
6.单只股票价格折线图:股价在时间轴上的对比(以2017年为例)
1 # 设置坐标周和图表大小。
2 fig, ax = plt.subplots(figsize = (8,6))
3
4 # 股票名称列表
5 lst_stocks = ['AAL']
6
7 for s in lst_stocks:
8 # 绘制每个股票收盘价格折线图
9 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
10 .loc[:, ['date', 'close']] \
11 .set_index('date') \
12 .plot(kind = 'line',
13 ax = ax)
14 # 更新图示为对应股票名
15 ax.legend(lst_stocks, loc = 5)
16 plt.title('2017年股票收盘价趋势图')
17 plt.yticks(fontsize=14)
18 plt.ylim(0,100)
19 plt.show()
从图中得到信息:AAL股价在2017年趋势较为平稳,上下波动幅度不大
7.多只股票价格折线图:多只股票股价在时间轴上的对比
查看股票数据集中含有的数据种类
1 import pandas as pd
2 # 读取数据集
3 data = pd.read_csv('D:\python\股票数据集.csv')
4 # 统计某列不同数据的名称并输出
5 names = data['Name'].unique()
6 print(names)
选取部分股票进行对比
1 # 设置坐标周和图表大小。
2 fig, ax = plt.subplots(figsize = (8,6))
3 #股票名称列表
4 lst_stocks = ['AAL','ABBV','ZION','ZTS','AAPL','AAP']
5 for s in lst_stocks:
6 # 绘制每个股票收盘价格折线图
7 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
8 .loc[:, ['date', 'close']] \
9 .set_index('date') \
10 .plot(kind = 'line',
11 ax = ax)
12 # 更新图示为对应股票名
13 ax.legend(lst_stocks, loc = 5)
14 plt.title('2017年股票收盘价趋势图')
15 plt.yticks(fontsize=14)
16 plt.ylim(0,200)
17 plt.show()
多个股票价格趋势图画在同一张图上,我们的关注点是不同股票之间的对比。从上图我们可以得到一些简单的结论:AAP与AAPL股价波动较为明显,AAP呈现下降趋势,AAPL呈现上升趋势。其它股票相对于AAP,AAPL较低,趋势比较平稳。
8.股价均线图:一只股票这一年的股价趋势和它的均线。(以AAPL为例)
利用pandas生成30, 60, 90天的移动平均值。再在收盘价趋势图上画出这3条移动平均线。
1 # 计算移动平均值。
2 df_abbv = data[data['stock_name'] == 'AAPL'].copy()
3 df_abbv['thirty_ma'] = df_abbv.close.rolling(window = 30).mean()
4 df_abbv['sisty_ma'] = df_abbv.close.rolling(window = 60).mean()
5 df_abbv['ninety_ma'] = df_abbv.close.rolling(window = 90).mean()
6
7 # 生成坐标轴并定义图表大小。
8 fig, ax = plt.subplots(figsize = (8,6))
9
10 # 使用循环生成4条折线
11 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']
12 for c in lst_col:
13 df_abbv[df_abbv['date'].dt.year == 2017] \
14 .loc[:, ['date', c]] \
15 .set_index('date') \
16 .plot(kind = 'line',
17 ax = ax,
18 title = '2017 AAPL股价趋势图')
19
20 # 更新标签
21 lst_led = ['日收盘价', '30日线', '60日线', '90日线']
22 ax.legend(lst_led)
23 plt.show()
从上图就可以非常直观看到多条均线的走势。AAPL在6月前都在上升通道中,股价稳定上涨。但是在7月到11月之间从3条均线都可以看到有下降趋势。
9.不同股票收盘价箱线图:多只股票价格分布,对比波动性。
由于不同股票的价格区间不同,想要比较他们的价格波动性,折线图显然不是最好的选择。而使用箱线图就能很好地展现数据的分布情况。
1 data = data.loc[data['stock_name'].isin(['AAL', 'ABBV','ZION','ZTS','AAPL','AAP'])]
2 # 使用boxplot画出箱线图
3 data \
4 .loc[:, ['stock_name','close']] \
5 .boxplot(by = 'stock_name',
6 figsize = (8,6)) \
7 .set(xlabel=None)
8 plt.suptitle('')
9 plt.title('2017年收盘价箱图')
10 plt.show()
从箱线图中可以看到:AAP和AAPL股价波动最为明显,AAL和ZION的股价相对稳定。
10.AAP月箱线图:一只股票股价趋势,同时对比段时间股价波动性。
只用pandas和matplotlib不能画出专业的k线图,所以我们用箱线图仿月k线图来展示股价趋势和成交价格最大值和最小值。这里除了趋势之外,我们还能看到一段时间内数据的分布,使用箱线图就可以很好地展示这些数据特征。
1 # 使用boxplot可以画出简单k线图
2 df_amzn = data[data['stock_name'] == 'AAP'].copy()
3 df_amzn \
4 .loc[:, ['month','close']] \
5 .boxplot(by = 'month',
6 figsize = (8,6)) \
7 .set(xlabel=None)
8 plt.suptitle('')
9 plt.title('AAP2017年月k图')
10 plt.show()
11.AAP月平均成交量柱状图:单只股票对比其不同月份的月均交易量。
1 # 使用boxplot可以画出简单k线图
2 df_amzn \
3 .groupby('month')['volume'] \
4 .mean() \
5 .plot(kind = 'bar')
6 plt.title('AAP2017年月均交易量图')
7 plt.show()
箱图和柱状图在同一画布:使得报告更紧凑,或者方便从不同维度解释数据
1 # 设置画布
2 fig, ax = plt.subplots(1,2, figsize = (9,4))
3
4 df_amzn \
5 .loc[:, ['month','close']] \
6 .boxplot(by = 'month',
7 figsize = (8,6),
8 ax = ax[0]) \
9 .set(xlabel=None, title = 'AAP2017年月k图')
10 plt.suptitle('')
11 df_amzn \
12 .groupby('month')['volume'] \
13 .mean() \
14 .plot(kind = 'bar',
15 ax = ax[1],
16 title = 'AAP2017年月均交易量图')
17 plt.show()
12.AAP收盘价与成交量散点图:单只股票收盘价和成交量的关系。
1 # 散点图
2 df_amzn \
3 .loc[:, ['close', 'volume']] \
4 .plot(x = 'close', y = 'volume',
5 kind = 'scatter',
6 figsize = (8,6),
7 color = 'green',
8 title = 'AAP收盘价与成交量散点图')
9 plt.show()
10 print('AAP收盘价与成交量相关矩阵')
11 df_amzn.loc[:, ['close', 'volume']].corr()
从相关矩阵上看,收盘价与成交量相关性为0.06,两个变量之间存在一定的线性关系,但这种关系比较弱。
从散点图上看,成交量在不同价格区间内较为集中。
附完整程序源代码
1 import pandas as pd
2 import matplotlib.pylab as plt
3 #读取数据
4 import pandas as pd
5 data = pd.read_csv('D:\python\股票数据集.csv')
6 #显示数据
7 data
8 #查看缺失值
9 data.isnull().sum()
10 #删除缺失值
11 data.dropna(inplace=True)
12 #查看是否删除
13 data.isnull().sum()
14
15 import pandas as pd
16 data = pd.read_csv('D:\python\股票数据集.csv')
17
18 # 重命名列
19 data.columns = ['date', 'open', 'high', 'low',
20 'close', 'volume', 'stock_name']
21
22 data['date']=pd.to_datetime(data['date'])
23 data = data.assign(month=data['date'].dt.month)
24 data = data.assign(day=data['date'].dt.day)
25 data
26
27 import matplotlib.pylab as plt
28 # 设置坐标周和图表大小。
29 fig, ax = plt.subplots(figsize = (8,6))
30
31 # 将以下列表替换为您想要绘制的股票名称列表
32 lst_stocks = ['AAL']
33
34 for s in lst_stocks:
35 # 绘制每个股票收盘价格折线图
36 data[data['stock_name'] == s] \
37 .loc[:, ['date', 'close']] \
38 .set_index('date') \
39 .plot(kind = 'line',
40 ax = ax)
41 # 更新图示为对应股票名
42 ax.legend(lst_stocks, loc = 5)
43 plt.title('股票收盘价趋势图')
44 plt.yticks(fontsize=20)
45 plt.show()
46
47 import matplotlib.pyplot as plt
48 import pandas as pd
49
50 # 读取股票数据
51 data = pd.read_csv('D:\python\股票数据集.csv')
52
53 # 选择某一只股票的数据
54 #data = data[data['stock_name'] == 'ZTS']
55
56 # 绘制折线图
57 plt.plot(data['date'], data['close'])
58
59 # 选择2018年的数据
60 data = data[(data['date'] >= '2018-01-01') & (data['date'] <= '2018-12-31')]
61
62
63 # 设置标题和轴标签
64 plt.title('Stock Price')
65 plt.xlabel('Date')
66 plt.ylabel('close')
67
68 # 显示图表
69 plt.show()
70
71 # 设置坐标周和图表大小。
72 fig, ax = plt.subplots(figsize = (8,6))
73
74 # 股票名称列表
75 lst_stocks = ['AAL']
76
77 for s in lst_stocks:
78 # 绘制每个股票收盘价格折线图
79 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
80 .loc[:, ['date', 'close']] \
81 .set_index('date') \
82 .plot(kind = 'line',
83 ax = ax)
84 # 更新图示为对应股票名
85 ax.legend(lst_stocks, loc = 5)
86 plt.title('2017年股票收盘价趋势图')
87 plt.yticks(fontsize=14)
88 plt.ylim(0,100)
89 plt.show()
90
91 import matplotlib.pyplot as plt
92 import pandas as pd
93
94 # 读取股票数据
95 data = pd.read_csv('D:\python\股票数据集.csv')
96
97 # 合并多个数据到一个数据集中
98 data = data[['date', 'close']]
99 data = data.groupby('date').sum()
100
101 # 绘制折线图
102 plt.plot(data.index, data['close'])
103
104 # 设置标题和轴标签
105 plt.title('Stock Price')
106 plt.xlabel('Date')
107 plt.ylabel('Close')
108
109 # 显示图表
110 plt.show()
111
112 import pandas as pd
113 # 读取数据集
114 data = pd.read_csv('D:\python\股票数据集.csv')
115 # 统计某列不同数据的名称并输出
116 names = data['Name'].unique()
117 print(names)
118
119
120 # 设置坐标周和图表大小。
121 fig, ax = plt.subplots(figsize = (8,6))
122 # 将以下列表替换为您想要绘制的股票名称列表
123 lst_stocks = ['AAL','ABBV','ZION','ZTS','AAPL','AAP']
124 for s in lst_stocks:
125 # 绘制每个股票收盘价格折线图
126 data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
127 .loc[:, ['date', 'close']] \
128 .set_index('date') \
129 .plot(kind = 'line',
130 ax = ax)
131 # 更新图示为对应股票名
132 ax.legend(lst_stocks, loc = 5)
133 plt.title('2017年股票收盘价趋势图')
134 plt.yticks(fontsize=14)
135 plt.ylim(0,200)
136 plt.show()
137
138 # 计算移动平均值。
139 df_amzn = data[data['stock_name'] == 'AAP'].copy()
140 df_amzn['thirty_ma'] = df_amzn.close.rolling(window = 30).mean()
141 df_amzn['sisty_ma'] = df_amzn.close.rolling(window = 60).mean()
142 df_amzn['ninety_ma'] = df_amzn.close.rolling(window = 90).mean()
143
144 # 生成坐标轴并定义图表大小。
145 fig, ax = plt.subplots(figsize = (8,6))
146 # 使用循环生成4条折线
147 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']
148 for c in lst_col:
149 df_amzn[df_amzn['date'].dt.year == 2017] \
150 .loc[:, ['date', c]] \
151 .set_index('date') \
152 .plot(kind = 'line',
153 ax = ax,
154 title = '2017 AAP股价趋势图')
155 # 更新标签
156 lst_led = ['日收盘价', '30日线', '60日线', '90日线']
157 ax.legend(lst_led)
158 plt.show()
159
160 # 计算移动平均值。
161 df_abbv = data[data['stock_name'] == 'AAPL'].copy()
162 df_abbv['thirty_ma'] = df_abbv.close.rolling(window = 30).mean()
163 df_abbv['sisty_ma'] = df_abbv.close.rolling(window = 60).mean()
164 df_abbv['ninety_ma'] = df_abbv.close.rolling(window = 90).mean()
165
166 # 生成坐标轴并定义图表大小。
167 fig, ax = plt.subplots(figsize = (8,6))
168
169 # 使用循环生成4条折线
170 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']
171 for c in lst_col:
172 df_abbv[df_abbv['date'].dt.year == 2017] \
173 .loc[:, ['date', c]] \
174 .set_index('date') \
175 .plot(kind = 'line',
176 ax = ax,
177 title = '2017 AAPL股价趋势图')
178
179 # 更新标签
180 lst_led = ['日收盘价', '30日线', '60日线', '90日线']
181 ax.legend(lst_led)
182 plt.show()
183
184 data = data.loc[data['stock_name'].isin(['AAL', 'ABBV','ZION','ZTS','AAPL','AAP'])]
185 # 使用boxplot画出箱线图
186 data \
187 .loc[:, ['stock_name','close']] \
188 .boxplot(by = 'stock_name',
189 figsize = (8,6)) \
190 .set(xlabel=None)
191 plt.suptitle('')
192 plt.title('2017年收盘价箱图')
193 plt.show()
194
195 # 使用boxplot可以画出简单k线图
196 df_amzn = data[data['stock_name'] == 'AAP'].copy()
197 df_amzn \
198 .loc[:, ['month','close']] \
199 .boxplot(by = 'month',
200 figsize = (8,6)) \
201 .set(xlabel=None)
202 plt.suptitle('')
203 plt.title('AAP2017年月k图')
204 plt.show()
205
206 # 使用boxplot可以画出简单k线图
207 df_AAPL = data[data['stock_name'] == 'AAPL'].copy()
208 df_AAPL \
209 .loc[:, ['month','close']] \
210 .boxplot(by = 'month',
211 figsize = (8,6)) \
212 .set(xlabel=None)
213 plt.suptitle('')
214 plt.title('AAPL2017年月k图')
215 plt.show()
216
217 # 使用boxplot可以画出简单k线图
218 df_amzn \
219 .groupby('month')['volume'] \
220 .mean() \
221 .plot(kind = 'bar')
222 plt.title('AAP2017年月均交易量图')
223 plt.show()
224
225 # 使用boxplot可以画出简单k线图
226 df_AAPL \
227 .groupby('month')['volume'] \
228 .mean() \
229 .plot(kind = 'bar')
230 plt.title('AAPL2017年月均交易量图')
231 plt.show()
232
233 # 设置画布
234 fig, ax = plt.subplots(1,2, figsize = (9,4))
235
236 df_amzn \
237 .loc[:, ['month','close']] \
238 .boxplot(by = 'month',
239 figsize = (8,6),
240 ax = ax[0]) \
241 .set(xlabel=None, title = 'AAP2017年月k图')
242 plt.suptitle('')
243 df_amzn \
244 .groupby('month')['volume'] \
245 .mean() \
246 .plot(kind = 'bar',
247 ax = ax[1],
248 title = 'AAP2017年月均交易量图')
249 plt.show()
250
251
252 # 设置画布
253 fig, ax = plt.subplots(1,2, figsize = (9,4))
254
255 df_AAPL \
256 .loc[:, ['month','close']] \
257 .boxplot(by = 'month',
258 figsize = (8,6),
259 ax = ax[0]) \
260 .set(xlabel=None, title = 'AAPL2017年月k图')
261 plt.suptitle('')
262 df_AAPL \
263 .groupby('month')['volume'] \
264 .mean() \
265 .plot(kind = 'bar',
266 ax = ax[1],
267 title = 'AAPL2017年月均交易量图')
268 plt.show()
269
270 # 散点图
271 df_amzn \
272 .loc[:, ['close', 'volume']] \
273 .plot(x = 'close', y = 'volume',
274 kind = 'scatter',
275 figsize = (8,6),
276 color = 'green',
277 title = 'AAP收盘价与成交量散点图')
278 plt.show()
279 print('AAP收盘价与成交量相关矩阵')
280 df_amzn.loc[:, ['close', 'volume']].corr()
281
282 # 散点图
283 df_AAPL \
284 .loc[:, ['close', 'volume']] \
285 .plot(x = 'close', y = 'volume',
286 kind = 'scatter',
287 figsize = (8,6),
288 color = 'green',
289 title = 'AAPL收盘价与成交量散点图')
290 plt.show()
291 print('AAPL收盘价与成交量相关矩阵')
292 df_amzn.loc[:, ['close', 'volume']].corr()
总结至此,我们学习了:按需求选择图表利用dataframe的函数功能结合\进行换行,使得整体代码整洁。如何解释图表,发现图表传递的信息。