我正在使用FinCal包及其赔率建立净现值(NPV)图。对于NPV,现金流量使用销售的三角分布,成本的正态分布等进行模拟。所以,这是我正在做的事情的片段:
npvCdf <- function(n) {
N <- sort(n)
P <- ecdf(N)
return(P)
}
makePlot <- function(C, m) {
N <- m$NPV / C$MILLION
P <- npvCdf(N)
#
# NPV distribution curve
n <- sort(N)
p <- P(n) * 100
df <- data.frame(npv = n, odds = p)
#
# Points of interest
o <- C$NPV_BREAK_EVEN_WORST_ODDS
q <- round((quantile(n, o)), C$DIGITS)
e <- C$NPV_BREAK_EVEN_VALUE
b <- P(e) * 100 # THIS IS THE ERROR I CANT FIGURE OUT
w <- o * 100
s <- getBreakEven(C, m)
#
# Labels
npvOdds <- paste("Odds of break-even : ", b, "%")
salesThresh <- paste("Sales threshold : ", s)
worstCase <-
paste("Worst case (@ 5% odds) : ", q, "million")
#
# Make plot
#
g <- ggplot(df, aes(x = npv, y = odds)) +
geom_line(colour = "blue") +
labs(title = "NPV and Odds") +
labs(x = "NPV (million)") +
labs(y = "Percent (%)") +
geom_vline(xintercept = e,
colour = "red",
linetype = "longdash") +
geom_hline(yintercept = b,
colour = "green",
linetype = "longdash") +
geom_vline(xintercept = q,
colour = "green",
linetype = "dotdash") +
geom_hline(yintercept = w,
colour = "red",
linetype = "dotdash")
C
是所有常数的数据框,用于计算现金流量,NPV计算等。例如,C$MILLION=1000000
用于划分NPV以便更简单地表示。 m
是每个模拟的销售,现金流量和净现值的数据框架。模拟用于现金流量(三角分布),可变成本(正态分布)等。
而且,这是使用上述代码段的Shiny代码。
library(shiny)
source("../npd-c.R")
# Define server logic
shinyServer(function(input, output) {
output$npdPlot <- renderPlot({
C <- data.frame(2017,5000,1000000,3,100,500000,0.0,0.05,0.1,
input$salesRange[1],
input$salesRange[2],
input$salesMode,
input$demDeclMean,
input$demDeclSd,
input$varCostMean,
input$varCostSd,
input$fixedCostRange[1],
input$fixedCostRange[2]
)
names(C) <-
c(
"SEED",
"ITERATIONS",
"MILLION",
"DIGITS",
"PRICE",
"OUTLAY",
"NPV_BREAK_EVEN_VALUE",
"NPV_BREAK_EVEN_WORST_ODDS",
"HURDLE_RATE",
"SALES_TRIANG_MIN",
"SALES_TRIANG_MAX",
"SALES_TRIANG_MODE",
"DEM_DECL_FACTOR_MEAN",
"DEM_DECL_FACTOR_SD",
"VAR_COST_RATE_MEAN",
"VAR_COST_RATE_SD",
"FIX_COST_RATE_MIN",
"FIX_COST_RATE_MAX"
)
n <- npd(C,-1)
g <- makePlot(C,n)
g
})
})
问题如下。
在R中运行相同的代码时,我根据NPV曲线,水平线和垂直线获得正确的图。然而,当作为Shiny应用程序运行时,水平和垂直线都会发生巨大的位移。尽管如此,将NPV和现金流代码分配到单独的.R文件中,并且为Shiny和非闪亮版本设置相同的种子值。例如,P(0)=40.07
没有Shiny,P(0)=4.7
有Shiny应用程序。
我错过了什么?
答案 0 :(得分:0)
首先,让我说这是非常有用的代码。这是使用NPV进行蒙特卡罗模拟的一个很好的代表,我喜欢这些情节。这是一篇我非常肯定会回顾的帖子。
我认为我看到问题出在哪里,基本上更多的是误解和一个小的编程错误。
所述的问题是这些图表虽然应该是显示相同的结果。蓝色ecdf-NPV曲线看起来乍一看是相同的:
闪亮版:
独立版本:
然而,如果你仔细观察,你会发现它们实际上并不相同,第一种情况下的预期NPV值(50%)约为150万,而第二种情况下仅为0.2左右。 / p>
曲线看起来一样,但它们不是。另一点是,其中一个计算中存在错误,进一步混淆了事情。 &#34;盈亏平衡的几率&#34;计算错误,实际上是&#34;赔钱的几率&#34;。
正确的计算应该是:
b <- (1-P(e)) * 100
在第一种情况下,正确的破损几率约为60%,在第二种情况下约为95%,这与预期的NPV相符。