(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

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

hdu4869(逆元+求组合数)

//输入n,m,n表示翻牌的次数,m表示牌的数目,求经过n次操作后共有几种状态#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#includ

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费