指标解读:
MACD(Moving Average Convergence
Divergence)可用于分析金融市场的趋势和动量。该指标利于投资者理解市场的趋势、确认买卖信号以及衡量价格动量,从而辅助决策和规避风险。
MACD的计算步骤如下:
(1)计算快速移动平均线(EMA12):计算12日内收盘价的指数移动平均值。
(2)计算慢速移动平均线(EMA26):计算26日内收盘价的指数移动平均值。
(3)计算DIF线: DIF = EMA12 - EMA26
(4)计算信号线(DEA):计算DIF的9日移动平均值
(5)计算MACD柱形图: MACD柱形图 = DIF – DEA
指标解读:
通过分析每个月的最高价及最低价走势,有利于了解其价格波动趋势及变化趋势。最高价与最低价的差距较大时,意味着其价格波动较大,反之则波动较小。
# A tibble: 12 × 2
Currency mean_volume
<chr> <dbl>
1 bitcoin 3599157716.
2 tether 2859901539.
3 ethereum 1429437057.
4 litecoin 510155760.
5 eos 425196182.
6 bitcoin-cash 362209337.
7 xrp 348805455.
8 bitcoin-sv 69456986.
9 binance-coin 56266517.
10 stellar 55151772.
11 cardano 40047661.
12 tezos 3883308.
# A tibble: 12 × 2
Currency Total_Market_Cap
<chr> <dbl>
1 bitcoin 1.24e14
2 ethereum 3.62e13
3 xrp 1.73e13
4 bitcoin-cash 9.61e12
5 litecoin 4.90e12
6 eos 4.20e12
7 cardano 2.96e12
8 stellar 2.84e12
9 tether 2.24e12
10 binance-coin 1.88e12
11 bitcoin-sv 1.55e12
12 tezos 5.28e11
Pearson's product-moment correlation
data: data$Close and data$Market.Cap
t = 72.278, df = 25631, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.4012522 0.4215913
sample estimates:
cor
0.4114729
Pearson's product-moment correlation
data: data$Volume_lag1 and data$Close
t = 57.723, df = 25631, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.3282965 0.3499642
sample estimates:
cor
0.3391753
Pearson's product-moment correlation
data: data$Close and data$Volume_lag7
t = 57.761, df = 25631, p-value < 2.2e-16
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
0.3284985 0.3501629
sample estimates:
cor
0.3393757
相关性分析:
如散点图所示,市值与收盘价之间存在中等偏强的正相关关系,随着加密货币市值的增加,收盘价也倾向于增加。成交量与收盘价之间存在中等偏弱的正相关关系,随着加密货币收盘价的增加,收盘价也有增加的趋势。
通过清洗数据、变量类型转变和对数转换,得到25633个观察值。使用cor.test函数计算出市值与收盘价的相关系数为0.41147,说明市值与收盘价之间存在中等强度的正相关关系。t统计量的值为72.278,p值小于2.2e-16,95%的置信区间为
[0.4012522,
0.4215913],因此市值与收盘价之间的相关性非常显著。
由于金融数据的时间序列特性,分析成交量与收盘价之间的相关性时,要考虑时间滞后性,因此创建了滞后1天、2天和7天的成交量变量。使用cor函数分别计算滞后1天、2天和7天的成交量与收盘价之间的相关系数,结果分别为0.33917、0.33922和0.33938,因此滞后7天的成交量与收盘价之间的相关关系更强。
相关性分析:
使用corrplot函数可视化相关系数矩阵,展示了各变量之间的相关系数大小和相关性强弱,左下角显示了相关系数值,右上角显示了相关性强弱,椭圆越扁表示相关性越强,颜色越深表示相关性越强。
指标解读 :
MACD(Moving Average Convergence Divergence)可用于分析金融市场的趋势和动量。该指标利于投资者理解市场的趋势、确认买卖信号以及衡量价格动量,从而辅助决策和规避风险。
MACD的计算步骤如下:
(1)计算快速移动平均线(EMA12):计算12日内收盘价的指数移动平均值。
(2)计算慢速移动平均线(EMA26):计算26日内收盘价的指数移动平均值。
(3)计算DIF线: DIF = EMA12 - EMA26
(4)计算信号线(DEA):计算DIF的9日移动平均值
(5)计算MACD柱形图: MACD柱形图 = DIF – DEA
---
title: "加密货币交易数据分析"
author: "第五组"
output:
flexdashboard::flex_dashboard:
orientation: rows
social: menu
source_code: embed
---
```{r setup, include=FALSE}
library(shiny)
library(tidyverse)
library(TTR)
library(DT)
library(ggplot2)
library(gridExtra)
library(zoo)
library(scales)
library(plotly)
library(dplyr)
library(gridExtra)
library(htmltools)
library(corrplot)
library(flexdashboard)
# 加载数据
data <- read.csv("D:/YY/R/consolidated_coin_data.csv")
# 查看数据结构
str(data)
# 检查数据列名
print(names(data))
# 确保日期列是日期类型
data$Date <- as.Date(data$Date, format = "%Y/%m/%d" )
# 检查数据类型
data$Close <- as.numeric(gsub(",", "", data$Close))
#处理缺失值
data <- na.omit(data)
# 计算最近一年的开始和结束日期
end_date <- max(data$Date)
start_date <- end_date - 365
print(data)
```
MACD指标分析 {data-navmenu="价格指标"}
=======================================================================
Row {data-height=50}
-----------------------------------------------------------------------
```{r}
# 定义计算MACD的函数
calculate_macd <- function(df) {
df <- df %>% arrange(Date) %>% filter(!is.na(Close), !is.na(Date))
if (nrow(df) <= 25) return(NULL)
df$EMA12 <- EMA(df$Close, n = 12)
df$EMA26 <- EMA(df$Close, n = 26)
df$DIF <- df$EMA12 - df$EMA26
df$DEA <- EMA(df$DIF, n = 9)
df$MACD <- df$DIF - df$DEA
return(df)
}
# 定义UI
ui <- fluidPage(
titlePanel("MACD指标分析"),
sidebarLayout(
sidebarPanel(
selectInput("currencyInput", "选择货币种类:", choices = unique(data$Currency)),
dateRangeInput("dateRange", "选择日期范围:", start = start_date, end = end_date, min = min(data$Date), max = max(data$Date))
),
mainPanel(
plotOutput("macdPlot", height = "700px")
)
)
)
# 定义服务器
server <- function(input, output) {
# 过滤数据并计算MACD
filtered_data <- reactive({
req(input$currencyInput, input$dateRange)
data %>%
filter(Currency == input$currencyInput & Date >= input$dateRange[1] & Date <= input$dateRange[2])
})
macd_data <- reactive({
calculate_macd(filtered_data())
})
# 显示 MACD 图形
output$macdPlot <- renderPlot({
req(macd_data())
ggplot(macd_data(), aes(x = Date)) +
geom_bar(aes(y = MACD, fill = ifelse(MACD >= 0, "Positive", "Negative")), stat = "identity", position = "identity") +
geom_line(aes(y = DIF, color = "DIF"), size = 1) +
geom_line(aes(y = DEA, color = "DEA"), size = 1) +
labs(title = paste("MACD of", input$currencyInput),
x = "Date", y = "MACD") +
scale_color_manual(values = c("DIF" = "blue", "DEA" = "red")) +
scale_fill_manual(values = c("Positive" = "red", "Negative" = "green")) +
theme_minimal()
})
}
# 运行应用
shinyApp(ui = ui, server = server)
```
Row {data-height=50}
-----------------------------------------------------------------------
<div style="font-size: 18px; margin-top: 20px;">
<p><strong>指标解读</strong>:<br>MACD(Moving Average Convergence Divergence)可用于分析金融市场的趋势和动量。该指标利于投资者理解市场的趋势、确认买卖信号以及衡量价格动量,从而辅助决策和规避风险。<br>MACD的计算步骤如下:
<br>(1)计算快速移动平均线(EMA12):计算12日内收盘价的指数移动平均值。
<br>(2)计算慢速移动平均线(EMA26):计算26日内收盘价的指数移动平均值。
<br>(3)计算DIF线: DIF = EMA12 - EMA26
<br>(4)计算信号线(DEA):计算DIF的9日移动平均值
<br>(5)计算MACD柱形图: MACD柱形图 = DIF – DEA
</p>
</div>
最高价/最低价 {data-navmenu="价格指标"}
=======================================================================
Row {data-height=50}
-----------------------------------------------------------------------
```{r}
```
Row
-----------------------------------------------------------------------
<div style="font-size: 18px; margin-top: 20px;">
<p><strong>指标解读</strong>:<br>通过分析每个月的最高价及最低价走势,有利于了解其价格波动趋势及变化趋势。最高价与最低价的差距较大时,意味着其价格波动较大,反之则波动较小。
</p>
</div>
基于交易量的加密货币分发 {data-navmenu="加密货币分发"}
=======================================================================
Row {data-height=250}
-----------------------------------------------------------------------
### 加密货币平均交易量排名柱状图
```{r}
#计算每种加密货币的平均交易量
average_volume <- data %>%
group_by(Currency) %>%
summarise(mean_volume = mean(Volume, na.rm = TRUE)) %>%
arrange(desc(mean_volume))
print(average_volume)
#绘制加密货币平均交易量排名柱状图
ggplot(average_volume, aes(x = reorder(Currency, -mean_volume), y = mean_volume)) +
geom_bar(stat = "identity", fill = "steelblue") +
theme_minimal() +
labs(title = "加密货币平均交易量排名", x = "加密货币", y = "平均交易量") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
```
### 加密货币交易量时间序列分析图
```{r}
custom_colors <- c("#E69F00", "#56B4E9", "#009E73", "#F0E442", "#D55E00", "#CC79A7",
"#FF9999", "#666699", "#FFCC00", "#99FF99", "#FFCCCC", "#CCFFFF")
time_series_plot <- ggplot(data, aes(x = Date, y = Volume, color = Currency)) +
geom_point(shape = 16, size = 1.5) +
labs(x = "日期", y = "交易量", title = "加密货币交易量时间序列分析图") +
scale_color_manual(values = custom_colors)
print(time_series_plot)
```
Row {data-height=80}
-----------------------------------------------------------------------
###
- 各个加密货币的交易活跃程度:①比特币(bitcoin)在加密货币市场中占据了主导地位,其交易量远超其他所有货币;②泰达币(tether)仅次于比特币;③其他的加密货币如litecoin、eos等虽然存在,但在交易量上与前两者相比显得非常小众。
- 交易量的波动情况和市场需求的变化:①2017年是一个重要的时间节点,因为这一年中某些加密货币的交易量出现了显著的增长,其他小型加密货币也开始获得了市场的关注和投资者的青睐。②2019年是一个重要的时间节点,因为这一年后泰达币(tether)交易量开始超过比特币(bitcoin),成为当年交易量第一位的加密货币。
基于市值的加密货币分发 {data-navmenu="加密货币分发"}
=======================================================================
Row {data-height=300}
-----------------------------------------------------------------------
### 加密货币总市值排名柱状图
```{r}
# 计算每种加密货币的总市值
total_market_cap <- data %>%
group_by(Currency) %>%
summarise(Total_Market_Cap = sum(Market.Cap, na.rm = TRUE)) %>%
arrange(desc(Total_Market_Cap))
print(total_market_cap)
# 绘制加密货币总市值排名柱状图
ggplot(total_market_cap, aes(x = reorder(Currency, -Total_Market_Cap), y = Total_Market_Cap)) +
geom_bar(stat = "identity", fill = "steelblue") +
theme_minimal() +
labs(title = "加密货币总市值排名", x = "加密货币", y = "总市值") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
```
### 加密货币总市值占比饼图
```{r}
p <- plot_ly(total_market_cap, labels = ~Currency, values = ~Total_Market_Cap, type = "pie",
textinfo = "label+percent", hole = 0.4, title = "加密货币总市值占比") %>%
layout(title = list(text = "加密货币总市值占比", x = 0.5),
annotations = list(list(text = "加密货币", x = 0.5, y = 0.95, showarrow = FALSE)))
p
```
Row {data-height=100}
-----------------------------------------------------------------------
###
- 各个加密货币的交易活跃程度:①比特币(bitcoin)在加密货币市场中占据了主导地位,其交易量远超其他所有货币;②泰达币(tether)仅次于比特币;③其他的加密货币如litecoin、eos等虽然存在,但在交易量上与前两者相比显得非常小众。
- 不同加密货币在市场中的相对重要性:①比特币(bitcoin)的市值占比最高,接近59.5%,这意味着在所有的加密货币中,比特币的市值是最大的。②以太坊(ethereum)市值占比占比为17.4%,仅次于比特币。③一些较小的加密货币如bitcoin-sv、tezos等虽然市值占比较低,但也有其特定的市场地位和用途。
相关性散点图 {data-navmenu="相关性分析"}
=======================================================================
Row {data-height=50}
-----------------------------------------------------------------------
```{r}
#将收盘价转化为数值型变量
data$Close <- as.numeric(gsub(",", "", data$Close))
#确保日期为日期格式
data$Date<-as.Date(data$Date)
#按照日期升序排列
data <- data[order(data$Currency, data$Date), ]
#去除市值和成交量中的0值
data$Market.Cap[data$Market.Cap == 0] <- NA
data$Volume[data$Volume == 0] <- NA
#去除缺失值
data <- na.omit(data)
#对数转换
data$Market.Cap<-log(data$Market.Cap )
data$Volume<-log(data$Volume )
#分组并创建滞后变量
data <- data %>%
group_by(Currency) %>% # 根据加密货币列的值进行分组
mutate(Volume_lag1 = lag(Volume, n = 1, default = NA))# 滞后1期,每个组的第一个观测值,滞后值将是NA
data <- data %>%
group_by(Currency) %>% # 根据加密货币列的值进行分组
mutate(Volume_lag2 = lag(Volume, n = 2, default = NA))# 滞后2期
data <- data %>%
group_by(Currency) %>% # 根据加密货币列的值进行分组
mutate(Volume_lag7 = lag(Volume, n = 7, default = NA))# 滞后7期
data <- na.omit(data)
# 计算收盘价与市值之间的相关性
cor<- cor(data$Close, data$Market.Cap,method="pearson",use="complete.obs")
cor.test(data$Close, data$Market.Cap,method="pearson",use="complete.obs")
#计算前几天成交量与收盘价之间的相关性
cor_lag1<-cor(data$Volume_lag1, data$Close,method="pearson",use="complete.obs")
cor.test(data$Volume_lag1, data$Close,method="pearson",use="complete.obs")
cor_lag2<-cor(data$Volume_lag2, data$Close,method="pearson",use="complete.obs")
cor_lag7<-cor(data$Volume_lag7, data$Close,method="pearson",use="complete.obs")
cor.test(data$Close, data$Volume_lag7,method="pearson",use="complete.obs")
```
```{r}
```
Row {data-height=50}
-----------------------------------------------------------------------
<div style="font-size: 18px; margin-top: 20px;">
<p><strong>相关性分析</strong>:<br>如散点图所示,市值与收盘价之间存在中等偏强的正相关关系,随着加密货币市值的增加,收盘价也倾向于增加。成交量与收盘价之间存在中等偏弱的正相关关系,随着加密货币收盘价的增加,收盘价也有增加的趋势。<br>通过清洗数据、变量类型转变和对数转换,得到25633个观察值。使用cor.test函数计算出市值与收盘价的相关系数为0.41147,说明市值与收盘价之间存在中等强度的正相关关系。t统计量的值为72.278,p值小于2.2e-16,95%的置信区间为 [0.4012522, 0.4215913],因此市值与收盘价之间的相关性非常显著。<br>由于金融数据的时间序列特性,分析成交量与收盘价之间的相关性时,要考虑时间滞后性,因此创建了滞后1天、2天和7天的成交量变量。使用cor函数分别计算滞后1天、2天和7天的成交量与收盘价之间的相关系数,结果分别为0.33917、0.33922和0.33938,因此滞后7天的成交量与收盘价之间的相关关系更强。
</p>
</div>
相关系数矩阵图 {data-navmenu="相关性分析"}
=======================================================================
Row {data-height=50}
-----------------------------------------------------------------------
```{r}
```
Row {data-height=50}
-----------------------------------------------------------------------
<div style="font-size: 18px; margin-top: 20px;">
<p><strong>相关性分析</strong>:<br>使用corrplot函数可视化相关系数矩阵,展示了各变量之间的相关系数大小和相关性强弱,左下角显示了相关系数值,右上角显示了相关性强弱,椭圆越扁表示相关性越强,颜色越深表示相关性越强。
</p>
</div>
DID政策影响
=======================================================================
Row {data-height=100}
-----------------------------------------------------------------------
```{r}
# 将 Close 列转换为数值型
data$Close <- as.numeric(data$Close)
# 将 Volume 列转换为数值型
data$Volume <- as.numeric(data$Volume)
# 创建虚拟变量
data$AfterPolicy <- as.numeric(data$Date >= "2017-09-04")
data$CurrencyDummy <- as.factor(data$Currency)
# 估计DID模型
did_model_price <- lm(Close ~ AfterPolicy * CurrencyDummy, data = data)
did_model_volume <- lm(Volume ~ AfterPolicy * CurrencyDummy, data = data)
# 输出模型摘要
summary_price <- summary(did_model_price)
summary_volume <- summary(did_model_volume)
# 提取政策影响系数
policy_effect_price <- coef(did_model_price)["AfterPolicy"]
policy_effect_volume <- coef(did_model_volume)["AfterPolicy"]
# 计算政策实施前后的价格差异和交易量差异
data$PriceDiff <- ifelse(data$AfterPolicy == 1, data$Close - policy_effect_price, data$Close)
data$VolumeDiff <- ifelse(data$AfterPolicy == 1, data$Volume - policy_effect_volume, data$Volume)
# 提取日期、价格差异和交易量差异
did_data <- data.frame(Date = data$Date, PriceDiff = data$PriceDiff, VolumeDiff = data$VolumeDiff, AfterPolicy = data$AfterPolicy)
# 对每个部分进行价格和交易量的线性回归
before_data <- subset(did_data, Date < as.Date("2017-09-04"))
after_data <- subset(did_data, Date >= as.Date("2017-09-04"))
before_price_lr <- lm(PriceDiff ~ Date, data = before_data)
after_price_lr <- lm(PriceDiff ~ Date, data = after_data)
before_volume_lr <- lm(VolumeDiff ~ Date, data = before_data)
after_volume_lr <- lm(VolumeDiff ~ Date, data = after_data)
# 预测每个部分的价格和交易量差异
before_price_predicted <- predict(before_price_lr)
after_price_predicted <- predict(after_price_lr)
before_volume_predicted <- predict(before_volume_lr)
after_volume_predicted <- predict(after_volume_lr)
# 计算DID实验组的曲线
did_group_means <- did_data %>%
group_by(Date, AfterPolicy) %>%
summarise(mean_price_diff = mean(PriceDiff), mean_volume_diff = mean(VolumeDiff))
# 拟合价格和交易量的两条直线
before_price_lr <- lm(mean_price_diff ~ Date, data = filter(did_group_means, AfterPolicy == 0))
after_price_lr <- lm(mean_price_diff ~ Date, data = filter(did_group_means, AfterPolicy == 1))
before_volume_lr <- lm(mean_volume_diff ~ Date, data = filter(did_group_means, AfterPolicy == 0))
after_volume_lr <- lm(mean_volume_diff ~ Date, data = filter(did_group_means, AfterPolicy == 1))
# 提取拟合直线的斜率和截距
before_price_slope <- coef(before_price_lr)[2]
before_price_intercept <- coef(before_price_lr)[1]
after_price_slope <- coef(after_price_lr)[2]
after_price_intercept <- coef(after_price_lr)[1]
before_volume_slope <- coef(before_volume_lr)[2]
before_volume_intercept <- coef(before_volume_lr)[1]
after_volume_slope <- coef(after_volume_lr)[2]
after_volume_intercept <- coef(after_volume_lr)[1]
# 顶部导航下拉菜单
selectInput("plot_type", "选择政策影响指标:", choices = c("价格" = "price", "交易量" = "volume"))
```
Row
-----------------------------------------------------------------------
```{r}
# 在 Shiny UI 中设置布局
fluidRow(
column(8,
plotlyOutput("plot_diff", height = "450px"),
br(), # 添加空行
plotlyOutput("p_did", height = "450px"),
br(), # 添加空行
div(style = "font-size: 18px; margin-top: 20px;",
p(strong("指标解读"), ":"),
p("MACD(Moving Average Convergence Divergence)可用于分析金融市场的趋势和动量。该指标利于投资者理解市场的趋势、确认买卖信号以及衡量价格动量,从而辅助决策和规避风险。"),
p("MACD的计算步骤如下:"),
p("(1)计算快速移动平均线(EMA12):计算12日内收盘价的指数移动平均值。"),
p("(2)计算慢速移动平均线(EMA26):计算26日内收盘价的指数移动平均值。"),
p("(3)计算DIF线: DIF = EMA12 - EMA26"),
p("(4)计算信号线(DEA):计算DIF的9日移动平均值"),
p("(5)计算MACD柱形图: MACD柱形图 = DIF – DEA")
)
),
column(4,
verbatimTextOutput("summary") # 显示模型摘要的输出
)
)
```