(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

相关文章

捷瑞数字业绩波动性明显:关联交易不低,募资必要性遭质疑

《港湾商业观察》施子夫 5月22日,山东捷瑞数字科技股份有限公司(以下简称,捷瑞数字)及保荐机构国新证券披露第三轮问询的回复,继续推进北交所上市进程。 从2023年6月递表开始,监管层已下发三轮审核问询函,关注到捷瑞数字存在同业竞争、关联交易、募资合理性、期后业绩波动等焦点问题。公司的上市之路多少被阴影笼罩。​ 业绩波动遭问询 捷瑞数字成立于2000年,公司是一家以数字孪生驱动的工

可视化实训复习篇章

前言: 今天,我们来学习seaborn库可视化,当然,这个建立在Matplotlib的基础上,话不多说,进入今天的正题吧!当然,这个是《python数据分析与应用》书中,大家有需求的可以参考这本书。 知识点: Matplotlib中有两套接口分别是pyplot和pyylab,即绘图时候主要导入的是Matplotlib库下的两个子模块(两个py文件)matplotlib.pyplot和matp

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

mysql索引四(组合索引)

单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引;组合索引,即一个索引包含多个列。 因为有事,下面内容全部转自:https://www.cnblogs.com/farmer-cabbage/p/5793589.html 为了形象地对比单列索引和组合索引,为表添加多个字段:    CREATE TABLE mytable( ID INT NOT NULL, use

大语言模型(LLMs)能够进行推理和规划吗?

大语言模型(LLMs),基本上是经过强化训练的 n-gram 模型,它们在网络规模的语言语料库(实际上,可以说是我们文明的知识库)上进行了训练,展现出了一种超乎预期的语言行为,引发了我们的广泛关注。从训练和操作的角度来看,LLMs 可以被认为是一种巨大的、非真实的记忆库,相当于为我们所有人提供了一个外部的系统 1(见图 1)。然而,它们表面上的多功能性让许多研究者好奇,这些模型是否也能在通常需要系

Windows/macOS/Linux 安装 Redis 和 Redis Desktop Manager 可视化工具

本文所有安装都在macOS High Sierra 10.13.4进行,Windows安装相对容易些,Linux安装与macOS类似,文中会做区分讲解 1. Redis安装 1.下载Redis https://redis.io/download 把下载的源码更名为redis-4.0.9-source,我喜欢跟maven、Tomcat放在一起,就放到/Users/zhan/Documents

人工和AI大语言模型成本对比 ai语音模型

这里既有AI,又有生活大道理,无数渺小的思考填满了一生。 上一专题搭建了一套GMM-HMM系统,来识别连续0123456789的英文语音。 但若不是仅针对数字,而是所有普通词汇,可能达到十几万个词,解码过程将非常复杂,识别结果组合太多,识别结果不会理想。因此只有声学模型是完全不够的,需要引入语言模型来约束识别结果。让“今天天气很好”的概率高于“今天天汽很好”的概率,得到声学模型概率高,又符合表达

智能客服到个人助理,国内AI大模型如何改变我们的生活?

引言 随着人工智能(AI)技术的高速发展,AI大模型越来越多地出现在我们的日常生活和工作中。国内的AI大模型在过去几年里取得了显著的进展,不少独创的技术点和实际应用令人瞩目。 那么,国内的AI大模型有哪些独创的技术点?它们在实际应用中又有哪些出色表现呢?此外,普通人又该如何利用这些大模型提升工作和生活的质量和效率呢?本文将为你一一解析。 一、国内AI大模型的独创技术点 多模态学习 多

【第十三课】区域经济可视化表达——符号表达与标注

一、前言 地图最直接的表达就是使用符号表达。使用符号可以把简单的点线面要 素渲染成最直观的地理符号,提高地图的可读性。只要掌握了 ArcGIS 符号制 作的技巧,分析符号并总结出规则,就可以制作符合要求的地图+符号。 (一)符号的选择与修改 符号的选择在制图中至关重要,使用符号选择器对话框可从多个可用样式 中选择符号,并且每个符号都有一个标签用来描述其图形特征,如颜色或类型, 利用这些标签可

OpenCompass:大模型测评工具

大模型相关目录 大模型,包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步,扬帆起航。 大模型应用向开发路径:AI代理工作流大模型应用开发实用开源项目汇总大模型问答项目问答性能评估方法大模型数据侧总结大模型token等基本概念及参数和内存的关系大模型应用开发-华为大模型生态规划从零开始的LLaMA-Factor