#R代码
# 北证申购策略资金需求分析(宏远股份2025年8月11日申购)
# 核心参数初始化
W <- 1e4*145.73/0.05 # 网上发行量(股)通过顶格申购股数反推
P <- 9.17 # 发行价(元) [1,3](@ref)
T_range <- seq(7300, 8000, by=100) * 1e8 # 申购资金范围(元) [2,5](@ref)
# 正股门槛计算(100股整数倍)
calculate_F1 <- function(T_total) {
R <- (W * P) / T_total # 配售比例
round(100 * P / R / 1e4, 1) # 转换为万元,保留1位小数 [1](@ref)
}
# 碎股门槛修正模型(基于顶格翻车逻辑)
estimate_F2 <- function(T_total) {
# 顶格翻车阈值7790亿 [3](@ref)
if (T_total < 7790 * 1e8) {
F2 <- 430 # 顶格未翻车时碎股门槛 [3](@ref)
} else {
F2 <- 350 # 顶格翻车释放碎股,门槛降低 [3](@ref)
}
return(F2)
}
# 主分析函数
analyze_strategy <- function() {
# 计算各资金量下的门槛
results <- data.frame(
申购资金_亿元 = T_range/1e8,
正股门槛_万元 = sapply(T_range, calculate_F1),
碎股门槛_万元 = sapply(T_range, estimate_F2)
)
# 计算策略需求
results$"1+0策略" <- results$正股门槛_万元 * 1.05 # 增加5%安全垫 [4](@ref)
results$"1+1策略" <- pmax(results$正股门槛_万元, results$碎股门槛_万元)
results$"2+1策略" <- 2 * results$正股门槛_万元
# 输出结果
cat("宏远股份申购策略资金需求分析(单位:万元)\n")
print(results, row.names = FALSE)
# 可视化
par(mfrow=c(1,2))
matplot(results$申购资金_亿元, results[,c("正股门槛_万元","碎股门槛_万元")],
type="l", lwd=2, col=c("blue","red"),
xlab="申购资金(亿元)", ylab="资金需求(万元)",
main="基础门槛分析")
legend("topleft", legend=c("正股门槛","碎股门槛"),
col=c("blue","red"), lty=1:1, lwd=2)
matplot(results$申购资金_亿元, results[,c("1+0策略","1+1策略","2+1策略")],
type="l", lwd=2, col=c("green","orange","purple"),
xlab="申购资金(亿元)", ylab="资金需求(万元)",
main="策略需求分析")
legend("topleft", legend=c("1+0策略","1+1策略","2+1策略"),
col=c("green","orange","purple"), lty=1:1, lwd=2)
return(results)
}
# 执行分析
result_data <- analyze_strategy()
# 蒙特卡洛模拟(考虑资金波动)
monte_carlo_sim <- function(n_sim=10000) {
# 申购资金服从正态分布 [2](@ref)
T_mean <- 7700 * 1e8
T_sd <- 300 * 1e8 # 标准差300亿 [2](@ref)
simulated_T <- rnorm(n_sim, T_mean, T_sd)
# 模拟各策略需求
simulated_F1 <- sapply(simulated_T, calculate_F1)
simulated_F2 <- sapply(simulated_T, estimate_F2)
simulated_1plus1 <- pmax(simulated_F1, simulated_F2)
simulated_2plus1 <- 2 * simulated_F1
# 分析分布
par(mfrow=c(1,3))
hist(simulated_F1, breaks=30, main="正股门槛分布",
xlab="万元", col="lightblue", xlim=c(240,300))
abline(v=quantile(simulated_F1, c(0.05,0.95)), col="red", lty=2)
hist(simulated_1plus1, breaks=30, main="1+1策略分布",
xlab="万元", col="lightgreen", xlim=c(350,450))
abline(v=quantile(simulated_1plus1, c(0.05,0.95)), col="red", lty=2)
hist(simulated_2plus1, breaks=30, main="2+1策略分布",
xlab="万元", col="lightpink", xlim=c(500,650))
abline(v=quantile(simulated_2plus1, c(0.05,0.95)), col="red", lty=2)
return(data.frame(
策略 = c("正股门槛", "1+1策略", "2+1策略"),
均值 = c(mean(simulated_F1), mean(simulated_1plus1), mean(simulated_2plus1)),
p5 = c(quantile(simulated_F1, 0.05),
quantile(simulated_1plus1, 0.05),
quantile(simulated_2plus1, 0.05)),
p95 = c(quantile(simulated_F1, 0.95),
quantile(simulated_1plus1, 0.95),
quantile(simulated_2plus1, 0.95))
))
}
# 执行模拟
mc_results <- monte_carlo_sim()
cat("\n蒙特卡洛模拟结果(95%置信区间,单位:万元):\n")
print(mc_results)
# 顶格翻车阈值估算(由5+1变成4+1对应的申购总金额就是翻车阈值)
df <- data.frame(
int_row = as.integer(round(result_data[, 1], 0)),
num_row = round(145.73 * 9.17 / result_data[, 2], 2)
)
print(df, row.names = FALSE)