gemAssetPricing_PUF {GE} | R Documentation |
Compute Asset Market Equilibria with Portfolio Utility Functions for Some Simple Cases
Description
Compute the equilibrium of an asset market by the function sdm2 and by computing marginal utility of assets. The argument of the utility function used in the calculation is the asset vector (i.e. portfolio).
Usage
gemAssetPricing_PUF(S, uf, numeraire = nrow(S), ratio_adjust_coef = 0.1, ...)
Arguments
S |
an n-by-m supply matrix of assets. |
uf |
a portfolio utility function or a list of m portfolio utility functions. |
numeraire |
the index of the numeraire commodity. |
ratio_adjust_coef |
a scalar indicating the adjustment velocity of demand structure. |
... |
arguments to be passed to the function sdm2. |
Value
A general equilibrium containing a value marginal utility matrix (VMU).
References
Danthine, J. P., Donaldson, J. (2005, ISBN: 9780123693808) Intermediate Financial Theory. Elsevier Academic Press.
Sharpe, William F. (2008, ISBN: 9780691138503) Investors and Markets: Portfolio Choices, Asset Prices, and Investment Advice. Princeton University Press.
https://web.stanford.edu/~wfsharpe/apsim/index.html
See Also
Examples
#### an example of Danthine and Donaldson (2005, section 8.3).
ge <- gemAssetPricing_PUF(
S = matrix(c(
10, 5,
1, 4,
2, 6
), 3, 2, TRUE),
uf = function(x) 0.5 * x[1] + 0.9 * (1 / 3 * log(x[2]) + 2 / 3 * log(x[3])),
maxIteration = 1,
numberOfPeriods = 500,
ts = TRUE
)
matplot(ge$ts.p, type = "l")
ge$p
#### an example of Sharpe (2008, chapter 2, case 1)
asset1 <- c(1, 0, 0, 0, 0)
asset2 <- c(0, 1, 1, 1, 1)
asset3 <- c(0, 5, 3, 8, 4) - 3 * asset2
asset4 <- c(0, 3, 5, 4, 8) - 3 * asset2
# the unit asset payoff matrix
UAP <- cbind(asset1, asset2, asset3, asset4)
prob <- c(0.15, 0.25, 0.25, 0.35)
wt <- prop.table(c(1, 0.96 * prob)) # weights
ge <- gemAssetPricing_PUF(
S = matrix(c(
49, 49,
30, 30,
10, 0,
0, 10
), 4, 2, TRUE),
uf = list(
function(portfolio) CES(alpha = 1, beta = wt, x = UAP %*% portfolio, es = 1 / 1.5),
function(portfolio) CES(alpha = 1, beta = wt, x = UAP %*% portfolio, es = 1 / 2.5)
),
maxIteration = 1,
numberOfPeriods = 1000,
numeraire = 1,
ts = TRUE
)
matplot(ge$ts.p, type = "l")
ge$p
ge$p[3:4] + 3 * ge$p[2]
#### a 3-by-2 example of asset pricing with two heterogeneous agents who
## have different beliefs and predict different payoff vectors.
## the predicted payoff vectors of agent 1 on the two assets.
asset1.1 <- c(1, 2, 2, 0)
asset2.1 <- c(2, 2, 0, 2)
## the predicted payoff vectors of agent 2 on the two assets.
asset1.2 <- c(1, 0, 2, 0)
asset2.2 <- c(2, 1, 0, 2)
asset3 <- c(1, 1, 1, 1)
## the unit asset payoff matrix of agent 1.
UAP1 <- cbind(asset1.1, asset2.1, asset3)
## the unit asset payoff matrix of agent 2.
UAP2 <- cbind(asset1.2, asset2.2, asset3)
mp1 <- colMeans(UAP1)
Cov1 <- cov.wt(UAP1, method = "ML")$cov
mp2 <- colMeans(UAP2)
Cov2 <- cov.wt(UAP2, method = "ML")$cov
ge <- gemAssetPricing_PUF(
S = matrix(c(
1, 5,
2, 5,
3, 5
), 3, 2, TRUE),
uf = list(
# the utility function of agent 1.
function(x) AMSDP(x, mp1, Cov1, gamma = 0.2, theta = 2),
function(x) AMSDP(x, mp2, Cov2) # the utility function of agent 2
),
maxIteration = 1,
numberOfPeriods = 1000,
ts = TRUE
)
matplot(ge$ts.p, type = "l")
ge$p
ge$VMU
#### another 3-by-2 example.
asset1.1 <- c(0, 0, 1, 1, 2)
asset2.1 <- c(1, 2, 1, 2, 0)
asset3.1 <- c(1, 1, 1, 1, 1)
asset1.2 <- c(0, 0, 1, 2)
asset2.2 <- c(1, 2, 2, 1)
asset3.2 <- c(1, 1, 1, 1)
## the unit asset payoff matrix of agent 1.
UAP1 <- cbind(asset1.1, asset2.1, asset3.1)
## the unit asset payoff matrix of agent 2.
UAP2 <- cbind(asset1.2, asset2.2, asset3.2)
mp1 <- colMeans(UAP1)
Cov1 <- cov.wt(UAP1, method = "ML")$cov
mp2 <- colMeans(UAP2)
Cov2 <- cov.wt(UAP2, method = "ML")$cov
ge <- gemAssetPricing_PUF(
S = matrix(c(
1, 5,
2, 5,
3, 5
), 3, 2, TRUE),
uf = list(
function(x) AMSDP(x, mp1, Cov1), # the utility function of agent 1.
function(x) AMSDP(x, mp2, Cov2) # the utility function of agent 2.
),
maxIteration = 1,
numberOfPeriods = 3000,
ts = TRUE
)
ge$p
ge$D
#### a 5-by-3 example.
set.seed(1)
n <- 5 # the number of asset types
m <- 3 # the number of agents
Supply <- matrix(runif(n * m, 10, 100), n, m)
# the risk aversion coefficients of agents.
gamma <- runif(m, 0.25, 1)
# the predicted mean payoffs, which may be gross return rates, price indices or prices.
PMP <- matrix(runif(n * m, min = 0.8, max = 1.5), n, m)
# the predicted standard deviations of payoffs.
PSD <- matrix(runif(n * m, min = 0.01, max = 0.2), n, m)
PSD[n, ] <- 0
# Suppose the predicted payoff correlation matrices of agents are the same.
Cor <- cor(matrix(runif(2 * n^2), 2 * n, n))
Cor[, n] <- Cor[n, ] <- 0
Cor[n, n] <- 1
# the list of utility functions.
lst.uf <- list()
make.uf <- function(mp, Cov, gamma) {
force(mp)
force(Cov)
force(gamma)
function(x) {
AMSDP(x, mp = mp, Cov = Cov, gamma = gamma, theta = 1)
}
}
for (k in 1:m) {
sigma <- PSD[, k]
if (is.matrix(Cor)) {
Cov <- dg(sigma) %*% Cor %*% dg(sigma)
} else {
Cov <- dg(sigma) %*% Cor[[k]] %*% dg(sigma)
}
lst.uf[[k]] <- make.uf(mp = PMP[, k], Cov = Cov, gamma = gamma[k])
}
ge <- gemAssetPricing_PUF(
S = Supply, uf = lst.uf,
priceAdjustmentVelocity = 0.05,
policy = makePolicyMeanValue(100),
ts = TRUE,
tolCond = 1e-04
)
ge$p
round(addmargins(ge$D, 2), 3)
round(addmargins(ge$S, 2), 3)
ge$VMU
#### a 3-by-2 example.
asset1 <- c(1, 0, 0)
asset2 <- c(0, 0, 2)
asset3 <- c(0, 1, 1)
# the unit asset payoff matrix.
UAP <- cbind(asset1, asset2, asset3)
wt <- c(0.5, 0.25, 0.25) # weights
uf <- function(portfolio) {
payoff <- UAP %*% portfolio
prod(payoff^wt)
}
ge <- gemAssetPricing_PUF(
matrix(c(
1, 1,
1, 0,
0, 2
), 3, 2, TRUE),
uf = uf,
numeraire = 1
)
ge$p
ge$z
ge$A
addmargins(ge$D, 2)
addmargins(UAP %*% ge$D, 2)
ge$VMU
## a price-control stationary state.
pcss <- gemAssetPricing_PUF(
matrix(c(
1, 1,
1, 0,
0, 2
), 3, 2, TRUE),
uf = uf,
numeraire = 1,
pExg = c(1, 2, 1),
maxIteration = 1,
numberOfPeriods = 300,
ts = TRUE
)
matplot(pcss$ts.q, type = "l")
tail(pcss$ts.q, 3)
addmargins(round(pcss$D, 4), 2)
pcss$VMU
#### a 2-by-2 example with outside position.
asset1 <- c(1, 0, 0)
asset2 <- c(0, 1, 1)
# the unit asset payoff matrix
UAP <- cbind(asset1, asset2)
wt <- c(0.5, 0.25, 0.25) # weights
uf1 <- function(portfolio) prod((UAP %*% portfolio + c(0, 0, 2))^wt)
uf2 <- function(portfolio) prod((UAP %*% portfolio)^wt)
ge <- gemAssetPricing_PUF(
S = matrix(c(
1, 1,
0, 2
), 2, 2, TRUE),
uf = list(uf1, uf2),
numeraire = 1
)
ge$p
ge$z
uf1(ge$D[,1])
uf2(ge$D[,2])