2301_80358763 2024-05-05 21:43 采纳率: 0%
浏览 8

怎么构建6-8只股票投资组合的可行集

从证券业市场里面找出六个,国债无风险,算切点组合,计算最优组合,做权重

计算有效前沿

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-05-05 21:43
    关注

    引自免费微信小程序:皆我百晓生

    构建一个6-8只股票的投资组合的可行集(也称为投资机会集)并找到最优组合的过程涉及到几个步骤:收集数据、计算收益和风险、绘制可行集和确定最优组合。这里我会为你提供一个Python实现的示例,包括获取数据、计算相关指标、绘制图形以及找到有效前沿上的最小方差组合。

    首先,确保你安装了必要的库,如pandas, numpy, matplotlib 和 yfinance。

    pip install pandas numpy matplotlib yfinance
    

    接下来,我们将编写一个函数来获取股票数据,计算收益和风险,并绘制可行集。这里我们使用yfinance库来下载股票数据,但你也可以选择其他数据源。

    import yfinance as yf
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.optimize import minimize
    
    # 获取股票历史数据
    def get_data(stock_list):
        data = yf.download(stock_list, period="1y", interval="1d")
        return data["Adj Close"].dropna()
    
    # 计算收益率和协方差矩阵
    def calculate_returns_and_covariance(data):
        returns = data.pct_change().dropna()
        covariance_matrix = returns.cov()
        return returns, covariance_matrix
    
    # 绘制可行集
    def plot_feasible_set(returns, covariance_matrix, min_risk=0.01):
        n_assets = len(returns.columns)
        mean_returns = returns.mean()
        
        def portfolio_variance(weights):
            return weights.T @ covariance_matrix @ weights
        
        def portfolio_return(weights):
            return weights.T @ mean_returns
        
        # 定义优化目标(最小化方差)
        def objective_function(weights):
            return portfolio_variance(weights)
        
        # 限制所有权重之和为1
        constraints = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}]
        
        # 限制单个资产权重不超过25%
        bounds = [(0, 0.25)] * n_assets
        
        # 最小化方差寻找最小方差组合
        min_var_weights = minimize(objective_function, np.ones(n_assets) / n_assets,
                                    method='SLSQP', bounds=bounds, constraints=constraints)
        
        # 找到最大收益组合
        max_ret_weights = minimize(-portfolio_return, np.ones(n_assets) / n_assets,
                                    method='SLSQP', bounds=bounds, constraints=constraints)
        
        risk_free_rate = 0.01  # 假设无风险利率为1%
        
        # 计算有效前沿
        efficient_frontier_weights = []
        for target_return in np.linspace(min(mean_returns), max(mean_returns), 100):
            weights = minimize(portfolio_variance - (target_return - risk_free_rate) / np.sqrt(covariance_matrix.values.diagonal()).sum(),
                                np.ones(n_assets) / n_assets,
                                method='SLSQP', bounds=bounds, constraints=constraints).x
            efficient_frontier_weights.append(weights)
        
        # 绘制可行集
        fig, ax = plt.subplots(figsize=(12, 8))
        ax.set_title("Efficient Frontier and Optimal Portfolio")
        ax.set_xlabel('Volatility')
        ax.set_ylabel('Return')
        
        for ef_weights in efficient_frontier_weights:
            vol = np.sqrt(portfolio_variance(ef_weights))
            ret = portfolio_return(ef_weights)
            ax.scatter(vol, ret, color='grey', alpha=0.3)
        
        ax.plot(np.std(min_var_weights.x * returns), portfolio_return(min_var_weights.x),
                'o', label='Minimum Variance Portfolio')
        ax.plot(np.std(max_ret_weights.x * returns), portfolio_return(max_ret_weights.x),
                'o', label='Maximum Return Portfolio')
        
        ax.legend()
        ax.grid(True)
        plt.show()
    
    # 股票列表
    stock_list = ['AAPL', 'GOOGL', 'MSFT', 'AMZN', 'TSLA', 'FB', 'JPM', 'V']  # 选取六至八只股票
    
    data = get_data(stock_list)
    returns, covariance_matrix = calculate_returns_and_covariance(data)
    
    plot_feasible_set(returns, covariance_matrix)
    

    这段代码将下载选定股票的历史收盘价数据,然后计算每日收益率和协方差矩阵。接着,它会绘制出可行集,显示不同风险水平下的预期回报。在绘图部分,你会看到最小方差组合(最低风险)和最大回报组合。有效前沿是连接这些高效率组合的曲线。通过调整目标回报率,你可以找到在给定风险水平下的最优组合。

    注意:这个例子中的数据是从雅虎财经抓取的,实际操作时可能需要根据实际情况调整数据来源和处理方式。此外,风险和回报的计算基于历史数据,现实世界中可能存在更多因素影响投资决策,这只是一个基础模型。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月5日