Created
November 13, 2015 22:58
-
-
Save alexchinco/5ac0fee035c198363c5c to your computer and use it in GitHub Desktop.
Code to solve for the equilibrium parameters in the Kyle (1989) model
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## Prep workspace | |
options(width=120, digits=6, digits.secs=6) | |
rm(list=ls()) | |
library(foreign) | |
library(grid) | |
library(plyr) | |
library(ggplot2) | |
library(tikzDevice) | |
print(options('tikzLatexPackages')) | |
options(tikzLatexPackages = | |
c("\\usepackage{tikz}\n", | |
"\\usepackage[active,tightpage,psfixbb]{preview}\n", | |
"\\PreviewEnvironment{pgfpicture}\n", | |
"\\setlength\\PreviewBorder{0pt}\n", | |
"\\usepackage{amsmath}\n", | |
"\\usepackage{pxfonts}\n", | |
"\\usepackage{bm}\n", | |
"\\usepackage{xfrac}\n" | |
) | |
) | |
setTikzDefaults(overwrite = FALSE) | |
print(options('tikzLatexPackages')) | |
library(reshape) | |
library(vars) | |
library(scales) | |
library(zoo) | |
library(splines) | |
library(MASS) | |
library(wmtsa) | |
library(foreach) | |
library(doMC) | |
registerDoMC(7) | |
## Define directories | |
scl.str.DAT_DIR <- "~/Dropbox/research/fast_trading_priced_noise/data/" | |
scl.str.FIG_DIR <- "~/Dropbox/research/fast_trading_priced_noise/figures/" | |
## Define global parameters | |
set.seed(123456) | |
scl.flt.RHO <- 1 | |
scl.int.N <- 2 | |
scl.int.M <- 1 | |
scl.flt.TAU_E <- scl.int.N | |
scl.flt.TAU_V <- 1 | |
vec.flt.TAU_Z <- seq(0.01, 2, by = 0.01) | |
## Define equlibrium functions | |
fun.VARPHI_I <- function(N, GAMMA_I, TAU_Z, TAU_E) { | |
OUT <- (N - 1) * GAMMA_I^2 / ((N - 1) * GAMMA_I^2 + TAU_E/TAU_Z) | |
return(OUT) | |
} | |
fun.VARPHI_U <- function(N, GAMMA_I, TAU_Z, TAU_E) { | |
OUT <- N * GAMMA_I^2 / (N * GAMMA_I^2 + TAU_E/TAU_Z) | |
return(OUT) | |
} | |
fun.TAU_I <- function(TAU_V, TAU_E, VARPHI_I, N) { | |
OUT <- TAU_V + TAU_E + VARPHI_I * (N - 1) * TAU_E | |
return(OUT) | |
} | |
fun.TAU_U <- function(TAU_V, TAU_E, VARPHI_U, N) { | |
OUT <- TAU_V + VARPHI_U * N * TAU_E | |
return(OUT) | |
} | |
## Define error functions | |
fun.OBJECTIVE <- function(ARGS, VAL) { | |
GAMMA_I <- ARGS[1] | |
ZETA <- ARGS[2] | |
XI_I <- ARGS[3] | |
XI_U <- ARGS[4] | |
RHO <- VAL[1] | |
TAU_V <- VAL[2] | |
TAU_Z <- VAL[3] | |
TAU_E <- VAL[4] | |
N <- VAL[5] | |
M <- VAL[6] | |
VARPHI_I <- fun.VARPHI_I(N, GAMMA_I, TAU_Z, TAU_E) | |
VARPHI_U <- fun.VARPHI_U(N, GAMMA_I, TAU_Z, TAU_E) | |
TAU_I <- fun.TAU_I(TAU_V, TAU_E, VARPHI_I, N) | |
TAU_U <- fun.TAU_U(TAU_V, TAU_E, VARPHI_U, N) | |
EQN1_ERR <- 1 - (N * XI_I + M * XI_U) | |
EQN2_ERR <- (1 - ZETA) - ((1 - VARPHI_I) * (1 - XI_I)) | |
EQN3_ERR <- (RHO * GAMMA_I/TAU_E) - ((1 - VARPHI_I) * (1 - 2 * ZETA) / (1 - ZETA)) | |
EQN4_ERR <- ((XI_U * ZETA * TAU_U/(1 - XI_U)) + (XI_U * RHO * GAMMA_I * TAU_I)/TAU_E) - (ZETA * TAU_U - VARPHI_U * TAU_I) | |
ERROR <- sum(c(EQN1_ERR^2, EQN2_ERR^2, EQN3_ERR^2, EQN4_ERR^2)) | |
if (XI_I < VARPHI_U/N) { | |
ERROR <- ERROR + 100 | |
} | |
if (XI_U > (1 - VARPHI_U)/M) { | |
ERROR <- ERROR + 100 | |
} | |
LAM <- ZETA * TAU_E / (TAU_I * GAMMA_I) | |
if ((VARPHI_U * TAU_E) / (GAMMA_I * TAU_U * LAM) > 1) { | |
ERROR <- ERROR + 100 | |
} | |
return(ERROR) | |
} | |
## Estimate equilibrium parameters | |
if (TRUE == TRUE) { | |
scl.int.TAU_Z_LEN <- length(vec.flt.TAU_Z) | |
mat.flt.COEF <- foreach(z=1:scl.int.TAU_Z_LEN, .combine = "rbind", .inorder = FALSE) %dopar% { | |
print(z) | |
vec.flt.VAL <- c(scl.flt.RHO, | |
scl.flt.TAU_V, | |
vec.flt.TAU_Z[z], | |
scl.flt.TAU_E, | |
scl.int.N, | |
scl.int.M | |
) | |
vec.flt.PAR <- c(1, 1/4, 1/6, 1/3) | |
obj.opt.OUT <- optim(par = vec.flt.PAR, | |
fn = fun.OBJECTIVE, | |
method = "L-BFGS-B", | |
lower = c(0, 0, 0, 0), | |
upper = c(Inf, 1/2, 1/scl.int.N, Inf), | |
VAL = vec.flt.VAL | |
) | |
vec.flt.OUT <- c(vec.flt.TAU_Z[z], obj.opt.OUT$par, obj.opt.OUT$value, obj.opt.OUT$convergence) | |
return(as.numeric(vec.flt.OUT)) | |
} | |
mat.df.COEF <- as.data.frame(mat.flt.COEF) | |
names(mat.df.COEF) <- c("tauZ", "gamI", "zet", "xiI", "xiU", "err", "fit") | |
mat.df.COEF$varphiI <- fun.VARPHI_I(scl.int.N, mat.df.COEF$gamI, mat.df.COEF$tauZ, scl.flt.TAU_E) | |
mat.df.COEF$varphiU <- fun.VARPHI_U(scl.int.N, mat.df.COEF$gamI, mat.df.COEF$tauZ, scl.flt.TAU_E) | |
mat.df.COEF$tauI <- fun.TAU_I(scl.flt.TAU_V, scl.flt.TAU_E, mat.df.COEF$varphiI, scl.int.N) | |
mat.df.COEF$tauU <- fun.TAU_U(scl.flt.TAU_V, scl.flt.TAU_E, mat.df.COEF$varphiU, scl.int.N) | |
mat.df.COEF$lam <- mat.df.COEF$zet * scl.flt.TAU_E / (mat.df.COEF$tauI * mat.df.COEF$gamI) | |
mat.df.COEF$betI <- mat.df.COEF$xiI/mat.df.COEF$lam | |
mat.df.COEF$betU <- mat.df.COEF$xiU/mat.df.COEF$lam | |
mat.df.COEF$lamI <- 1/((scl.int.N - 1) * mat.df.COEF$betI + scl.int.M * mat.df.COEF$betU) | |
mat.df.COEF$lamU <- 1/(scl.int.N * mat.df.COEF$betI + (scl.int.M - 1) * mat.df.COEF$betU) | |
mat.df.COEF$muI <- 0 | |
mat.df.COEF$muU <- 0 | |
mat.df.COEF$tet <- (mat.df.COEF$varphiU * scl.flt.TAU_E) / (mat.df.COEF$gamI * mat.df.COEF$tauU * mat.df.COEF$lam) | |
save(mat.df.COEF, file = paste(scl.str.DAT_DIR, "data--kyle-1989-coef--12nov2015.Rdata")) | |
} | |
load(file = paste(scl.str.DAT_DIR, "data--kyle-1989-coef--12nov2015.Rdata")) | |
## Plot endogenous parameters | |
if (TRUE == TRUE) { | |
mat.df.PLOT <- mat.df.COEF[, c("tauZ", "gamI", "zet", "xiI", "xiU")] | |
names(mat.df.PLOT) <- c("tauZ", | |
"$\\gamma_I$", | |
"$\\zeta$", | |
"$\\xi_I$", | |
"$\\xi_U$" | |
) | |
mat.df.PLOT <- melt(mat.df.PLOT, c("tauZ")) | |
theme_set(theme_bw()) | |
scl.str.RAW_FILE <- "plot--kyle-1989-model-solution--endogenous-param--12nov2015" | |
scl.str.TEX_FILE <- paste(scl.str.RAW_FILE,'.tex',sep='') | |
scl.str.PDF_FILE <- paste(scl.str.RAW_FILE,'.pdf',sep='') | |
scl.str.AUX_FILE <- paste(scl.str.RAW_FILE,'.aux',sep='') | |
scl.str.LOG_FILE <- paste(scl.str.RAW_FILE,'.log',sep='') | |
tikz(file = scl.str.TEX_FILE, height = 2.25, width = 7, standAlone=TRUE) | |
obj.gg2.PLOT <- ggplot() | |
obj.gg2.PLOT <- obj.gg2.PLOT + scale_colour_brewer(palette="Set1") | |
obj.gg2.PLOT <- obj.gg2.PLOT + geom_path(data = mat.df.PLOT, | |
aes(x = tauZ, | |
y = value | |
), | |
size = 1.25, | |
alpha = 0.50 | |
) | |
obj.gg2.PLOT <- obj.gg2.PLOT + xlab("$\\tau_z$") | |
obj.gg2.PLOT <- obj.gg2.PLOT + ylab("") | |
obj.gg2.PLOT <- obj.gg2.PLOT + scale_x_continuous(limits = c(0, 2.0), breaks = c(0.00, 0.50, 1.00, 1.50, 2.00)) | |
obj.gg2.PLOT <- obj.gg2.PLOT + facet_wrap(~ variable, nrow = 1, scales = "free_y") | |
obj.gg2.PLOT <- obj.gg2.PLOT + theme(plot.margin = unit(c(1,0.15,0.15,-1), "lines"), | |
axis.text = element_text(size = 8), | |
axis.title = element_text(size = 10), | |
plot.title = element_text(vjust = 1.75), | |
panel.grid.minor = element_blank(), | |
legend.position = "none" | |
) | |
obj.gg2.PLOT <- obj.gg2.PLOT + ggtitle("Endogenous Parameters") | |
print(obj.gg2.PLOT) | |
dev.off() | |
system(paste('lualatex', file.path(scl.str.TEX_FILE)), ignore.stdout = TRUE) | |
system(paste('rm ', scl.str.TEX_FILE, sep = '')) | |
system(paste('mv ', scl.str.PDF_FILE, ' ', scl.str.FIG_DIR, sep = '')) | |
system(paste('rm ', scl.str.AUX_FILE, sep = '')) | |
system(paste('rm ', scl.str.LOG_FILE, sep = '')) | |
} | |
## Plot price-impact coefficients | |
if (TRUE == TRUE) { | |
mat.df.PLOT <- mat.df.COEF[, c("tauZ", "lam", "lamI", "lamU", "tet")] | |
names(mat.df.PLOT) <- c("tauZ", | |
"$\\lambda$", | |
"$\\lambda_I$", | |
"$\\lambda_U$", | |
"$\\theta$" | |
) | |
mat.df.PLOT <- melt(mat.df.PLOT, c("tauZ")) | |
theme_set(theme_bw()) | |
scl.str.RAW_FILE <- "plot--kyle-1989-model-solution--price-impact-coef--12nov2015" | |
scl.str.TEX_FILE <- paste(scl.str.RAW_FILE,'.tex',sep='') | |
scl.str.PDF_FILE <- paste(scl.str.RAW_FILE,'.pdf',sep='') | |
scl.str.AUX_FILE <- paste(scl.str.RAW_FILE,'.aux',sep='') | |
scl.str.LOG_FILE <- paste(scl.str.RAW_FILE,'.log',sep='') | |
tikz(file = scl.str.TEX_FILE, height = 2.25, width = 7, standAlone=TRUE) | |
obj.gg2.PLOT <- ggplot() | |
obj.gg2.PLOT <- obj.gg2.PLOT + scale_colour_brewer(palette="Set1") | |
obj.gg2.PLOT <- obj.gg2.PLOT + geom_path(data = mat.df.PLOT, | |
aes(x = tauZ, | |
y = value | |
), | |
size = 1.25, | |
alpha = 0.50 | |
) | |
obj.gg2.PLOT <- obj.gg2.PLOT + xlab("$\\tau_z$") | |
obj.gg2.PLOT <- obj.gg2.PLOT + ylab("") | |
obj.gg2.PLOT <- obj.gg2.PLOT + scale_x_continuous(limits = c(0, 2.0), breaks = c(0.00, 0.50, 1.00, 1.50, 2.00)) | |
obj.gg2.PLOT <- obj.gg2.PLOT + facet_wrap(~ variable, nrow = 1, scales = "free_y") | |
obj.gg2.PLOT <- obj.gg2.PLOT + theme(plot.margin = unit(c(1,0.15,0.15,-1), "lines"), | |
axis.text = element_text(size = 8), | |
axis.title = element_text(size = 10), | |
plot.title = element_text(vjust = 1.75), | |
panel.grid.minor = element_blank(), | |
legend.position = "none" | |
) | |
obj.gg2.PLOT <- obj.gg2.PLOT + ggtitle("Price-Impact Coefficients") | |
print(obj.gg2.PLOT) | |
dev.off() | |
system(paste('lualatex', file.path(scl.str.TEX_FILE)), ignore.stdout = TRUE) | |
system(paste('rm ', scl.str.TEX_FILE, sep = '')) | |
system(paste('mv ', scl.str.PDF_FILE, ' ', scl.str.FIG_DIR, sep = '')) | |
system(paste('rm ', scl.str.AUX_FILE, sep = '')) | |
system(paste('rm ', scl.str.LOG_FILE, sep = '')) | |
} | |
## Plot price-impact coefficients | |
if (TRUE == TRUE) { | |
mat.df.PLOT <- mat.df.COEF[, c("tauZ", "tauI", "tauU", "varphiI", "varphiU")] | |
names(mat.df.PLOT) <- c("tauZ", | |
"$\\tau_I$", | |
"$\\tau_U$", | |
"$\\varphi_I$", | |
"$\\varphi_U$" | |
) | |
mat.df.PLOT <- melt(mat.df.PLOT, c("tauZ")) | |
theme_set(theme_bw()) | |
scl.str.RAW_FILE <- "plot--kyle-1989-model-solution--information-efficiency-parameters--12nov2015" | |
scl.str.TEX_FILE <- paste(scl.str.RAW_FILE,'.tex',sep='') | |
scl.str.PDF_FILE <- paste(scl.str.RAW_FILE,'.pdf',sep='') | |
scl.str.AUX_FILE <- paste(scl.str.RAW_FILE,'.aux',sep='') | |
scl.str.LOG_FILE <- paste(scl.str.RAW_FILE,'.log',sep='') | |
tikz(file = scl.str.TEX_FILE, height = 2.25, width = 7, standAlone=TRUE) | |
obj.gg2.PLOT <- ggplot() | |
obj.gg2.PLOT <- obj.gg2.PLOT + scale_colour_brewer(palette="Set1") | |
obj.gg2.PLOT <- obj.gg2.PLOT + geom_path(data = mat.df.PLOT, | |
aes(x = tauZ, | |
y = value | |
), | |
size = 1.25, | |
alpha = 0.50 | |
) | |
obj.gg2.PLOT <- obj.gg2.PLOT + xlab("$\\tau_z$") | |
obj.gg2.PLOT <- obj.gg2.PLOT + ylab("") | |
obj.gg2.PLOT <- obj.gg2.PLOT + scale_x_continuous(limits = c(0, 2.0), breaks = c(0.00, 0.50, 1.00, 1.50, 2.00)) | |
obj.gg2.PLOT <- obj.gg2.PLOT + facet_wrap(~ variable, nrow = 1, scales = "free_y") | |
obj.gg2.PLOT <- obj.gg2.PLOT + theme(plot.margin = unit(c(1,0.15,0.15,-1), "lines"), | |
axis.text = element_text(size = 8), | |
axis.title = element_text(size = 10), | |
plot.title = element_text(vjust = 1.75), | |
panel.grid.minor = element_blank(), | |
legend.position = "none" | |
) | |
obj.gg2.PLOT <- obj.gg2.PLOT + ggtitle("Information-Efficiency Parameters") | |
print(obj.gg2.PLOT) | |
dev.off() | |
system(paste('lualatex', file.path(scl.str.TEX_FILE)), ignore.stdout = TRUE) | |
system(paste('rm ', scl.str.TEX_FILE, sep = '')) | |
system(paste('mv ', scl.str.PDF_FILE, ' ', scl.str.FIG_DIR, sep = '')) | |
system(paste('rm ', scl.str.AUX_FILE, sep = '')) | |
system(paste('rm ', scl.str.LOG_FILE, sep = '')) | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment