马科维茨的投资组合理论介绍(2)

量化 2023年7月24日

我们继续介绍马科维茨投资组合理论。

Complex Version

之前我们对投资组合权重进行随机抽样;让我们尝试提高效率(双关语)。我们可以引入支配的概念,这样我们就不会不必要地抽样“糟糕”的投资组合。 作为一名(某种程度上)理性的投资者,如果有两个回报相同的投资组合,我们会选择风险较低的一个,而如果有两个风险相等的投资组合,我们会选择回报较高的一个。是的? 🤞 这对于上面的情节来说意味着什么?左上角是最好的位置,任何在其上方和左侧有另一个投资组合的投资组合都是主导的,任何理性的投资者都不会选择。 因此,让我们确保我们的代码不包含任何由我们已经采样的投资组合主导的投资组合。

#-- Create random portfolio weights and indexes
#- How many assests in the portfolio
n_assets = 5

mean_variance_pairs = []
#-- Store weights and tickers for labelling
weights_list=[]
tickers_list=[]

for i in tqdm(range(1000)):
    next_i = False
    while True:
        #- Choose assets randomly without replacement
        assets = np.random.choice(tickers, n_assets, replace=False)
        #- Choose weights randomly ensuring they sum to one
        weights = np.random.rand(n_assets)
        weights = weights/sum(weights)

        #-- Loop over asset pairs and compute portfolio return and variance
        portfolio_E_Variance = 0
        portfolio_E_Return = 0
        for i in range(len(assets)):
            portfolio_E_Return += weights[i] * df.mu.loc[assets[i]]
            for j in range(len(assets)):
                portfolio_E_Variance += weights[i] * weights[j] * cov.loc[assets[i], assets[j]]

        #-- Skip over dominated portfolios
        for R,V in mean_variance_pairs:
            if (R > portfolio_E_Return) & (V < portfolio_E_Variance):
                next_i = True
                break
        if next_i:
            break

        #-- Add the mean/variance pairs to a list for plotting
        mean_variance_pairs.append([portfolio_E_Return, portfolio_E_Variance])
        weights_list.append(weights)
        tickers_list.append(assets)
        break

在此版本中,我们还存储每个投资组合的资产名称和权重。使用 Plotly 的交互功能,我们可以将鼠标悬停在绘图上的每个点上,它会告诉我们每个点的资产和权重。

使用这种抽样技术,我们最终可以沿着有效边界非常快速地对投资组合进行抽样。一些早期采样的投资组合在有效边界以下清晰可见;然而,这个问题可以很容易地解决,只需在一定的迭代之后添加投资组合(类似于 MCMC 中的“burn-in period”的想法)

PS:
对多维随机变量\( X=[X_1,X_2,\ldots,X_n]^T \),我们往往需要计算各维度之间的协方差,这样协方差就组成了一个n×n的矩阵,称为协方差矩阵。协方差矩阵是一个对角矩阵,对角线上的元素是各维度上随机变量的方差。 我们定义协方差为Σ, 矩阵内的元素Σij为

$$ \begin{aligned}\Sigma_{ij}&=cov(X_i,X_j)=E[(X_i-E(X_i))(X_j-E(X_j))]\end{aligned} $$

完整数据代码,请联系sigma获取。wx:sigma-quant

Tags