US Stock data visualization
研究背景
近年来,M股市场的重要性和影响力不断增加,成为全球投资者关注的焦点之一。美股市场的发展和表现对全球经济和金融市场产生了深远的影响。作为全球最大的股票市场之一,M国股市为投资者提供了广泛的机会,从传统的蓝筹股到新兴的科技公司,吸引了全球范围内的投资者的参与。
M股市场的复杂性和多样性使得对其进行深入的研究和分析变得至关重要。通过使用数据可视化技术,研究人员和分析师可以更好地理解和解释M股市场的趋势、波动性和相关因素。这有助于揭示市场中的潜在机会、风险和趋势,以支持投资决策、风险管理和资产配置等方面的决策制定。数据可视化可以通过图表、图形和交互式界面的方式,将庞大的数据集转化为易于理解和解释的视觉表达,帮助投资者、金融机构和政策制定者更好地理解和应对市场的变化和挑战。
因此,对M股数据进行数据可视化具有一定的现实意义。希望通过本次研究,笔者能够提高个人的数据可视化能力以及了解关于一些M股的金融学、投资学知识。
数据简介
数据背景
在本次试验中,笔者在kaggle上选取了一份名叫"US Stock Market Data & Technical Indicators"的数据集。这份数据集内含10支不同公司发售的M股,包含AAPL(苹果公司)、AMZN(亚马逊公司)、FB(Facebook公司)等知名度高、市值大、拥有卓越的全球影响力的公司,尤其重要的是,这些公司都是在纳斯达克100指数中具有相当高的权重和重要性,在纳斯达克100指数这一衡量指标中的市值排名中通常处于较高的地位。
纳斯达克100指数(NASDAQ-100)是纳斯达克证券交易所的一种股票市场指数,它衡量了纳斯达克市场中100家最大非金融公司的表现。通常持有纳斯达克100指数成分股的都是纳斯达克证券交易所上市的一些知名科技公司、互联网公司和其他相关行业的公司。这些公司在全球范围内拥有巨大的市值和影响力,并且在各自的行业中处于领先地位。例如,苹果公司(AAPL)是全球最有价值的公司之一,亚马逊公司(AMZN)是全球最大的电子商务公司,Facebook公司(FB)是全球最大的社交媒体公司等。
在这份数据集中,每一份公司的股票数据都单独设立一份csv文件,这些文件内包括了M股的一些基础数据如OHLC(Open High Low Close)数据,但是这份数据集是一份探索性数据集,尤其是这些纳斯达克100指数中占权较重的公司,还需要更多更大量的历史数据和很多的技术细节——在每一个公司的股票数据文件中,还包含了非常多的评价指标如MA(移动平均线)、EMA(指数移动平均线)、MACD和MACD_EMA(价格动量)、ATR(Average True Range,价格波动平均幅度)、ROC(Rate of Change,价格变化百分比)等。该数据集的作者希望:在具有这么大量且详细的金融指标的数据集的基础上,人们能做出更多有关股票的精彩实践。
以下是该数据的来源网址:
https://www.kaggle.com/datasets/nikhilkohli/us-stock-market-data-60-extracted-features
由于数据较为庞大,本文只选取了苹果公司(AAPL)的股票数据作为可视化分析的参考数据。
数据展示
首先我们先读取苹果公司(AAPL)的股票数据:
orig_data <- read.csv("AAPL.csv")
summary(orig_data)
这份数据集中的数据量是比较庞大的,以下是笔者对上述部分数据的解读:
· Date:股票的交易日;
· Open:股票交易日当天开盘价,即股票交易日开始的第一个交易价格(单位:$/股)
· High:股票交易日当天最高价,即股票交易日内股票价格达到的最高点(单位:$/股)
· Low:股票交易日当天最低价,即股票交易日内股票价格达到的最低点(单位:$/股)
· Close:股票交易日当天收盘价,即股票在本交易日结束时最后一个交易价格(单位:$/股)
· Volume:股票交易日内股票交易量/成交量,即在给定时间段内买入/卖出股票的数量,一般通过这个数据来观察股市的活跃程度
· Upper_band:上轨线,是布林带(Billinger Bands)指标中的一个组成部分,上轨线的计算方式通常是基于价格的移动平均线上加上一定倍数的标准差。通常情况下,当股价接近或超过上轨线时,可能意味着股价过热或过高,可能会发生回调或价格调整
· Lower_band:下轨线,是布林带指标的一个组成部分,下轨线的计算方式通常是基于价格的移动平均线减去一定倍数的标准差。通常情况下,当股价接近或跌破下轨线时,可能意味着股价过卖或过低,可能出现反弹或价格反转的可能性
· MAx:这里的x ∈ \in ∈ {5, 10, 20, 50, 200} ,指的是移动平均线,通俗来讲,就是过去x个交易日中收盘价的平均值,其中x表示的是最近x个工作日。通常来说,较短期的移动平均线(如MA5和MA10)对价格的波动更加敏感,更快地反应价格变化。较长期的移动平均线(如MA50、MA100和MA200)则更加平滑,可以反映出更长期的趋势。当价格位于移动平均线上方时,可能表示价格处于上涨趋势,而当价格位于移动平均线下方时,可能表示价格处于下跌趋势。交叉点和移动平均线的走势变化也经常被用作买入和卖出的信号。
· EMAx:这里的x ∈ \in ∈ {10, 20, 50, 100, 200} ,指的是指数加权平均线,与MA(简单移动平均线)不同,指数加权平均数给予最近的数据更高的权重,其中x表示的是最近第x个工作日。通常来说,指数加权平均线对最近的价格变动更加敏感,能够更快地反映价格的变化,与简单移动平均线相比,指数加权移动平均线更加平滑,能够更好地反映价格的短期趋势。
· MACD:表示移动平均收敛/发散指标,是一种常用的技术指标,用于分析股票价格的趋势和动能。通常来说,这个指标用于判断价格的短期趋势和拐点,以及市场的超买超卖情况。当MACD值变大时,表示价格的动能加强,但是当MACD柱状图的数值变小时,表示价格的动能减弱。
· MACD_EMA:这是MACD指标的一种变体,它使用指数移动平均线作为计算基础,使指标能够更加敏感和快速地响应价格的变化。
· ATR:表示价格波动平均幅度,能够反映价格波动的强度。
· ROC:表示价格变化的百分比,能够反映价格的涨跌幅度。
· QQQ:代表纳斯达克100指数ETF。本质上QQQ是发行的一种交易所交易基金,旨在追踪纳斯达克100指数的表现。简单来说,有QQQ作为title的指标,是通过少量具有代表性的股票(这里指代的是QQQ)来追踪纳斯达克100指数的整体表现。因为这些纳斯达克100指数ETF(这里指QQQ)的投资组合会按照纳斯达克100指数的成分股权重和分布,购买和持有一篮子代表性股票。这些股票与纳斯达克100指数的成分股基本相同,按照相同的权重进行分配。因此,通过这些股票(QQQ),投资者能够在一定程度上模拟和追踪纳斯达克100指数的整体表现。
如果想了解更多的数据信息,可以查询并学习更加深入的金融学知识。受限于篇幅原因,此处不进行完整的展示。
数据可视化实验
library(ggplot2)
library(dplyr)
library(cowplot)
K线图的绘制
绘制K线图可以提供更直观的股票数据表达,其中包含每日的开盘价、收盘价、最高价和最低价。K线图展示了价格的波动情况,帮助分析师和投资者快速了解市场趋势和价格变化的范围,以做出更准确的决策。因此,我们先进行k线图的绘制,先了解一下这一份股票数据。
#orig_data数据实在是过于庞大了,结合上学期数据结构的知识,考虑到实验需要兼顾效率和低存储量需求,我们应该先进行剪裁再进行局部的数据可视化操作。
DOHLC_data <- orig_data[,1:6]
#查看数据情况
#summary(DOHLC_data)
#可以看到日期数据是存在问题的,如果不处理,还将会是charactor的形式
DOHLC_data$Date <- as.Date(DOHLC_data$Date)
#创建可视化对象 添加k线图层 设置坐标轴和标签
kpic1 <- DOHLC_data %>%
ggplot(aes(x = Date, y = Close.t.)) +
geom_segment(aes(x = Date, xend = Date, y = Low, yend = High), color = "black") +
geom_segment(aes(x = Date - 0.2, xend = Date + 0.2, y = Open, yend = Open), color = "blue") +
geom_segment(aes(x = Date - 0.2, xend = Date + 0.2, y = Close.t., yend = Close.t.), color = "red") +
labs(x = "Date", y = expression("Price" ~ "($/stock)")) +
theme_bw()
#可以大致先看一下成图,似乎有点小了
#kpic1
kpic2 <- DOHLC_data %>%
ggplot(aes(x = Date, y = Volume)) +
geom_bar(stat = "identity", fill = "lightblue") +
labs(x = "Date", y = "Volume") +
theme_bw() +
scale_y_continuous(labels = scales::comma_format())
#kpic2
#可以看出,数据是存在一些问题的:y轴上的数据不应该用科学计数法来呈现
plot_grid(kpic1, kpic2, nrow = 2, align = "v", rel_heights = c(3, 2))
可以看到,上述代码存在这个问题:绘制效果非常差,在2015年前后,交易量和每股价格差距太大。应该以2015年为节点,重点分析2015年之后的时间段(临近现在的时间,参考价值比2015年之前的要大);同时,这样也能规避可视化效果差的问题,由于数据量大且密集,我们需要让Volume和Price的呈现更清晰一些。
#加一个filter函数,筛选出符合日期条件的数据
DOHLC_data <- DOHLC_data %>% filter(Date > as.Date("2015-01-01"))
kpic1 <- DOHLC_data %>%
ggplot(aes(x = Date, y = Close.t.)) +
geom_segment(aes(x = Date, xend = Date, y = Low, yend = High), color = "black") +
geom_segment(aes(x = Date - 0.2, xend = Date + 0.2, y = Open, yend = Open), color = "blue") +
geom_segment(aes(x = Date - 0.2, xend = Date + 0.2, y = Close.t., yend = Close.t.), color = "red") +
labs(x = "Date", y = expression("Price" ~ "($/stock)")) +
theme_bw()
kpic2 <- DOHLC_data %>%
ggplot(aes(x = Date, y = Volume)) +
geom_bar(stat = "identity", fill = "lightblue") +
labs(x = "Date", y = "Volume") +
theme_bw() +
scale_y_continuous(labels = scales::comma_format())
plot_grid(kpic1, kpic2, nrow = 2, align = "v", rel_heights = c(3, 2))
纵观AAPL苹果公司的股票所有数据,交易量的趋势正在不断下降,在2010年前迎来了好几波交易量大爆发(猜测与2008年JR危机有关);但是交易量的下降并不影响单股股价的上升,2010年后,苹果公司的股票交易量不断下跌,但是股价仍然在一路狂飙,推测可能原因如下:
1.市场情绪:投资者对AAPL股票有较高的信心和乐观预期,导致他们更倾向于持有股票而不是进行交易。
2.增长潜力:投资者预期AAPL未来增长潜力较高,可能基于新产品的研发、市场拓展或其他战略举措,这种预期使得投资者更愿意持有股票而不是卖出。
3.供需关系:市场中存在较少的卖方,即愿意出售股票的投资者比较少。这种供需不平衡会导致股价上涨。
MACD图
MACD图是利用MACD、MACD_EMA(移动平均线收敛/发散指标)数据绘制的,是外汇交易中最受欢迎和最广泛使用的指标之一。外汇交易中,MACD指标的基本功能是发现新趋势和辅助鉴别当前趋势是否结束,简单来说,就是可以观察到股票价格的买入和卖出信号,利用这一可视化作品,投资者能更好地作出投资决策。
MACD_data <- select(orig_data, Date, MACD, MACD_EMA)
#summary(MACD_data)
#照例先修改一下Date的格式(应该在一开始的orig_data就做好修改,会省去很多麻烦)
MACD_data$Date <- as.Date(MACD_data$Date)
MACD_data <- MACD_data %>% mutate(MACD_diff = MACD - MACD_EMA)
#创建图表
MACDpic <- ggplot(MACD_data,aes(x = Date)) +
geom_line(aes(y = MACD_diff, color = "MACD_diff"), linewidth = 1.1) +
geom_line(aes(y = MACD,color = "MACD"), alpha = 0.6)+
geom_line(aes(y = MACD_EMA, color = "MACD_EMA"), alpha = 0.6) +
labs(title = "visualiaztion of MACD", x = "Date", y ="Value") +
scale_color_manual(values = c("MACD_diff" = "red", "MACD_EMA" = "blue", "MACD" = "green")) +
theme_minimal()
MACDpic
在这里,笔者主要绘制了MACD线(作为长期指数移动平均线)和MACD_EMA(作为短期指数移动平均线),通过求解他们之间的差值,更加具体地展示出MACD的变化情况,以便更好地理解数据。通常来说,MACD图是通过绘制MACD柱状图来呈现的,其中柱状图的高度表示MACD和MACD_EMA之间的差值,通过二者的差值,我们能够快速地了解到价格的上涨或下跌趋势,如果能够实时采集数据并可视化的话,我们就能够更加全面地分析价格变动和市场趋势。
可以看到,强如AAPL苹果公司,其股价也是呈现一定程度的波动状态。2017-2018年左右以前的时间内,AAPL公司的股价呈现波动幅度较小、整体趋势较为平稳的状态;而在近年(2017-2018年后),其股价波动性逐渐增强,且涨跌幅度也更大,经查阅资料后,笔者认为主要原因如下:
1.市场波动性增加:市场波动性可能是影响股票价格波动的重要驱动因素之一。2017-2018年,市场的波动性大大增加,严重影响了M股的MACD图。
2.技术交易的普及:技术交易在近年来变得越来越普及,这是一种利用计算机算法和数学模型进行交易的方法,如比特币。大量的技术交易者参与市场可能会导致更加频繁的交易活动,增加了价格波动的频率。
3.媒体信息的发展:随着科技进步,媒体信息的传播速度也变得越来越快。投资者能够更加及时地对市场变化做出反应,这可能导致市场价格更加敏感。
多指标参考图
波动幅度图
股价波动幅度图是为了更好地理解和分析股票市场的波动性而绘制的图表。它可以帮助投资者和交易员识别股价的波动趋势、测量价格的波动程度,以及判断市场的风险和机会。波动幅度图提供了关于市场的重要信息,帮助投资者制定决策、调整策略和管理风险,从而更好地参与股票交易。
ATR_data <- select(orig_data,Date,ATR)
ATR_data$Date <- as.Date(ATR_data$Date)
#summary(ATR_data)
ATRpic <- ggplot(ATR_data,aes(x = Date, y = ATR)) +
geom_line(color = "blue", linewidth = 1.05) +
labs(title = "波动幅度图", x = "Date", y = "ATR") +
theme_minimal()
ATRpic
可以看到,2017年-2018年后,波动幅度变得更大,波动频率也变得更加频繁,基本验证了前面MACD图的猜想。
趋势图
趋势图采用的是移动平均线(MA,这里主要采用MA50,即过去x个交易日中收盘价的平均值),通过交易日当天收盘价(close)和MA50的对比,可以比较清晰地看到股价的趋势。
trend_data <-select(orig_data,Date,Close.t.,MA50)
trend_data$Date <- as.Date(trend_data$Date)
#summary(trend_data)
trendpic <- ggplot(trend_data,aes(x = Date)) +
geom_line(aes(y = Close.t.,color = "close")) +
geom_line(aes(y = MA50, color = "MA50")) +
labs(title = "股价(开盘价)趋势图",x = "Date", y = "Price") +
scale_color_manual(values = c("close" = "blue", "MA50" = "red")) +
theme_minimal()
trendpic
可以看到,股价是在不断飙升的。这也印证了前文在K线图中我们对股价的大致描述。
(市场状态)相对强弱图
相对强弱图(Relative Strength Index,RSI)是一种常用的技术指标,用于测量股价的强弱程度。它基于股价的历史变动情况,通过计算一段时间内上涨和下跌的平均幅度,以及股价涨跌的相对比例,来反映市场的超买和超卖状态。相对强弱图能够帮助投资者判断股价的超买和超卖水平,从而指导交易决策,例如判断买入或卖出时机。
超买和超卖是相对强弱图(RSI)所反映的市场状态。通常情况下,当相对强弱指数(RSI)高于70时,表示市场处于超买状态,即股价已经上涨较多,可能面临调整或回调的风险。这时候可能是卖出的时机,投资者可以考虑减少持仓或者采取其他风险控制措施。当相对强弱指数(RSI)低于30时,表示市场处于超卖状态,即股价已经下跌较多,可能存在反弹或者反转的机会。这时候可能是买入的时机,投资者可以考虑增加持仓或者寻找逆势交易机会。
RSI_data <- select(orig_data,Date,RSI)
RSI_data$Date <- as.Date(RSI_data$Date)
RSIpic <- ggplot(RSI_data, aes(x = Date, y = RSI)) +
geom_line(color = "gray") +
labs(title = "(市场状态)相对强弱图", x = "Date", y = "RSI") +
theme_minimal() +
annotate("rect", xmin = min(RSI_data$Date), xmax = max(RSI_data$Date), ymin = 30, ymax = 70, fill = "green", alpha = 0.3) +
annotate("rect", xmin = min(RSI_data$Date), xmax = max(RSI_data$Date), ymin = 70, ymax = Inf, fill = "yellow", alpha = 0.3) +
annotate("rect", xmin = min(RSI_data$Date), xmax = max(RSI_data$Date), ymin = 0, ymax = 30, fill = "red", alpha = 0.3) +
annotate("text", x = min(RSI_data$Date) + 500, y = 20, label = "Oversold", color = "purple", size = 4) +
annotate("text", x = min(RSI_data$Date) + 600, y = 90, label = "Overbought", color = "purple", size = 4)
RSIpic
可以看到,AAPL苹果公司的股票市场多数情况下都是保持正常状态(即RSI值在30-70之间),少数情况下在超卖区间,而处于超买状态的频率要远远大于超卖区间,根据调查,笔者认为可能是如下原因造成的:
1.市场情绪高涨:当市场情绪乐观、投资者信心高涨时,人们更倾向于购买股票,这导致股票价格上涨,市场更容易进入超买状态。
2.结合AAPL苹果公司的发展情况,多数人更倾向于购买和存储股票,而不是将其兜售出去。如果要研究这支股票,我们应该更侧重研究超买状态下的AAPL苹果公司股票市场,了解一下当时的时事特点,为自己日后投资积累可控的避险经验。
实验结论
在实验过程中,我们选取的是AAPL苹果公司的美股数据,在数据可视化和分析的过程中可以发现:
1.投资人对AAPL苹果公司充满着信心。这意味着他们将会倾向于囤积股票、购入股票,而并非去兜售股票。购入这样的优质股票要看准时机;如果要研究这支股票,还需要留意其超卖状态下的市场特征,为自己购股积累风控经验。
2.股票市场的预测是非常困难的事情,单纯基于过去数据去认识一支股票并预测其未来股价是非常困难的事情。要善于结合当下市场情况、股市舆情等复杂情况重新审视一支股票,这样才能尽可能保证自身收益的最大化。
与此同时,笔者了解到了非常多的金融学知识,对M股的认识更上一层楼。但非常遗憾的是,受限于个人工作安排,笔者并未验证QQQ纳斯达克交易基金的比较作用,这一点如果后续有空余时间笔者将会继续探索研究。