This R file generates the daily and weekly speech databases.
setwd("C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025")
# Packages
require(gt)
require(gtsummary)
library(dplyr)
library(tidyr)
library(stringr)
library(lubridate)
library(readr)
library(purrr)
library(httr)
library(jsonlite)
library(data.table) # pratique pour expansions rapides
library(fixest)
library(ggplot2)
require(scales)
options(dplyr.summarise.inform = FALSE)
theme_set(theme_minimal(base_size = 12))
sent_pred <- read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/2b_cbdc_sentence_preds_with_author_desc.csv")
countries <- read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/countries2.csv", sep=";")
titles <- read.csv(file="C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/cbdc_title_flags_from_matches.csv")
We use the database
2b_cbdc_sentence_preds_with_author_desc.csv downloaded from
the Kaggle notebook. We also use the countries2.csv file
that merge the authors of speeches with their Central Bank and
Countries. For some cases, there are multiple authors for a specific
speech. Fortunately, these case are rare and they group authors from the
same Central Banks and the same Countries. We manually retrieve their
informations and add them directly.
sent_pred2 <- sent_pred %>%
select(-c(country,description) )%>%
distinct()%>%
left_join(countries%>%unique(), by=c("author"))%>%
mutate(Country =case_when(
author=="Jacqueline Loh; Benoît Cœuré" ~ "ECB Board",
author=="Thomas Jordan; Martin Schlegel; Antoine Martin"~"Switzerland",
author=="Petra Tschudin; Thomas Moser"~"Switzerland",
author=="Olaf Sleijpen; Klaas Knot; Steven Maijoor" ~ "Netherlands",
TRUE ~ Country))%>%
mutate(Central_Bank =case_when(
author=="Jacqueline Loh; Benoît Cœuré" ~ "European Central Bank",
author=="Thomas Jordan; Martin Schlegel; Antoine Martin"~"Swiss National Bank",
author=="Petra Tschudin; Thomas Moser"~"Swiss National Bank",
author=="Olaf Sleijpen; Klaas Knot; Steven Maijoor" ~ "European Central Bank",
TRUE ~ Central_Bank))%>%
mutate(
datetime = parse_date_time(
date,
orders = c("d/m/Y H:M:S", "d/m/Y H:M", "Y-m-d H:M:S", "Y-m-d H:M"),
tz = "UTC"
),
date = as_date(datetime) # keep a pure Date too (optional)
)%>%select(-datetime)%>%
filter(date >= as.Date("2015-01-01"))%>% select(-X)
We save the complete list of speeches in a .csv file
(completelist.csv). Note that the database has loose
keywords conditions, in order to capture all speeches related to CBDC.
However, some sentences are linked to titles and/or references, or to
crypto-assets exclusively (see for example the first observations
above).
write.table(sent_pred2,
file = "C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/completelist.csv",
sep = ";", dec = ".",
row.names = FALSE, col.names = TRUE,
fileEncoding = "UTF-8")
We manually note each title. The dataset list.csv is the
same as completelist.csv, with an additional column
cbdc_sentence that is equal to FALSE when
sentences are related to keywords in title or in references. We then
remove these “wrong” sentences, and add the corresponding currency to
each Central Bank manually.
auer_data <- readxl::read_excel("C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/speechesstances.xlsx")%>%filter(source=="auer")
sentence_base <- read.csv2("C:/Users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/list.csv",
fileEncoding = "UTF-8",
stringsAsFactors = FALSE)%>%
left_join(titles %>% select(url, cbdc_in_title), by='url')%>%
unique()%>%
mutate(cbdc_sentence = ifelse(is.na(cbdc_sentence), "TRUE",cbdc_sentence))%>%
filter(!cbdc_sentence=="FALSE")%>% # we only keep the true CBDC-related sentences
mutate(
datetime = parse_date_time(
date,
orders = c("d/m/Y H:M:S", "d/m/Y H:M", "Y-m-d H:M:S", "Y-m-d H:M"),
tz = "UTC"
),
date = as_date(datetime)
)%>%select(-datetime) %>%
select(-c(match_type, keyword,source, cbdc_sentence))%>%
mutate(date = as.Date(date)) %>%
distinct()%>%
mutate(Currency = case_when(
Central_Bank == "Bank of England" ~ "GBP",
Central_Bank == "European Central Bank" ~ "EUR",
Central_Bank == "Bank of Japan" ~ "JPY",
Central_Bank == "Bank of Canada" ~ "CAD",
Central_Bank == "Reserve Bank of Australia" ~ "AUD",
Central_Bank == "Monetary Authority of Singapore" ~ "SGD",
Central_Bank == "Sveriges Riksbank" ~ "SEK",
Central_Bank == "Bank of Korea" ~ "KRW",
Central_Bank == "Fed" ~ "USD",
Central_Bank == "Central Bank of Malaysia" ~ "MYR",
Central_Bank == "Central Bank of Chile" ~ "CLP",
Central_Bank == "National Bank of the Republic of (North) Macedonia" ~ "MKD",
Central_Bank == "Czech National Bank" ~ "CZK",
Central_Bank == "South African Reserve Bank" ~ "ZAR",
Central_Bank == "Bank of Botswana" ~ "BWP",
Central_Bank == "Central Bank of Barbados" ~ "BBD",
Central_Bank == "National Bank of Denmark" ~ "DKK",
Central_Bank == "Bank of Mauritius" ~ "MUR",
Central_Bank == "State Bank of Pakistan" ~ "PKR",
Central_Bank == "Central Bank of Sri Lanka" ~ "LKR",
Central_Bank == "Swiss National Bank" ~ "CHF",
Central_Bank == "Central Bank of the Philippines" ~ "PHP",
Central_Bank == "Central Bank of Iceland" ~ "ISK",
Central_Bank == "Bank of Thailand" ~ "THB",
Central_Bank == "Reserve Bank of New Zealand" ~ "NZD",
Central_Bank == "Eastern Caribbean Central Bank" ~ "XCD",
Central_Bank == "Central Bank of The Bahamas" ~ "BSD",
Central_Bank == "Hong Kong Monetary Authority" ~ "HKD",
Central_Bank == "Norges Bank" ~ "NOK",
Central_Bank == "Central Bank of Bosnia and Herzegovina" ~ "BAM",
Central_Bank == "Central Bank of Kuwait" ~ "KWD",
Central_Bank == "Central Bank of Morocco" ~ "MAD",
Central_Bank == "Bank of Mexico" ~ "MXN",
Central_Bank == "Bank of Albania" ~ "ALL",
Central_Bank == "Bank of Russia" ~ "RUB",
Central_Bank == "Reserve Bank of India" ~ "INR",
Central_Bank == "People's Bank of China" ~ "CNY",
Central_Bank == "Bank Indonesia" ~ "IDR",
Central_Bank == "Central Bank of Kenya"~ "KES",
Central_Bank == "Central Bank of Nigeria" ~ "NGN",
Central_Bank == "National Bank of Serbia" ~ "RSD",
Central_Bank == "Bank of Israel" ~ "ILS",
Central_Bank == "Central Bank of the Republic of Kosovo" ~ "EUR",
Central_Bank == "Bank of Finland" ~ "EUR",
Central_Bank == "Central Bank of Nepal" ~ "NPR",
Central_Bank == "Central Bank of Cyprus" ~ "EUR",
Central_Bank == "Central Bank of Eswatini" ~ "SZL",
Central_Bank == "Bank of Slovenia" ~ "EUR",
TRUE~"Other"
))%>%
select(-c(X, X.1))
sentence_base%>%filter(Central_Bank=="Bank of Finland")
We now have a sentence-level clean database that contains the
type_label (retail, wholesale, general/unspecified), the
sentiment_label (positive, negative, neutral),
stance_label (Pro-CBDC, Anti-CBDC, Wait-and-See) and
discourse_label (Risk-Benefit, Feature, Process) associated
with each sentence measured by BERT.
| Summary statistics of sentence-level database (N = 5397 sentences) | ||
| Number of sentences | Share within dimension | |
|---|---|---|
| Discourse | ||
| Process | 2,381 | 44.1% |
| Feature | 1,543 | 28.6% |
| Risk-Benefit | 1,473 | 27.3% |
| Sentiment | ||
| neutral | 3,029 | 56.1% |
| positive | 1,937 | 35.9% |
| negative | 431 | 8.0% |
| Stance | ||
| Pro-CBDC | 2,813 | 52.1% |
| Wait-and-See | 2,051 | 38.0% |
| Anti-CBDC | 533 | 9.9% |
| Type de CBDC | ||
| Retail CBDC | 2,854 | 52.9% |
| General/Unspecified | 2,114 | 39.2% |
| Wholesale CBDC | 429 | 7.9% |
In total, there are 5397 uniques sentences, mostly about Retail CBDC (53% of speeches), while unspecified (39%) and wholesale (8%) are relatively marginally mentioned. Overall, the sentiment is essentially neutral yet pro-CBDC. In addition, we can see that there are less speeches about wholesale CBDC, but they tend to be more positive/Pro-CBDC :
In addition, we can observe that some Central Banks - and notably ECB - tend to communicate more than others :
We have sentiment, stance, discourse and type of CBDC discussed at
sentence-level. We transform the sentiments (positive,
neutral et negative) and stances
(Pro-CBDC, Wait-and-See et
Anti-CBDC) in numeric values (1, 0, -1) to obtain similar
data as in Auer & al (2021) and Dionysopoulos & Makridis
(2025).
Then, for a given speech, we measure the average sentiment and stance. We then aggregate the sentiment and stance daily-level as their average across all speeches that day.
We also decompose by type of CBDC discussed within each day, as well as for ECB, Fed and other central banks, and for developed versus emerging markets central banks.
bankday_type <- speech_level %>%
group_by(date, Central_Bank, type_label) %>%
summarise(
sent_btk = mean(sent_speech, na.rm = TRUE),
stance_btk = mean(stance_speech, na.rm = TRUE),
.groups = "drop"
)
type_daily <- bankday_type %>%
group_by(date, type_label) %>%
summarise(
index_sent_type = mean(sent_btk, na.rm = TRUE),
index_stance_type = mean(stance_btk, na.rm = TRUE),
.groups = "drop"
)
bankday_all <- bankday_type %>%
group_by(date, Central_Bank) %>%
summarise(
sent_bt_all = mean(sent_btk, na.rm = TRUE),
stance_bt_all = mean(stance_btk, na.rm = TRUE),
.groups = "drop"
)
sentence_base2 <- sentence_base%>%
select(url, date)%>%
distinct(url, date)%>%
inner_join(auer_data%>%select(URL_text, speech_stance), by=c("url"="URL_text"))%>%
group_by(date)%>%
summarize(stance_auer = mean(speech_stance))
global_daily <- bankday_all %>%
group_by(date) %>%
summarise(
index_sent_global = mean(sent_bt_all, na.rm = TRUE),
index_stance_global = mean(stance_bt_all, na.rm = TRUE),
.groups = "drop"
)%>%
left_join(sentence_base2, by="date")%>%
mutate(speechday = 1)
global_daily_deveme <- bankday_all %>%
mutate(deveme = case_when(Central_Bank %in% c("Bank of England",
"European Central Bank",
"Fed",
"Bank of Japan",
"Bank of Canada",
"Reserve Bank of Australia",
"Sveriges Riksbank",
"Swiss National Bank",
"Central Bank of Iceland", "Norges Bank",
"National Bank of Denmark",
"Reserve Bank of New Zealand", "Bank of Finland") ~"Developed",
TRUE ~"Emerging"))%>%
group_by(deveme, date)%>%
summarise(index_sent_deveme = mean(sent_bt_all,na.rm = TRUE),
index_stance_deveme=mean(stance_bt_all,na.rm = TRUE))%>%
arrange(date)%>%ungroup()%>%
dplyr::rename(
sent = index_sent_deveme,
stance = index_stance_deveme
) %>%
pivot_wider(
id_cols = date,
names_from = deveme, # "Developed", "Emerging"
values_from = c(sent, stance),
names_glue = "{.value}_{deveme}", # sent_Developed, stance_Developed, etc.
values_fill = list(sent = 0, stance = 0)
)
global_daily_decomposed <- bankday_all %>%
mutate(CB = case_when(Central_Bank %in% c(
"European Central Bank") ~ "ECB",
Central_Bank =="Fed" ~ "Fed",
TRUE ~ "Other"))%>%
group_by(CB, date)%>%
summarise(index_sent_cb = mean(sent_bt_all,na.rm = TRUE),
index_stance_cb=mean(stance_bt_all,na.rm = TRUE))%>%
arrange(date)%>%ungroup()%>%
dplyr::rename(
sent = index_sent_cb,
stance = index_stance_cb
) %>%
pivot_wider(
id_cols = date,
names_from = CB, # "Developed", "Emerging"
values_from = c(sent, stance),
names_glue = "{.value}_{CB}", # sent_Developed, stance_Developed, etc.
values_fill = list(sent = 0, stance = 0)
)
global_daily_fedecb <- bankday_all %>%
mutate(CB = case_when(Central_Bank %in% c(
"European Central Bank", "Fed") ~ "ECBFED",
TRUE ~ "nonECBFED"))%>%
group_by(CB, date)%>%
summarise(index_sent_cb = mean(sent_bt_all,na.rm = TRUE),
index_stance_cb=mean(stance_bt_all,na.rm = TRUE))%>%
arrange(date)%>%ungroup()%>%
dplyr::rename(
sent = index_sent_cb,
stance = index_stance_cb
) %>%
pivot_wider(
id_cols = date,
names_from = CB, # "Developed", "Emerging"
values_from = c(sent, stance),
names_glue = "{.value}_{CB}", # sent_Developed, stance_Developed, etc.
values_fill = list(sent = 0, stance = 0)
)
deveme_cb <- global_daily_deveme %>%
left_join(global_daily_decomposed, by="date")%>%
left_join(global_daily_fedecb, by="date")
Weekly
weekly_sentiment_plot <- cbdc_idx_weekly_labels%>%ggplot(aes(x=date_week, y=index_sent_global))+
geom_point()+geom_line(lwd=.5, lty=2)+labs(x="", y="Weekly Sentiment")
daily_sentiment_plot <- cbdc_idx_daily_labels%>%ggplot(aes(x=date, y=index_sent_global))+
geom_point(size=1)+geom_line(lwd=.5, lty=2)+labs(x="", y="Daily Sentiment")
daily_sentiment_plot/weekly_sentiment_plot
global_daily %>%
left_join(type_daily_sent_wide, by = "date") %>%
left_join(type_daily_stance_wide, by = "date") %>%
left_join(deveme_cb, by = "date") %>%
arrange(date) %>%
mutate(week = floor_date(date, unit = "week")) %>%
group_by(week) %>%
summarise(across(where(is.numeric), ~ mean(.x, na.rm = TRUE)), .groups = "drop") %>%
select(-speechday)%>%
tbl_summary(
type = list(
all_continuous() ~ "continuous2", # tous les continus
week ~ "continuous" # sauf week
),
statistic = list(
all_continuous() ~ c("{mean} ({sd})"),
week ~ "{min}, {max}" # seulement min/max pour week
),
label = week ~ "Week (min, max)"
)%>%
modify_footnote(everything() ~ NA_character_)
| Characteristic | N = 295 |
|---|---|
| Week (min, max) | 2016-02-28, 2025-06-15 |
| index_sent_global | |
| Mean (SD) | 0.33 (0.37) |
| index_stance_global | |
| Mean (SD) | 0.50 (0.38) |
| stance_auer | |
| Mean (SD) | 0.45 (0.63) |
| Unknown | 99 |
| sent_General.Unspecified | |
| Mean (SD) | 0.23 (0.38) |
| Unknown | 26 |
| sent_Retail.CBDC | |
| Mean (SD) | 0.30 (0.40) |
| Unknown | 73 |
| sent_Wholesale.CBDC | |
| Mean (SD) | 0.69 (0.40) |
| Unknown | 153 |
| stance_General.Unspecified | |
| Mean (SD) | 0.44 (0.40) |
| Unknown | 26 |
| stance_Retail.CBDC | |
| Mean (SD) | 0.44 (0.45) |
| Unknown | 73 |
| stance_Wholesale.CBDC | |
| Mean (SD) | 0.78 (0.36) |
| Unknown | 153 |
| sent_Developed | |
| Mean (SD) | 0.20 (0.30) |
| sent_Emerging | |
| Mean (SD) | 0.16 (0.30) |
| stance_Developed | |
| Mean (SD) | 0.33 (0.34) |
| stance_Emerging | |
| Mean (SD) | 0.21 (0.34) |
| sent_Other | |
| Mean (SD) | 0.19 (0.31) |
| sent_ECB | |
| Mean (SD) | 0.18 (0.29) |
| sent_Fed | |
| Mean (SD) | -0.0032 (0.0580) |
| stance_Other | |
| Mean (SD) | 0.28 (0.35) |
| stance_ECB | |
| Mean (SD) | 0.27 (0.33) |
| stance_Fed | |
| Mean (SD) | 0.011 (0.083) |
| sent_nonECBFED | |
| Mean (SD) | 0.19 (0.31) |
| sent_ECBFED | |
| Mean (SD) | 0.17 (0.30) |
| stance_nonECBFED | |
| Mean (SD) | 0.28 (0.35) |
| stance_ECBFED | |
| Mean (SD) | 0.27 (0.33) |
panel_artemis_trimmed %>%
select(Date, supply, stablecoin)%>%
tbl_summary(by=stablecoin,
type = list(
all_continuous() ~ "continuous2", # tous les continus
Date ~ "continuous" # sauf week
),
statistic = list(
all_continuous() ~ c("{mean} ({sd})"),
Date ~ "{min}, {max}" # seulement min/max pour week
),
label = Date ~ "Date (min, max)"
)%>%
modify_footnote(everything() ~ NA_character_)
| Characteristic | AYSD N = 391 |
BUSD N = 340 |
cEUR N = 1,401 |
cUSD N = 47 |
DAI N = 1,944 |
EURC N = 1,069 |
FDUSD N = 727 |
PYUSD N = 694 |
USD0 N = 372 |
USDC N = 2,296 |
USDe N = 588 |
USDGLO N = 546 |
USDP N = 2,310 |
USDS N = 321 |
USDT N = 2,825 |
USDY N = 584 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Date (min, max) | 2024-08-05, 2025-10-21 | 2024-08-31, 2025-10-21 | 2021-07-11, 2025-10-21 | 2025-08-29, 2025-10-21 | 2019-11-23, 2025-10-21 | 2022-07-09, 2025-10-21 | 2023-08-05, 2025-10-21 | 2023-09-09, 2025-10-21 | 2024-08-28, 2025-10-21 | 2018-10-17, 2025-10-21 | 2024-01-05, 2025-10-19 | 2024-02-01, 2025-10-21 | 2018-10-10, 2025-10-21 | 2024-10-26, 2025-10-21 | 2015-12-08, 2025-10-21 | 2024-01-05, 2025-10-21 |
| supply | ||||||||||||||||
| Mean (SD) | 70,719,608 (68,990,092) | 337,130,067 (25,003,950) | 18,296,966 (13,327,185) | 146,370,152 (69,792,967) | 4,448,341,212 (2,356,732,077) | 84,686,832 (66,646,634) | 1,868,248,233 (913,223,249) | 626,776,286 (484,825,385) | 671,778,959 (341,271,342) | 28,755,546,082 (21,595,129,898) | 4,822,102,281 (3,431,221,409) | 3,093,883 (644,218) | 463,487,550 (374,289,377) | 7,149,699,496 (1,069,000,697) | 57,454,318,058 (52,167,651,561) | 374,343,880 (210,577,377) |
data_artemis <-panel_artemis_trimmed%>%
left_join(cbdc_idx_daily_labels, by=c("Date"="date"))%>%
mutate(quarteryear = paste0(quarter(Date), year(Date) ))%>%
left_join(GPR, by=c("Date"="date"))%>%
left_join(vix_data, by=c("Date"="date"))%>%
arrange(stablecoin, Date)%>%
mutate(FTX = ifelse(Date > as.Date("2022-11-01"),1,0 ))%>%
mutate(Luna = ifelse(Date > as.Date("2022-05-01"),1,0 ))%>%
mutate(pegType = case_when(
stablecoin == "USDT"~ "USD",
stablecoin == "USDP"~ "USD",
stablecoin == "USDC"~ "USD",
stablecoin == "DAI"~ "USD",
stablecoin == "cEUR"~ "EUR",
stablecoin == "EURC"~ "EUR",
stablecoin == "FDUSD"~ "USD",
stablecoin == "PYUSD"~ "USD",
stablecoin == "USDY"~ "USD",
stablecoin == "USDe"~ "USD",
stablecoin == "USDGLO"~ "USD",
stablecoin == "AYSD"~ "USD",
stablecoin == "BUSD"~ "USD",
stablecoin == "USD0"~ "USD",
stablecoin == "USDS"~ "USD",
stablecoin == "cUSD"~ "USD"
))%>%
mutate(pegMechanism = case_when(
stablecoin == "USDT"~ "fiat",
stablecoin == "USDP"~ "fiat",
stablecoin == "USDC"~ "fiat",
stablecoin == "DAI"~ "crypto",
stablecoin == "cEUR"~ "algo",
stablecoin == "EURC"~ "fiat",
stablecoin == "FDUSD"~ "fiat",
stablecoin == "PYUSD"~ "fiat",
stablecoin == "USDY"~ "fiat",
stablecoin == "USDe"~ "fiat",
stablecoin == "USDGLO"~ "fiat",
stablecoin == "AYSD"~ "fiat",
stablecoin == "BUSD"~ "fiat",
stablecoin == "USD0"~ "fiat",
stablecoin == "USDS"~ "fiat",
stablecoin == "cUSD"~ "fiat"
))%>%
mutate(across(-Date, ~ tidyr::replace_na(.x, 0)))%>% # remove this to replace 0 with NA when there's no speech
rename_with(~ gsub("\\.", "_", .x))
data_artemis_weekly <-panel_artemis_trimmed_weekly%>%
left_join(cbdc_idx_weekly_labels, by=c("week"="date_week"))%>%
mutate(quarteryear = paste0(quarter(week), year(week) ))%>%
left_join(vix_data_weekly, by="week")%>%
left_join(GPR_data_weekly, by="week")%>%
arrange(stablecoin, week)%>%
dplyr::select(stablecoin, week,everything())%>%
#na.omit()%>%
mutate(FTX = ifelse(week > as.Date("2022-11-01"),1,0 ))%>%
mutate(Luna = ifelse(week > as.Date("2022-05-01"),1,0 ))%>%
arrange(stablecoin, week)%>%
mutate(pegType = case_when(
stablecoin == "USDT"~ "USD",
stablecoin == "USDP"~ "USD",
stablecoin == "USDC"~ "USD",
stablecoin == "DAI"~ "USD",
stablecoin == "cEUR"~ "EUR",
stablecoin == "EURC"~ "EUR",
stablecoin == "FDUSD"~ "USD",
stablecoin == "PYUSD"~ "USD",
stablecoin == "USDY"~ "USD",
stablecoin == "USDe"~ "USD",
stablecoin == "USDGLO"~ "USD",
stablecoin == "AYSD"~ "USD",
stablecoin == "BUSD"~ "USD",
stablecoin == "USD0"~ "USD",
stablecoin == "USDS"~ "USD",
stablecoin == "cUSD"~ "USD"
))%>%
mutate(pegMechanism = case_when(
stablecoin == "USDT"~ "fiat",
stablecoin == "USDP"~ "fiat",
stablecoin == "USDC"~ "fiat",
stablecoin == "DAI"~ "crypto",
stablecoin == "cEUR"~ "algo",
stablecoin == "EURC"~ "fiat",
stablecoin == "FDUSD"~ "fiat",
stablecoin == "PYUSD"~ "fiat",
stablecoin == "USDY"~ "fiat",
stablecoin == "USDe"~ "fiat",
stablecoin == "USDGLO"~ "fiat",
stablecoin == "AYSD"~ "fiat",
stablecoin == "BUSD"~ "fiat",
stablecoin == "USD0"~ "fiat",
stablecoin == "USDS"~ "fiat",
stablecoin == "cUSD"~ "fiat"
))%>%
mutate(across(-stablecoin, ~ tidyr::replace_na(.x, 0)))%>%# remove this to replace 0 with NA when there's no speech
rename_with(~ gsub("\\.", "_", .x))
library(haven)
#haven::write_dta(data_artemis, "C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/data_artemis.dta")
#haven::write_dta(data_artemis_weekly, "C:/users/fkraus/Desktop/Articles/effects of CB speeches on stablecoins/2025/data_artemis_weekly.dta")
data_artemis_weekly
\[
Y_{i,t+h}-Y_{i,t-1}= \alpha_i+ \alpha_q + \beta^h \Delta X_t + \gamma
Z_t + \mu_{i,t}
\] Where \(Y\) is the
log-difference of stablecoin supply, \(\alpha_i\) is an individual FE, and \(X_t\) is our index of speech CBDC-related
sentiment/stance. \(Z_t\) are control
variables representing the VIX and the GPRD and their lags, and dummies
representing Terra-Luna and FTX crashes. We include individual (\(\alpha_i\)) and quarter-year (\(\alpha_q\)) fixed-effects.
Note : we take the 90% interval confidences for all estimations.
Standard errors are heteroskedasticity robusts (clusterized by
stablecoin). Data are in weekly frequencies.
IRFs Effect of sentiment/stance shocks on the log-difference supply (from Artemis.xyz).