Research Methods in
Finance
Mini Project
Mini Project
Instructor: Dr. Nguyen Phuong Anh
1 Group Members
- Nguyen Minh Quan - MAMAIU19036
- Lam Hue Dung - MAMAIU18060
2 Libraries
library(e1071)
library(ggplot2)
library(VNDS) # reference: https://github.com/phamdinhkhanh/VNDS
library(tidyverse)
library(tidyquant)
library(gmm)
library(car)3 Example 1
set.seed(123456)
mu = 5; var = 20 # true parameters
data = rnorm(1000, mean = mu, sd = sqrt(var)) # generate sample
# MM estimates 1
mu_hat = moment(data, order = 1)
var_hat = moment(data, order = 2) - mu_hat ^ 2
c(mu_hat, var_hat)## [1] 5.048538 19.657945
# MM estimates 2 (same mean, different variance)
var_hat = (moment(data, order = 3) - mu_hat ^ 3) / (3 * mu_hat)
var_hat## [1] 19.09963
# compare estimation emphirical distributions
var_MM1 = var_MM2 = NULL
for (i in 1:10000) {
data = rnorm(1000, mean = mu, sd = sqrt(var))
mu_hat = moment(data, order = 1)
var_hat1 = moment(data, order = 2) - mu_hat ^ 2
var_MM1 = c(var_MM1, var_hat1)
var_hat2 = (moment(data, order = 3) - mu_hat ^ 3) / (3 * mu_hat)
var_MM2 = c(var_MM2, var_hat2)
}
df = data.frame(var_MM1, var_MM2)
ggplot(df, aes(x = var_MM1, y = var_MM2)) +
geom_point(alpha = 0.5, size = 0.5) +
geom_abline(slope = 1, intercept = 0, color = 'red')4 Crawl & Visualise Data
# Crawl Stock Prices
symbols = c('VCB', 'CTG', 'TCB', 'BID', 'MBB',
'VPB', 'ACB', 'TPB', 'SHB', 'EIB')
df_data = VNDS::tq_bigquery(symbols = symbols, from = '2017-01-01',
to = '2022-01-01', src = 'CAFEF')
stocks = NULL
for (i in (1:length(symbols))) {
df_temp = as.data.frame(df_data[i])
colnames(df_temp) = c('date', 'open', 'high', 'low',
'close', 'volume', 'adjusted')
df_temp$symbol = symbols[i]
stocks = rbind(stocks, df_temp)
}# Crawl VN-INDEX
vnindex = VNDS::tq_get(symbol = 'VNINDEX', from = '2017-01-01',
to = '2022-01-01', src = 'CAFEF')# Calculate Excess Daily Returns
data = head(vnindex, 900)[c('date', 'close')]
data$rm = c(rev(diff(log(rev(data$close)))), NA)
data$erm = data$rm - 0.0205
for (i in (1:length(symbols))) {
temp = head((stocks %>% filter(symbol == symbols[i])), 900)$adjusted
data[paste('er', symbols[i], sep = '')] = c(rev(diff(log(rev(temp)))) - 0.0205, NA)
}
data = subset(data, select = -c(2, 3))
data = as.data.frame(head(data, 899))
data = data %>% filter(erm > -0.2 & erm < 0.2)
# Show Data
head(data)## date erm erVCB erCTG erTCB erBID
## 1 2021-12-31 -0.012249974 -0.015410930 -0.017545788 -0.006401076 0.026405149
## 2 2021-12-30 -0.020399051 -0.034433094 -0.030801784 -0.016434954 -0.014834262
## 3 2021-12-29 -0.026251288 -0.026769613 -0.013152428 -0.021517812 -0.020500000
## 4 2021-12-28 -0.016806063 -0.017996870 -0.005640886 -0.014377532 -0.023336881
## 5 2021-12-27 -0.012509155 -0.004075120 -0.005416758 -0.021523018 -0.011965098
## 6 2021-12-24 -0.006818758 0.005307884 0.001006205 0.011710577 -0.006111263
## erMBB erVPB erACB erTPB erSHB erEIB
## 1 -0.004806565 -0.009263927 -0.002955690 -0.01316500 0.02069576 -0.02346297
## 2 -0.015213644 -0.001967752 -0.017545788 -0.03511658 -0.02516201 -0.03226484
## 3 -0.020500000 -0.014727978 -0.016052254 -0.03728696 -0.02050000 -0.05780705
## 4 -0.015185550 -0.014694468 -0.005529661 0.01090355 -0.02050000 0.04197492
## 5 -0.020500000 -0.017584546 -0.015964845 0.01700440 -0.02050000 0.04613968
## 6 0.010160652 0.035028142 -0.005232528 0.04667469 0.04683312 0.04574939
# Excess Returns Plots
par(mfrow = c(3, 4))
for (i in (3:12)) {
plot(data[,2], data[,i], pch = 19, cex = .5,
xlab = '', ylab = '', main = symbols[i - 2])
}5 Approach 1
erm = as.matrix(data[, 2])
eri = as.matrix(data[, 3:12])
res1 = gmm(eri ~ erm, erm)
summary(res1) # model summary##
## Call:
## gmm(g = eri ~ erm, x = erm)
##
##
## Method: twoStep
##
## Kernel: Quadratic Spectral
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## erVCB_(Intercept) 1.7244e-03 9.2972e-04 1.8548e+00 6.3629e-02
## erCTG_(Intercept) 7.8892e-03 1.0870e-03 7.2577e+00 3.9381e-13
## erTCB_(Intercept) 5.8078e-03 1.0704e-03 5.4260e+00 5.7629e-08
## erBID_(Intercept) 8.5859e-03 1.0652e-03 8.0605e+00 7.6012e-16
## erMBB_(Intercept) 5.5229e-03 8.4424e-04 6.5418e+00 6.0774e-11
## erVPB_(Intercept) 6.4866e-03 1.3515e-03 4.7994e+00 1.5915e-06
## erACB_(Intercept) -9.8804e-03 1.8707e-03 -5.2818e+00 1.2792e-07
## erTPB_(Intercept) -1.0876e-02 2.3938e-03 -4.5434e+00 5.5346e-06
## erSHB_(Intercept) -1.6899e-02 2.2513e-03 -7.5067e+00 6.0643e-14
## erEIB_(Intercept) -1.3486e-02 1.6686e-03 -8.0819e+00 6.3765e-16
## erVCB_erm 1.0758e+00 4.3142e-02 2.4936e+01 3.0133e-137
## erCTG_erm 1.3926e+00 4.8498e-02 2.8714e+01 2.5537e-181
## erTCB_erm 1.2878e+00 4.6565e-02 2.7656e+01 2.3330e-168
## erBID_erm 1.4199e+00 4.8958e-02 2.9002e+01 6.2791e-185
## erMBB_erm 1.2622e+00 3.6227e-02 3.4841e+01 5.8861e-266
## erVPB_erm 1.3071e+00 5.6654e-02 2.3071e+01 8.9523e-118
## erACB_erm 4.8763e-01 8.9405e-02 5.4542e+00 4.9206e-08
## erTPB_erm 4.2616e-01 1.1102e-01 3.8386e+00 1.2372e-04
## erSHB_erm 9.4734e-02 1.0258e-01 9.2351e-01 3.5574e-01
## erEIB_erm 3.0588e-01 7.6856e-02 3.9800e+00 6.8919e-05
##
## J-Test: degrees of freedom is 0
## J-test P-value
## Test E(g)=0: 1.56991252868886e-27 *******
R = cbind(diag(10), matrix(0, 10, 10))
c = rep(0, 10)
linearHypothesis(res1, R, c, test = 'Chisq') # joint hypothesis## Linear hypothesis test
##
## Hypothesis:
## erVCB_((Intercept) = 0
## erCTG_((Intercept) = 0
## erTCB_((Intercept) = 0
## erBID_((Intercept) = 0
## erMBB_((Intercept) = 0
## erVPB_((Intercept) = 0
## erACB_((Intercept) = 0
## erTPB_((Intercept) = 0
## erSHB_((Intercept) = 0
## erEIB_((Intercept) = 0
##
## Model 1: restricted model
## Model 2: eri ~ erm
##
## Res.Df Df Chisq Pr(>Chisq)
## 1 905
## 2 895 10 288.44 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
6 Approach 2
res2 = gmm(eri ~ erm - 1, cbind(1, erm))
specTest(res2) # over-identifying restriction test##
## ## J-Test: degrees of freedom is 10 ##
##
## J-test P-value
## Test E(g)=0: 1.4682e+02 1.6775e-26