(8-5-6)制作美股交易策略模型:投资组合模拟+可视化+结论

本文主要是介绍(8-5-6)制作美股交易策略模型:投资组合模拟+可视化+结论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

8.5.8  投资组合模拟

在本项目中,使用Google、Apple、Facebook、Amazon以及S&P 500市场指数进行投资组合模拟,本项目使用了Python的Scipy.optimize包实现模拟功能。通过调整资产配置,我们将生成2673个投资组合。在本模拟中考虑了历史收益、波动性和相关性,以构建有效的投资组合。在0%的无风险利率下,我们将评估这些投资组合相对于无风险投资的表现。本项目旨在了解多元化的好处和风险降低,为构建与投资者风险承受能力和回报目标相符的良好多元化投资组合提供见解。

(1)下面这段代码是进行投资组合模拟的实现,通过使用SciPy库中的minimize函数。在生成2673个投资组合时,对每个投资组合进行了权重的分配,其中使用了Dirichlet分布。通过计算每个投资组合的预期收益、预期波动性和夏普比率,以及考虑了无风险利率,从而得到投资组合的性能指标。这有助于理解多元化的效果、风险和回报之间的权衡,并提供了构建优化投资组合的信息。

from scipy.optimize import minimize
# Portfolio Simulation
portfolio        = 2673  # generation of a portfolio
n_assets         = returns.shape[1]
weights          = np.random.dirichlet(np.full(n_assets,0.05),portfolio)
mean_returns     = returns.mean()
sigma            = returns.cov()
expected_returns = np.zeros(portfolio)
expected_vol     = np.zeros(portfolio)
sharpe_ratio     = np.zeros(portfolio)
rf_rate          = 0.0                          # risk free ratefor i in range(portfolio):w                   = weights[i,:]expected_returns[i] = np.sum(mean_returns @ w)*252expected_vol[i]     = np.sqrt(np.dot(w.T,sigma @ w))*np.sqrt(252)sharpe_ratio[i]     = (expected_returns[i]-rf_rate)/expected_vol[i]

(2)定义如下所示的三个函数,这三个函数将在后续的投资组合优化中使用。

  1. portfolio_volatility(weight):用于计算投资组合的波动性,接受权重向量作为参数。
  2. portfolio_return(weight):用于投资组合的预期收益,同样接受权重向量作为参数。
  3. portfolio_performance(weight):用于投资组合的收益和波动性,返回一个元组包含两个值,分别是预期收益和波动性。同样,接受权重向量作为参数。
def portfolio_volatility(weight):return np.sqrt(np.dot(weight.T,np.dot(sigma,weight)))*np.sqrt(252)def portfolio_return(weight):return np.sum(mean_returns*weight)*252def portfolio_performance(weight):return_p = portfolio_return(weight)vol_p    = portfolio_volatility(weight)return return_p, vol_p

(3)下面的这两个函数定义了投资组合优化的目标和优化过程,这两个函数是投资组合优化中关键的部分。

  1. negativeSR(weight):用于计算投资组合的负夏普比率。在优化时,我们希望最大化夏普比率,但minimize 函数实际上是一个最小化问题,所以我们取负夏普比率进行最小化。函数返回的值是 -(return_p - rf_rate)/vol_p,其中 return_p 是投资组合的预期收益,vol_p 是波动性,rf_rate 是无风险利率。
  2. max_sharpe_ratio():用于执行实际的优化过程。在内部定义了一个辅助函数 sum_one,用于确保权重总和为1。然后,通过使用 minimize 函数,基于定义的 negativeSR 函数进行夏普比率的最大化。最终max_sharpe_ratio()返回的是最优权重的结果。
def negativeSR(weight):return_p, vol_p = portfolio_performance(weight)rf_rate         = 0.025return -(return_p - rf_rate)/vol_pdef max_sharpe_ratio():def sum_one(weight):w= weightreturn np.sum(weight)-1n_assets           = returns.shape[1]weight_constraints = ({'type':'eq','fun': sum_one})w0                 = np.random.dirichlet(np.full(n_assets,0.05)).tolist()    # w0 is an initila guessreturn minimize(negativeSR,w0,method='SLSQP',bounds  =((0,1),)*n_assets,constraints = weight_constraints)

(4)函数 min_vol()的功能是最小化投资组合波动率。函数使用 minimize 函数,基于定义的 portfolio_volatility 函数,执行投资组合波动率的最小化,并返回最优权重的结果。这个函数在构建有效前沿(Efficient Frontier)时是非常关键的。其中n_assets 是资产数量; weight_constraints 定义了一个等式约束,确保所有权重的总和等于1; w0 是初始权重的猜测; bounds 是权重的边界,确保它们在 [0, 1] 的范围内。

def min_vol():n_assets           = returns.shape[1]weight_constraints = ({'type':'eq','fun': lambda x: np.sum(x)-1})w0                 = np.random.dirichlet(np.full(n_assets,0.05)).tolist()bounds             = ((0,1),)*n_assetsreturn minimize(portfolio_volatility,w0,method='SLSQP',bounds      = bounds,constraints = weight_constraints)

(5)函数 efficient_portfolio_target(target) 用于找到给定目标收益率下的有效投资组合。以下是对关键信息的说明:

  1. target 是目标收益率。
  2. constraints 包括两个等式约束:一个确保投资组合的预期收益率等于目标,另一个确保所有权重的总和等于1。
  3. w0 是初始权重的猜测。
  4. bounds 是权重的边界,确保它们在 [0, 1] 的范围内。
def efficient_portfolio_target(target):constraints = ({'type':'eq','fun': lambda x: portfolio_return(x)- target},{'type' :'eq','fun': lambda x: np.sum(x)-1})w0          = np.random.dirichlet(np.full(n_assets,0.05)).tolist()bounds      = ((0,1),)*n_assetsreturn minimize(portfolio_volatility,w0, method = 'SLSQP',bounds      = bounds,constraints = constraints)

在上述代码中,函数使用 minimize 函数,基于定义的 portfolio_volatility 函数,执行在给定目标收益率下最小化投资组合波动率,并返回最优权重的结果。这对于构建有效前沿(Efficient Frontier)和制定风险和收益平衡的投资策略非常有用。

(6)函数 efficient_frontier(return_range) 用于生成在给定一系列目标收益率下的有效投资组合。参数return_range 是一个列表,包含多个目标收益率。函数 efficient_frontier(return_range) 使用列表推导来创建一个由每个目标收益率生成的有效投资组合列表,每个目标收益率都被传递给 efficient_portfolio_target 函数,以找到相应目标下的最优权重。

def efficient_frontier(return_range):return [efficient_portfolio_target(ret) for ret in return_range]

通过调用这个函数,可以得到有效前沿上的一组投资组合,每个投资组合都在给定目标收益率下最小化了投资组合的波动率。这有助于投资者在不同风险和收益水平下做出明智的投资决策。

8.5.9  投资组合可视化

(1)下面代码实现了投资组合的优化可视化,通过使用Python中的库Scipy.optimize进行投资组合模拟。通过生成大量权重分配来构建投资组合,考虑历史收益、波动性和相关性,以生成有效投资组合。在考虑风险无息率为0的情况下,通过评估各个投资组合的性能相对于无风险投资,分析了投资组合的多样化效益和风险降低。绘制了投资组合的散点图和有效前沿图,展示了投资组合的风险和收益之间的权衡关系,强调了夏普比率最大和波动率最小的投资组合。这有助于投资者在不同的风险水平下做出明智的投资决策。

sharpe_maximum      = max_sharpe_ratio()
return_p,vol_p      = portfolio_performance(sharpe_maximum['x'])
min_volatility      = min_vol()
return_min,vol_min  = portfolio_performance(min_volatility['x'])plt.figure(figsize =(15,10))
plt.style.use('ggplot')
plt.scatter(expected_vol,expected_returns, c = sharpe_ratio)
# plt.colorbar.sel(label = 'Sharpe Ratio',size=20)
plt.colorbar().set_label('Sharpe Ratio', size= 20, color = 'g', family='serif',weight='bold')
target               = np.linspace(return_min,1.02,100)
efficient_portfolios = efficient_frontier(target)
plt.plot([i.fun for i in efficient_portfolios], target, linestyle ='dashdot', color ='black',label='Efficient Frontier')
plt.scatter(vol_p,return_p, c = 'r', marker='*', s = 500, label = 'Maximum Sharpe Ratio')
plt.scatter(vol_min,return_min, c = 'g',  marker ='*', s = 500, label='Minimum Volatility Portfolio')font1 = {'family':'serif','color':'darkred','size':20,'weight':'bold'}
font2 = {'family':'serif','color':'darkred','size':20,'weight':'bold'}
plt.title('Portfolio Optimization based on Efficient Frontier',fontdict=font1)
plt.xlabel('Annualised Volatility',fontdict=font2)
plt.ylabel('Annualised Returns',fontdict=font2)
plt.legend(labelspacing=0.8)

执行后绘制投资组合的散点图和有效前沿,效果如图8-8所示。具体说你如下所示:

  1. 图中展示了2673个不同权重下的投资组合,其中横轴表示年化波动率,纵轴表示年化收益率,散点的颜色表示夏普比率,越深的颜色表示夏普比率越高。
  2. 有效前沿(Efficient Frontier)是一条用虚线标识的曲线,表示在给定风险水平下,投资组合可以实现的最大收益。这是通过尝试不同目标收益率来生成的。
  3. 最大夏普比率的投资组合用红色星星标识,最小波动率的投资组合用绿色星星标识。这两个投资组合代表了夏普比率最大和波动率最小的极端情况。

整体来说,这张图帮助投资者在风险和收益之间找到平衡点,通过选择适当的投资组合权重来实现其投资目标。

图8-8  投资组合的散点图和有效前沿

(2)现在,我们可以查看GAFAM投资组合中各资产的权重。通过如下代码查看有最高夏普比率的投资组合。当投资回报低于风险无风险利率时,夏普比率可能为负。

max_sharpe_port.to_frame().T

执行后会输出:

ret stdev sharpe GOOG AAPL META AMZN MSFT GSPC
3270 0.231556 0.24312 0.849603 0.011955 0.269486 0.034679 0.209609 0.469536 0.004734

(3)下面的min_vol_port.to_frame().T是一个DataFrame,其中包含最低方差投资组合的权重。

min_vol_port.to_frame().T

执行后会输出:

ret stdev sharpe GOOG AAPL META AMZN MSFT GSPC
2695 0.152335 0.189673 0.67134 0.129409 0.07794 0.052775 0.016958 0.079501 0.643417

查看具有最高夏普比率的投资组合权重表时,通过上面的输出结果可以看到,微软的权重比其他公司更高。相比之下,在最小方差投资组合中,Facebook的权重较低。我们可以得出结论:在这两种权重中,风险较高的那个投资组合更好。如果我们考虑风险调整后的收益,这个投资组合的夏普比率最高(0.953%),相比之下,最小方差投资组合的夏普比率较低,这意味着投资者将获得相对较高的超额收益,以换取额外的风险。

8.5.10  结论

综合而言,本项目对谷歌、苹果、Facebook、亚马逊、微软以及标准普尔500指数等公司的股市数据进行分析提供了有价值的分析。

  1. 波动性:对年度和月度波动性的研究显示,Meta在所有股票中表现出最高的波动性,表明其价格波动较大,存在潜在风险。这些信息有助于投资者理解这些股票的风险特征,从而做出明智的投资决策。
  2. 相关性:相关性分析显示标普500指数与微软、亚马逊之间以及微软与谷歌、谷歌与苹果、亚马逊与微软之间存在强烈的正相关。这些相关性表明可能存在相互依赖关系,并可以指导投资组合多元化策略。
  3. 风险调整回报:对夏普比率的评估提供了对股票风险调整绩效的见解。微软脱颖而出,成为夏普比率最高的股票,表明相较于其他股票和无风险投资,它具有更好的风险调整回报潜力。

总的来说,这些发现突显了在分析和选择股票进行投资时考虑波动性、相关性和风险调整回报等因素的重要性。通过充分考虑这些关键指标,投资者可以做出更为明智的决策,有效管理风险,并可能优化他们的投资组合。

本项目已经完结,欢迎点赞订阅:

(8-5-1)制作美股交易策略模型:项目介绍+准备环境-CSDN博客

(8-5-2)制作美股交易策略模型:准备环境+准备数据-CSDN博客

(8-5-3)制作美股交易策略模型:EDA+收盘价可视化-CSDN博客

(8-5-4)制作美股交易策略模型:波动性(收益率)分析-CSDN博客

(8-5-5)制作美股交易策略模型:使用有效前沿技术优化投资组合-CSDN博客

这篇关于(8-5-6)制作美股交易策略模型:投资组合模拟+可视化+结论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/772823

相关文章

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析

利用Python实现时间序列动量策略

《利用Python实现时间序列动量策略》时间序列动量策略作为量化交易领域中最为持久且被深入研究的策略类型之一,其核心理念相对简明:对于显示上升趋势的资产建立多头头寸,对于呈现下降趋势的资产建立空头头寸... 目录引言传统策略面临的风险管理挑战波动率调整机制:实现风险标准化策略实施的技术细节波动率调整的战略价

8种快速易用的Python Matplotlib数据可视化方法汇总(附源码)

《8种快速易用的PythonMatplotlib数据可视化方法汇总(附源码)》你是否曾经面对一堆复杂的数据,却不知道如何让它们变得直观易懂?别慌,Python的Matplotlib库是你数据可视化的... 目录引言1. 折线图(Line Plot)——趋势分析2. 柱状图(Bar Chart)——对比分析3

Python模拟串口通信的示例详解

《Python模拟串口通信的示例详解》pySerial是Python中用于操作串口的第三方模块,它支持Windows、Linux、OSX、BSD等多个平台,下面我们就来看看Python如何使用pySe... 目录1.win 下载虚www.chinasem.cn拟串口2、确定串口号3、配置串口4、串口通信示例5

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue