Research Methods in Finance
Mini Project

Instructor: Dr. Nguyen Phuong Anh

1 Group Members

  1. Nguyen Minh Quan - MAMAIU19036
  2. 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