MACD指标分析

Row

Shiny applications not supported in static R Markdown documents

Row

指标解读:
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

最高价/最低价

Row

Row

指标解读:
通过分析每个月的最高价及最低价走势,有利于了解其价格波动趋势及变化趋势。最高价与最低价的差距较大时,意味着其价格波动较大,反之则波动较小。

基于交易量的加密货币分发

Row

加密货币平均交易量排名柱状图

# 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.

加密货币交易量时间序列分析图

Row

  • 各个加密货币的交易活跃程度:①比特币(bitcoin)在加密货币市场中占据了主导地位,其交易量远超其他所有货币;②泰达币(tether)仅次于比特币;③其他的加密货币如litecoin、eos等虽然存在,但在交易量上与前两者相比显得非常小众。
  • 交易量的波动情况和市场需求的变化:①2017年是一个重要的时间节点,因为这一年中某些加密货币的交易量出现了显著的增长,其他小型加密货币也开始获得了市场的关注和投资者的青睐。②2019年是一个重要的时间节点,因为这一年后泰达币(tether)交易量开始超过比特币(bitcoin),成为当年交易量第一位的加密货币。

基于市值的加密货币分发

Row

加密货币总市值排名柱状图

# 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

加密货币总市值占比饼图

Row

  • 各个加密货币的交易活跃程度:①比特币(bitcoin)在加密货币市场中占据了主导地位,其交易量远超其他所有货币;②泰达币(tether)仅次于比特币;③其他的加密货币如litecoin、eos等虽然存在,但在交易量上与前两者相比显得非常小众。
  • 不同加密货币在市场中的相对重要性:①比特币(bitcoin)的市值占比最高,接近59.5%,这意味着在所有的加密货币中,比特币的市值是最大的。②以太坊(ethereum)市值占比占比为17.4%,仅次于比特币。③一些较小的加密货币如bitcoin-sv、tezos等虽然市值占比较低,但也有其特定的市场地位和用途。

相关性散点图

Row


    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 

Row

相关性分析:
如散点图所示,市值与收盘价之间存在中等偏强的正相关关系,随着加密货币市值的增加,收盘价也倾向于增加。成交量与收盘价之间存在中等偏弱的正相关关系,随着加密货币收盘价的增加,收盘价也有增加的趋势。
通过清洗数据、变量类型转变和对数转换,得到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天的成交量与收盘价之间的相关关系更强。

相关系数矩阵图

Row

Row

相关性分析:
使用corrplot函数可视化相关系数矩阵,展示了各变量之间的相关系数大小和相关性强弱,左下角显示了相关系数值,右上角显示了相关性强弱,椭圆越扁表示相关性越强,颜色越深表示相关性越强。

DID政策影响

Row

Row



指标解读 :

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")  # 显示模型摘要的输出
  )
)


```