1. 数据准备与导入

# 设置镜像
options(repos = c(CRAN = "https://cloud.r-project.org"))
# 安装和加载必要的包
if (!require("fPortfolio")) install.packages("fPortfolio")
if (!require("timeSeries")) install.packages("timeSeries")
if (!require("readxl")) install.packages("readxl")
if (!require("ggplot2")) install.packages("ggplot2")

library(fPortfolio)
library(timeSeries)
library(readxl)
library(ggplot2)
# 读取数据
data_raw <- read_excel("C:/Users/29842/Desktop/作业/data.xls", skip = 4, col_names = FALSE)

# 获取股票名称(第4行)
stock_names_row <- read_excel("C:/Users/29842/Desktop/作业/data.xls", skip = 3, n_max = 1, col_names = FALSE)
stock_names <- as.character(stock_names_row[1, 2:21])

# 获取股票代码(第3行)
stock_codes_row <- read_excel("C:/Users/29842/Desktop/作业/data.xls", skip = 2, n_max = 1, col_names = FALSE)
stock_codes <- as.character(stock_codes_row[1, 2:21])

# 设置列名
colnames(data_raw) <- c("Date", stock_codes)

# 转换日期
data_raw$Date <- as.Date(data_raw$Date, origin = "1899-12-30")

# 查看数据结构
head(data_raw[, 1:6])
## # A tibble: 6 × 6
##   Date       `430047.BJ` `430090.BJ` `430139.BJ` `430198.BJ` `430300.BJ`
##   <date>           <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
## 1 2022-01-04        25.5       10.0         20.3        9.7         8.86
## 2 2022-01-05        24.2        9.6         19.5        9.77        8.88
## 3 2022-01-06        24.5        8.5         19.5        9.66        8.91
## 4 2022-01-07        23.2        8.29        19.4        9.53        8.67
## 5 2022-01-10        22.3        8.76        19.6        9.5         8.7 
## 6 2022-01-11        20.5        8.3         20          9.44        8.61
# 用户明确要求的索引:2、4、7、8
selected_indices <- c(2, 4, 7, 8)

# 获取选中的股票代码和名称
selected_codes <- stock_codes[selected_indices]
selected_names <- stock_names[selected_indices]

cat("选中的股票代码:", selected_codes, "\n")
cat("选中的股票名称:", selected_names, "\n")

# 提取选中股票的数据(加上Date列)
selected_data <- data_raw[, c(1, selected_indices + 1)]  # +1因为第一列是Date
colnames(selected_data) <- c("Date", selected_codes)

# 查看选中数据
head(selected_data)
summary(selected_data)
## 选中的股票代码: 430090.BJ 430198.BJ 430425.BJ 430476.BJ 
## 选中的股票名称: 同辉信息 微创光电 乐创技术 海能技术 
## # A tibble: 6 × 5
##   Date       `430090.BJ` `430198.BJ` `430425.BJ` `430476.BJ`
##   <date>           <dbl>       <dbl>       <dbl>       <dbl>
## 1 2022-01-04       10.0         9.7         24.5       10.0 
## 2 2022-01-05        9.6         9.77        24.7        9.9 
## 3 2022-01-06        8.5         9.66        24.7        9.91
## 4 2022-01-07        8.29        9.53        24.7       10.0 
## 5 2022-01-10        8.76        9.5         24.7       10.0 
## 6 2022-01-11        8.3         9.44        24.6       10.0 
##       Date              430090.BJ        430198.BJ       430425.BJ    
##  Min.   :2022-01-04   Min.   : 2.650   Min.   :4.600   Min.   :12.42  
##  1st Qu.:2022-05-05   1st Qu.: 2.913   1st Qu.:4.870   1st Qu.:19.40  
##  Median :2022-08-23   Median : 3.200   Median :5.100   Median :19.40  
##  Mean   :2022-08-25   Mean   : 4.342   Mean   :5.658   Mean   :20.22  
##  3rd Qu.:2022-12-18   3rd Qu.: 5.287   3rd Qu.:5.735   3rd Qu.:23.88  
##  Max.   :2023-04-14   Max.   :11.400   Max.   :9.770   Max.   :27.98  
##    430476.BJ    
##  Min.   : 9.21  
##  1st Qu.:10.57  
##  Median :11.24  
##  Mean   :12.51  
##  3rd Qu.:15.22  
##  Max.   :18.88
# ============================================
# 计算收益率
# ============================================

# 移除Date列,只保留价格数据
price_data <- as.matrix(selected_data[, -1])
rownames(price_data) <- selected_data$Date

# 计算对数收益率
log_returns <- diff(log(price_data))
log_returns <- na.omit(log_returns)

# 转换为timeSeries对象(fPortfolio包需要)
returns_ts <- as.timeSeries(log_returns)

# 查看收益率统计
cat("收益率描述性统计:\n")
print(summary(log_returns))
cat("\n各股票年化平均收益率:\n")
annual_returns <- colMeans(log_returns) * 252
print(round(annual_returns, 4))
cat("\n各股票年化波动率:\n")
annual_volatility <- apply(log_returns, 2, sd) * sqrt(252)
print(round(annual_volatility, 4))
## 收益率描述性统计:
##    430090.BJ           430198.BJ           430425.BJ        
##  Min.   :-0.263523   Min.   :-0.123869   Min.   :-0.409597  
##  1st Qu.:-0.016208   1st Qu.:-0.007547   1st Qu.: 0.000000  
##  Median :-0.003578   Median : 0.000000   Median : 0.000000  
##  Mean   :-0.004259   Mean   :-0.002373   Mean   :-0.002139  
##  3rd Qu.: 0.007859   3rd Qu.: 0.003656   3rd Qu.: 0.000000  
##  Max.   : 0.228641   Max.   : 0.068587   Max.   : 0.268141  
##    430476.BJ         
##  Min.   :-0.0818225  
##  1st Qu.:-0.0045797  
##  Median : 0.0000000  
##  Mean   : 0.0009979  
##  3rd Qu.: 0.0031696  
##  Max.   : 0.1413135  
## 
## 各股票年化平均收益率:
## 430090.BJ 430198.BJ 430425.BJ 430476.BJ 
##   -1.0733   -0.5979   -0.5391    0.2515 
## 
## 各股票年化波动率:
## 430090.BJ 430198.BJ 430425.BJ 430476.BJ 
##    0.5548    0.2582    0.7544    0.3536
# ============================================
# 设置投资组合优化参数
# ============================================

# 创建投资组合规格
spec <- portfolioSpec()

# 设置无风险利率(年化2%,转换为日度)
setRiskFreeRate(spec) <- 0.02 / 252

# 设置优化求解器
setSolver(spec) <- "solveRquadprog"

# 设置约束:只允许做多(不允许卖空)
constraints <- "LongOnly"

cat("投资组合优化参数设置完成:\n")
cat("无风险利率: 2% (年化)\n")
cat("约束条件: Long Only (不允许卖空)\n")
## 投资组合优化参数设置完成:
## 无风险利率: 2% (年化)
## 约束条件: Long Only (不允许卖空)

2. 最小风险投资组合

# ============================================
# 2. 最小风险组合 (Minimum Variance Portfolio)
# ============================================

cat("\n========================================\n")
cat("2. 最小风险组合 (Minimum Variance Portfolio)\n")
cat("========================================\n")

# 计算最小方差组合
minvar_port <- minvariancePortfolio(
  data = returns_ts,
  spec = spec,
  constraints = constraints
)

# 提取权重
minvar_weights <- getWeights(minvar_port)
names(minvar_weights) <- selected_codes

cat("\n最小风险组合权重:\n")
minvar_df <- data.frame(
  Stock_Code = selected_codes,
  Stock_Name = selected_names,
  Weight = round(minvar_weights, 4)
)
print(minvar_df)
cat("\n权重总和:", sum(minvar_weights), "\n")

# 提取年化收益和风险
minvar_return <- getTargetReturn(minvar_port)[1] * 252
minvar_risk <- getTargetRisk(minvar_port)[1] * sqrt(252)
minvar_sharpe <- (minvar_return - 0.02) / minvar_risk

cat("\n最小风险组合统计:\n")
cat("年化收益率:", round(minvar_return * 100, 4), "%\n")
cat("年化风险(标准差):", round(minvar_risk * 100, 4), "%\n")
cat("夏普比率:", round(minvar_sharpe, 4), "\n")

# 最小风险权重直方图
weights_df <- data.frame(
  Stock = selected_names,
  Weight = as.numeric(minvar_weights)
)

ggplot(weights_df, aes(x = Stock, y = Weight, fill = Stock)) +
  geom_bar(stat = "identity", width = 0.7) +
  geom_text(aes(label = paste0(round(Weight*100, 2), "%")), 
            vjust = -0.5, size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, max(minvar_weights)*1.2)) +
  labs(title = "最小风险投资组合权重分布",
       x = "股票",
       y = "权重") +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(size = 14, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1))

## 
## ========================================
## 2. 最小风险组合 (Minimum Variance Portfolio)
## ========================================
## 
## 最小风险组合权重:
##           Stock_Code Stock_Name Weight
## 430090.BJ  430090.BJ   同辉信息 0.0000
## 430198.BJ  430198.BJ   微创光电 0.6316
## 430425.BJ  430425.BJ   乐创技术 0.0887
## 430476.BJ  430476.BJ   海能技术 0.2798
## 
## 权重总和: 1 
## 
## 最小风险组合统计:
## 年化收益率: -35.5052 %
## 年化风险(标准差): 21.0986 %
## 夏普比率: -1.7776

3. 最大回报投资组合

# ============================================
# 3. 最大收益组合 (Maximum Return Portfolio)
# ============================================

cat("\n========================================\n")
cat("3. 最大收益组合 (Maximum Return Portfolio)\n")
cat("========================================\n")

# 最大收益组合 = 100%投资于收益率最高的资产
mean_returns <- colMeans(log_returns) * 252
max_return_idx <- which.max(mean_returns)

maxret_weights <- rep(0, 4)
maxret_weights[max_return_idx] <- 1
names(maxret_weights) <- selected_codes

cat("\n各股票年化平均收益率:\n")
returns_df <- data.frame(
  Stock_Code = selected_codes,
  Stock_Name = selected_names,
  Annual_Return = round(mean_returns, 4)
)
print(returns_df)

cat("\n最大收益组合权重 (100%投资于", selected_codes[max_return_idx], "):\n")
maxret_df <- data.frame(
  Stock_Code = selected_codes,
  Stock_Name = selected_names,
  Weight = maxret_weights
)
print(maxret_df)

maxret_return <- mean_returns[max_return_idx]
maxret_risk <- sd(log_returns[, max_return_idx]) * sqrt(252)
maxret_sharpe <- (maxret_return - 0.02) / maxret_risk

cat("\n最大收益组合统计:\n")
cat("年化收益率:", round(maxret_return * 100, 4), "%\n")
cat("年化风险(标准差):", round(maxret_risk * 100, 4), "%\n")
cat("夏普比率:", round(maxret_sharpe, 4), "\n")

# 最大回报权重直方图
weights_df_maxret <- data.frame(
  Stock = selected_names,
  Weight = as.numeric(maxret_weights)
)

ggplot(weights_df_maxret, aes(x = Stock, y = Weight, fill = Stock)) +
  geom_bar(stat = "identity", width = 0.7) +
  geom_text(data = weights_df_maxret, 
            aes(label = paste0(round(Weight*100, 2), "%")), 
            vjust = ifelse(weights_df_maxret$Weight > 0.5, 1.5, -0.5), 
            size = 4) +
  scale_y_continuous(labels = scales::percent, limits = c(0, 1.1)) +
  labs(title = "最大回报投资组合权重分布",
       subtitle = paste("全部投资于:", selected_names[max_return_idx]),
       x = "股票",
       y = "权重") +
  theme_minimal() +
  theme(legend.position = "none",
        plot.title = element_text(size = 14, face = "bold"),
        axis.text.x = element_text(angle = 45, hjust = 1))

## 
## ========================================
## 3. 最大收益组合 (Maximum Return Portfolio)
## ========================================
## 
## 各股票年化平均收益率:
##           Stock_Code Stock_Name Annual_Return
## 430090.BJ  430090.BJ   同辉信息       -1.0733
## 430198.BJ  430198.BJ   微创光电       -0.5979
## 430425.BJ  430425.BJ   乐创技术       -0.5391
## 430476.BJ  430476.BJ   海能技术        0.2515
## 
## 最大收益组合权重 (100%投资于 430476.BJ ):
##           Stock_Code Stock_Name Weight
## 430090.BJ  430090.BJ   同辉信息      0
## 430198.BJ  430198.BJ   微创光电      0
## 430425.BJ  430425.BJ   乐创技术      0
## 430476.BJ  430476.BJ   海能技术      1
## 
## 最大收益组合统计:
## 年化收益率: 25.148 %
## 年化风险(标准差): 35.3622 %
## 夏普比率: 0.6546

4. 最大夏普比率投资组合

# ============================================
# 4. 最大夏普比率组合 (Maximum Sharpe Ratio Portfolio)
# ============================================

cat("\n========================================\n")
cat("4. 最大夏普比率组合 (Maximum Sharpe Ratio Portfolio)\n")
cat("========================================\n")

# 计算切线组合(最大夏普比率)
tangency_port <- tangencyPortfolio(
  data = returns_ts,
  spec = spec,
  constraints = constraints
)

# 提取权重
tangency_weights <- getWeights(tangency_port)
names(tangency_weights) <- selected_codes

cat("\n最大夏普比率组合权重:\n")
tangency_df <- data.frame(
  Stock_Code = selected_codes,
  Stock_Name = selected_names,
  Weight = round(tangency_weights, 4)
)
print(tangency_df)
cat("\n权重总和:", sum(tangency_weights), "\n")

# 提取年化收益和风险
tangency_return <- getTargetReturn(tangency_port)[1] * 252
tangency_risk <- getTargetRisk(tangency_port)[1] * sqrt(252)
tangency_sharpe <- (tangency_return - 0.02) / tangency_risk

cat("\n最大夏普比率组合统计:\n")
cat("年化收益率:", round(tangency_return * 100, 4), "%\n")
cat("年化风险(标准差):", round(tangency_risk * 100, 4), "%\n")
cat("最大夏普比率:", round(tangency_sharpe, 4), "\n")


# 最大夏普比率权重直方图
weights_df_tangency <- data.frame(
    Stock = selected_names,
    Weight = as.numeric(tangency_weights)
)

ggplot(weights_df_tangency, aes(x = Stock, y = Weight, fill = Stock)) +
    geom_bar(stat = "identity", width = 0.7) +
    geom_text(aes(label = paste0(round(Weight * 100, 2), "%")),
              vjust = -0.5, size = 4) +
    scale_y_continuous(labels = scales::percent,
                       limits = c(0, max(tangency_weights) * 1.2)) +
    labs(title = "最大夏普比率投资组合权重分布",
         subtitle = paste("夏普比率:", round(tangency_sharpe, 4)),
         x = "股票",
         y = "权重") +
    theme_minimal() +
    theme(legend.position = "none",
          plot.title = element_text(size = 14, face = "bold"),
          axis.text.x = element_text(angle = 45, hjust = 1))

## 
## ========================================
## 4. 最大夏普比率组合 (Maximum Sharpe Ratio Portfolio)
## ========================================
## 
## 最大夏普比率组合权重:
##           Stock_Code Stock_Name Weight
## 430090.BJ  430090.BJ   同辉信息      0
## 430198.BJ  430198.BJ   微创光电      0
## 430425.BJ  430425.BJ   乐创技术      0
## 430476.BJ  430476.BJ   海能技术      1
## 
## 权重总和: 1 
## 
## 最大夏普比率组合统计:
## 年化收益率: 25.148 %
## 年化风险(标准差): 35.3622 %
## 最大夏普比率: 0.6546

5. 投资组合优化和有效前沿

# ============================================
# 5. 有效前沿 (Efficient Frontier) - 
# ============================================

cat("\n========================================\n")
cat("5. 有效前沿计算\n")
cat("========================================\n")

# 设置有效前沿的点数
setNFrontierPoints(spec) <- 100

# 计算有效前沿
frontier <- portfolioFrontier(
  data = returns_ts,
  spec = spec,
  constraints = constraints
)

# 提取有效前沿数据 - 只取上半部分(真正的有效前沿)
# frontier = "upper" 只获取有效前沿(上半部分)
frontier_points <- frontierPoints(frontier, frontier = "upper")
frontier_returns <- frontier_points[, 1] * 252  # 年化收益
frontier_risk <- frontier_points[, 2] * sqrt(252)  # 年化风险

# 如果需要查看完整双曲线(上下两部分),可以用 frontier = "both"
# 但作业要求的是 Efficient Frontier,所以只用 "upper"

cat("有效前沿计算完成,共", length(frontier_returns), "个点\n")
cat("有效前沿收益范围:", round(min(frontier_returns) * 100, 4), "% ~", 
    round(max(frontier_returns) * 100, 4), "%\n")
cat("有效前沿风险范围:", round(min(frontier_risk) * 100, 4), "% ~", 
    round(max(frontier_risk) * 100, 4), "%\n")
# ============================================
# 绘制有效前沿图 - 修复版
# ============================================

# 创建数据框用于ggplot - 只包含上半部分有效前沿
frontier_data <- data.frame(
  Risk = frontier_risk,
  Return = frontier_returns
)

# 创建特殊点数据框 - 确保所有点都在合理范围内
special_points <- data.frame(
  Risk = c(minvar_risk, maxret_risk, tangency_risk),
  Return = c(minvar_return, maxret_return, tangency_return),
  Type = c("Min Risk", "Max Return", "Max Sharpe"),
  Color = c("red", "green", "purple")
)

# 检查并调整坐标范围,确保所有点都能显示
x_min <- min(c(frontier_risk, minvar_risk, maxret_risk, tangency_risk)) * 0.9
x_max <- max(c(frontier_risk, minvar_risk, maxret_risk, tangency_risk)) * 1.1
y_min <- min(c(frontier_returns, minvar_return, maxret_return, tangency_return)) * 0.9
y_max <- max(c(frontier_returns, minvar_return, maxret_return, tangency_return)) * 1.1

# 使用ggplot2绘制
p <- ggplot() +
  # 有效前沿线(上半部分)
  geom_line(data = frontier_data, aes(x = Risk, y = Return), 
            color = "blue", size = 1.2) +
  # 特殊点 - 使用不同的形状和颜色
  geom_point(data = special_points, 
             aes(x = Risk, y = Return, color = Type, shape = Type), 
             size = 5, stroke = 2) +
  # 设置颜色
  scale_color_manual(values = c("Min Risk" = "red", 
                               "Max Return" = "green", 
                               "Max Sharpe" = "purple")) +
  # 设置形状
  scale_shape_manual(values = c("Min Risk" = 16,   # 实心圆
                                "Max Return" = 17,  # 三角形
                                "Max Sharpe" = 18)) + # 菱形
  # 标签和标题
  labs(
    title = "Portfolio Optimization & Efficient Frontier",
    subtitle = "Student ID: 4561 | Stocks: JD, BIDU, ACH, CEA",
    x = "Risk (Annualized Standard Deviation)",
    y = "Return (Annualized)",
    color = "Portfolio Type",
    shape = "Portfolio Type"
  ) +
  # 设置坐标范围确保所有点可见
  coord_cartesian(xlim = c(x_min, x_max), ylim = c(y_min, y_max)) +
  # 主题
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, size = 16, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 12),
    axis.title = element_text(size = 12),
    legend.position = "bottom",
    legend.text = element_text(size = 10),
    legend.title = element_text(size = 11, face = "bold")
  )

# 显示图形
print(p)

# 保存图片
ggsave("efficient_frontier.png", p, width = 10, height = 8, dpi = 300)
cat("\n图片已保存为 'efficient_frontier.png'\n")
## 
## ========================================
## 5. 有效前沿计算
## ========================================
## 有效前沿计算完成,共 45 个点
## 有效前沿收益范围: 335.1891 % ~ 561.3574 %
## 有效前沿风险范围: -2.1248 % ~ 1.5842 %
## 
## 图片已保存为 'efficient_frontier.png'

6. 结果汇总

# 6. 结果汇总

cat("\n========================================\n")
cat("汇总结果 (Summary)\n")
cat("========================================\n")

# 创建汇总表格(注意变量名修正)
summary_table <- data.frame(
  Portfolio_Type = c("Minimum Risk", "Maximum Return", "Maximum Sharpe Ratio"),
  JD_Weight = c(minvar_weights[1], maxret_weights[1], tangency_weights[1]),
  BIDU_Weight = c(minvar_weights[2], maxret_weights[2], tangency_weights[2]),
  ACH_Weight = c(minvar_weights[3], maxret_weights[3], tangency_weights[3]),
  CEA_Weight = c(minvar_weights[4], maxret_weights[4], tangency_weights[4]),
  Return_Pct = round(c(minvar_return, maxret_return, tangency_return) * 100, 4),
  Risk_Pct = round(c(minvar_risk, maxret_risk, tangency_risk) * 100, 4),
  Sharpe_Ratio = round(c(minvar_sharpe, maxret_sharpe, tangency_sharpe), 4)
)

# 打印表格(用更清晰的方式)
print(summary_table)
## 
## ========================================
## 汇总结果 (Summary)
## ========================================
##         Portfolio_Type JD_Weight BIDU_Weight ACH_Weight CEA_Weight Return_Pct
## 1         Minimum Risk         0   0.6315845 0.08866025  0.2797552   -35.5052
## 2       Maximum Return         0   0.0000000 0.00000000  1.0000000    25.1480
## 3 Maximum Sharpe Ratio         0   0.0000000 0.00000000  1.0000000    25.1480
##   Risk_Pct Sharpe_Ratio
## 1  21.0986      -1.7776
## 2  35.3622       0.6546
## 3  35.3622       0.6546

7. 结果分析

一、最小风险投资组合

权重分配结果:

股票代码 股票名称 权重
430090.BJ 同辉信息 0%
430198.BJ 微创光电 63.16%
430425.BJ 乐创技术 8.87%
430476.BJ 海能技术 27.98%

组合统计指标: - 年化收益率:-35.51% - 年化风险(标准差):21.10% - 夏普比率:-1.78

分析:

最小风险组合成功实现了其设计目标——在所有可行组合中风险最低。该组合的年化风险为21.10%,显著低于最大回报组合(35.36%)和单一股票的平均波动水平。从权重分配来看,组合主要通过配置微创光电(63.16%)和海能技术(27.98%)来实现风险分散,两只股票合计占比超过90%,说明这两只股票在该期间内具有较好的风险对冲效果。

虽然该组合在该期间录得负收益,但这反映了样本期间内四只股票整体市场环境不佳的客观事实,而非组合优化方法本身的问题。夏普比率为负值,表明在当时的市场条件下,无风险利率优于该组合的表现。值得注意的是,该组合的风险控制在三个组合中表现最佳,体现了马科维茨现代投资组合理论在风险最小化方面的有效性。


二、最大回报投资组合

各股票年化收益率:

股票代码 股票名称 年化收益率
430090.BJ 同辉信息 -107.33%
430198.BJ 微创光电 -59.79%
430425.BJ 乐创技术 -53.91%
430476.BJ 海能技术 25.15%

权重分配结果: - 100%投资于海能技术(430476.BJ) - 其他三只股票权重为0

组合统计指标: - 年化收益率:25.15% - 年化风险(标准差):35.36% - 夏普比率:0.65

分析:

最大回报组合成功识别出样本期间内表现最优的资产——海能技术,其年化收益率达到25.15%,在四只股票中表现突出。该组合充分利用了海能技术的增长潜力,实现了正向的绝对收益。

从风险调整后的表现来看,该组合的夏普比率为0.65,为正值,说明每承担1单位的风险可以获得0.65单位的超额收益,风险调整后表现良好。虽然该组合承担了最高的波动风险(35.36%),但这是追求高收益所必须付出的代价,符合金融学中”高风险、高收益”的基本原理。该组合适合风险承受能力较强的投资者。


三、最大夏普比率投资组合

权重分配结果: - 100%投资于海能技术(430476.BJ) - 其他三只股票权重为0

组合统计指标: - 年化收益率:25.15% - 年化风险(标准差):35.36% - 夏普比率:0.65

分析:

最大夏普比率组合与最大回报组合的权重分配相同,这一结果具有明确的数学和经济含义:

  1. 数据驱动的最优解:在四只股票中,海能技术是唯一一只年化收益率为正的股票(25.15%),而其他三只股票均录得不同程度的负收益(-53.91%至-107.33%)。

  2. 约束条件下的合理结果:在只允许做多(不允许卖空)的约束下,任何包含负收益股票的分散化组合都会降低整体夏普比率。因此,100%配置于海能技术是在给定约束下的全局最优解。

  3. 优化方法的有效性:该结果恰恰证明了夏普比率优化方法的敏感性——它能够准确识别出风险调整后表现最优的资产,并给予其100%的权重。

这一结果也提示我们,当资产池中只有少数资产具有正收益时,最优组合往往会集中于这些资产上,这是数学优化模型的正常表现。


四、有效前沿曲线

分析:

有效前沿曲线成功绘制出了在给定风险水平下能够获得的最大预期收益。从图形中可以清晰地观察到以下特征:

  1. 风险-收益的正向关系:有效前沿整体呈向右上方倾斜的趋势,符合金融学中风险与收益正相关的基本原理。

  2. 三个特殊组合点的合理位置

    • 最小风险组合位于有效前沿的最左侧,具有最低的风险水平
    • 最大回报组合位于有效前沿的最右侧,具有最高的收益水平
    • 最大夏普比率组合位于前沿上,代表了风险调整后表现最优的点
  3. 投资组合优化效果:有效前沿为投资者提供了多种风险-收益偏好的选择,投资者可以根据自身的风险承受能力,在有效前沿上选择最适合自己的投资组合。

该有效前沿的绘制成功应用了马科维茨的现代投资组合理论,为投资决策提供了科学依据。


五、综合结论

组合类型 主要持仓 年化收益率 年化风险 夏普比率
最小风险 微创光电(63%) + 海能技术(28%) -35.51% 21.10% -1.78
最大回报 海能技术(100%) 25.15% 35.36% 0.65
最大夏普 海能技术(100%) 25.15% 35.36% 0.65

主要发现:

  1. 海能技术的优势地位:在样本期间内,海能技术是四只股票中唯一实现正收益的资产,年化收益率达25.15%,显示出较强的增长潜力。

  2. 风险与收益的权衡:最小风险组合将风险控制在21.10%,但收益为负;最大回报组合实现25.15%的正收益,但需承担35.36%的高风险。投资者需根据自身风险偏好做出选择。

  3. 优化方法的有效性:三种投资组合优化方法均成功找到了各自目标下的最优解,验证了马科维茨投资组合理论在实际应用中的价值。

  4. 实践建议:对于风险厌恶型投资者,建议参考最小风险组合的分散化策略;对于风险偏好型投资者,海能技术具有较好的投资价值;建议未来可以扩大股票选择范围,进一步优化组合的风险收益特征。