实践篇:我用Python实现最大化投资利润同时最小化风险

点击上方关注,All in AI中国

学习如何应用Python数据科学库来开发一个基于诺贝尔奖获奖经济学理论的简单优化问题,以最大化投资利润同时最小化风险。通过端到端AutoML R2释放您的大数据

介绍

现代数据科学和分析企业的主要目标之一是为业务和技术公司解决复杂的优化问题,以最大化其利润。

在我的文章“使用Python进行线性编程和离散优化”中,我们讨论了基本的离散优化概念,并介绍了用于解决此类问题的Python库PuLP。

尽管线性规划(LP)问题仅由线性目标函数和约束定义,但它可以应用于从医疗保健到经济、商业到军事等不同领域中的各种各样的问题。

在本文中,我们展示了在经济规划领域使用Python编程实现LP的一个如此惊人的应——最大化股票市场投资组合的预期利润,同时最大限度地降低与之相关的风险。

如何最大化利润并最大限度地降低股票市场的风险?

1990年诺贝尔经济学奖获得者哈里马科维茨(Harry Markowitz)因其现代投资组合理论(MPT)而闻名。原始论文早在1952年就已出版。

来源:AZ Quotes

这里的关键词是平衡。

一个良好、平衡的投资组合必须同时提供保护(最小化风险)和机会(最大化利润)。

而且,当涉及最小化和最大化等概念时,用数学优化理论来解释问题是很自然的。

基本思想相当简单,植根于风险厌恶的内在人性。

一般而言,股票市场统计数据表明,较高的风险与较高的回报概率和较低的风险相关,而较小的回报概率较大。

MPT假设投资者厌恶风险,这意味着如果两个投资组合提供相同的预期回报,投资者将更喜欢风险较低的投资组合。想一想,通常大家都会在股票具有高回报率的情况下才会买入。

但是如何量化风险呢?这确实是一个模糊的概念,可能对不同的人意味着不同的东西。然而,在普遍接受的经济理论中,股票价格的变化(波动性)(在固定时间范围内定义)等同于风险。

因此,中心优化问题是在确保一定数量的利润回报的同时将风险降至最低。或者,在保持风险低于某个阈值的同时最大化利润。

一个示例问题

在本文中,我们将展示组合优化问题的一个非常简化的版本,可以将其转换为LP框架,并使用简单的Python脚本有效地解决。

目标是说明这种优化求解器的能力和可能性,以解决复杂的现实问题。

我们使用24个月的股票价格(月平均值)为三家公司的股票 - 微软、Visa、沃尔玛。这些是较旧的数据,但它们完美地展示了这一过程。

图:三个公司在特定24个月期间的月度股票价格

如何定义返回值?我们可以通过从当前月份减去上个月的平均股票价格并除以上个月的价格来简单地计算滚动月度回报。

返回值如下图所示,

优化模型

股票的回报率是不确定的数量,我们可以将其建模为随机向量。

投资组合也可以建模为矢量。

因此,某些投资组合的回报由这些向量的内积给出,并且它是一个随机变量。最重要的问题是:

我们如何比较随机变量(对应不同的投资组合)来选择“最佳”投资组合?

按照Markowitz模型,我们可以将问题表述为,

给定固定数量的货币(比如1000美元),我们应该对三种股票中的每一只投资多少,以便(a)一个月的预期回报率至少达到给定的阈值,且最小化投资组合回报率的风险(方差)。

我们不能投资负数。这是非负性约束,

假设没有交易成本,总投资受到手头基金的限制,

投资回报,

这是一个随机变量。所以,我们必须使用预期的数量,

假设我们想要最低预期回归。因此,

为了建立风险模型,我们必须计算方差,

总之,最终的优化模型是,

接下来,我们展示了如何使用一个流行的Python库来制定和解决这个问题。

使用Python来解决优化问题:CVXPY

我们将用于此问题的库名为CVXPY。它是一种用于凸优化问题的Python嵌入式建模语言。它允许您以遵循数学模型的自然方式表达您的问题,而不是按照解决程序所要求的限制性标准形式表达您的问题。

整个代码在这个Jupyter笔记本中给出。在这里,我只展示核心代码片段。

要设置必要的数据,关键是从月度价格的数据表计算返回矩阵。代码如下,

import numpy as np
import pandas as pd
from cvxpy import *
mp = pd.read_csv("monthly_prices.csv",index_col=0)
mr = pd.DataFrame()
# compute monthly returns
for s in mp.columns:
date = mp.index[0]
pr0 = mp[s][date]
for t in range(1,len(mp.index)):
date = mp.index[t]
pr1 = mp[s][date]
ret = (pr1-pr0)/pr0
mr.set_value(date,s,ret)
pr0 = pr1

现在,如果你并排查看原始数据表和返回表,它看起来如下,

接下来,我们简单地从该返回矩阵计算均值(预期)返回值和协方差矩阵,

# Mean return
r = np.asarray(np.mean(return_data, axis=1))
# Covariance matrix
C = np.asmatrix(np.cov(return_data))

之后,CVXPY允许简单地按照我们上面构建的数学模型来设置问题,

# Get symbols
symbols = mr.columns
# Number of variables
n = len(symbols)
# The variables vector
x = Variable(n)
# The minimum return
req_return = 0.02
# The return
ret = r.T*x
# The risk in xT.Q.x format
risk = quad_form(x, C)
# The core problem definition with the Problem class from CVXPY
prob = Problem(Minimize(risk), [sum(x)==1, ret >= req_return, x >= 0])

请注意使用CVXPY框架中非常有用的类,如quad_form()和Problem()。

瞧!

我们可以编写一个简单的代码来解决问题并显示最佳投资数量,确保最小回报率为2%,同时将风险保持在最低水平。

try:
prob.solve()
print ("Optimal portfolio")
print ("----------------------")
for s in range(len(symbols)):
print (" Investment in {} : {}% of the portfolio".format(symbols[s],round(100*x.value[s],2)))
print ("----------------------")
print ("Exp ret = {}%".format(round(100*ret.value,2)))
print ("Expected risk = {}%".format(round(100*risk.value**0.5,2)))
except:
print ("Error")

最终结果是,

扩展问题

毋庸置疑,我们模型的设置和简化假设可以使这个问题听起来比实际问题简单得多。但是一旦你理解了解决这种优化问题的基本逻辑和机制,你就可以将它扩展到多个场景,

  • 数百只股票,较长时间跨度的数据
  • 多个风险/回报比率和门槛
  • 最小化风险或最大化回报(或两者兼而有之)
  • 一起投资一组公司
  • 要么投资百事可乐,要么投资可口可乐,但不要两者都投资。

您必须构造更复杂的矩阵和更长的约束列表,使用指示符变量将其转换为混合整数问题 - 但所有这些都由CVXPY等软件包本身支持。

查看CVXPY包的示例页面,了解可以使用框架解决的优化问题的范围。

总结

在本文中,我们讨论了如何使用开创性经济理论中的关键概念来为股票市场投资制定一个简单的优化问题。

为了说明,我们选取了三家公司的月平均股价作为样本数据集,并展示了如何使用基本的Python数据科学库(如NumPy、Pandas和名为CVXPY的优化框架)在短时间内建立线性规划模型。

掌握这些灵活而强大的软件包的工作知识为即将到来的数据科学家的技能组合带来了巨大的价值,因为解决优化问题的需求出现在科学、技术和业务问题的各个方面。

我们鼓励读者尝试更复杂的投资问题,以获得乐趣和学习。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();