Spaces:
Sleeping
Sleeping
| # Required Packages | |
| if (!require(shiny)) install.packages("shiny") | |
| if (!require(ggplot2)) install.packages("ggplot2") | |
| library(shiny) | |
| library(ggplot2) | |
| # Vectorized Black-Scholes Call Option Formula | |
| bs_call_price_vec <- Vectorize(function(S, T, K, r, sigma){ | |
| d1 <- (log(S/K) + (r + 0.5*sigma^2)*T) / (sigma*sqrt(T)) | |
| d2 <- d1 - sigma*sqrt(T) | |
| S * pnorm(d1) - K * exp(-r*T) * pnorm(d2) | |
| }) | |
| # UI | |
| ui <- fluidPage( | |
| titlePanel("カーボンプライシング × ブラック=ショールズモデル (Shiny版)"), | |
| sidebarLayout( | |
| sidebarPanel( | |
| numericInput("S0", "初期カーボン価格 ($/t-CO2)", value = 50, min = 1, max = 200), | |
| numericInput("mu", "ドリフト (期待成長率)", value = 0.05, step = 0.01), | |
| numericInput("sigma", "ボラティリティ", value = 0.2, step = 0.01), | |
| numericInput("K", "行使価格 ($)", value = 55, min = 1), | |
| numericInput("r", "無リスク金利", value = 0.01, step = 0.005), | |
| sliderInput("T", "満期 (年)", min = 0.1, max = 2, value = 1, step = 0.1), | |
| actionButton("simulate", "シミュレーション開始") | |
| ), | |
| mainPanel( | |
| plotOutput("carbonPlot"), | |
| plotOutput("optionPlot") | |
| ) | |
| ) | |
| ) | |
| # Server | |
| server <- function(input, output) { | |
| observeEvent(input$simulate, { | |
| set.seed(123) | |
| steps <- 252 | |
| dt <- input$T / steps | |
| carbon_price <- numeric(steps + 1) | |
| carbon_price[1] <- input$S0 | |
| for (i in 2:(steps + 1)) { | |
| carbon_price[i] <- carbon_price[i-1] * exp((input$mu - 0.5 * input$sigma^2) * dt + input$sigma * sqrt(dt) * rnorm(1)) | |
| } | |
| time_to_maturity <- seq(input$T, 0, length.out = steps + 1) | |
| option_prices <- bs_call_price_vec(S = carbon_price, T = time_to_maturity, K = input$K, r = input$r, sigma = input$sigma) | |
| df <- data.frame( | |
| Day = 0:steps, | |
| CarbonPrice = carbon_price, | |
| OptionPrice = option_prices | |
| ) | |
| output$carbonPlot <- renderPlot({ | |
| ggplot(df, aes(x = Day, y = CarbonPrice)) + | |
| geom_line(color = "blue", size = 1) + | |
| labs(title = "Carbon Price Path", | |
| x = "Days", | |
| y = "Carbon Price ($/t-CO2)") + | |
| theme_minimal() | |
| }) | |
| output$optionPlot <- renderPlot({ | |
| ggplot(df, aes(x = Day, y = OptionPrice)) + | |
| geom_line(color = "darkgreen", size = 1) + | |
| labs(title = "European Call Option Price", | |
| x = "Days", | |
| y = "Option Price ($)") + | |
| theme_minimal() | |
| }) | |
| }) | |
| } | |
| # Run App | |
| shinyApp(ui = ui, server = server) |