原文:
www.kdnuggets.com/2019/06/optimization-python-money-risk.html
现代数据科学和分析企业的主要目标之一是为商业和技术公司解决复杂的优化问题以最大化他们的利润。
在我的文章“使用 Python 的线性规划和离散优化”中,我们涉及了基本的离散优化概念,并介绍了一个用于解决此类问题的Python 库 PuLP。
1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。
2. 谷歌数据分析专业证书 - 提升你的数据分析技能
3. 谷歌 IT 支持专业证书 - 支持你的组织 IT 部门
尽管线性规划 (LP) 问题仅由线性目标函数和约束定义,但它可以应用于从医疗保健到经济学、商业到军事等各种不同领域的惊人广泛的问题。
在这篇文章中,我们展示了一个使用 Python 编程的线性规划的惊人应用——在最小化相关风险的同时最大化股市投资组合的预期利润。
听起来有趣吗?请继续阅读。
1990 年诺贝尔经济学奖颁给了哈里·马科维茨,他因其著名的现代投资组合理论 (MPT)而受到认可。该理论的原始论文早在 1952 年就已发表。
来源:AZ Quotes
这里的关键字是平衡。
一个好的平衡投资组合必须提供保护(最小化风险)和机会(最大化利润)。
当涉及到最小化和最大化等概念时,将问题用数学优化理论来表述是很自然的。
基本思想相当简单,根植于人类固有的厌恶风险的天性中。
一般来说,股市统计数据显示,较高的风险与更高回报的概率相关,而较低的风险与较低回报的概率相关。
MPT 假设投资者是厌恶风险的,即在两个投资组合提供相同预期回报的情况下,投资者将更偏好于风险较小的那个。想一想,只有在高风险股票具有较高回报概率时,你才会选择它们。
但如何量化风险?这确实是一个模糊的概念,对不同的人可能有不同的含义。然而,在普遍接受的经济理论中,股票价格的变动性(波动性)(在固定时间范围内定义)等同于风险。
因此,核心优化问题是最小化风险,同时确保一定的利润回报。或者,在保持风险低于某个阈值的情况下最大化利润。
在本文中,我们将展示投资组合优化问题的一个非常简化的版本,该版本可以转化为 LP 框架,并通过简单的 Python 脚本高效解决。
目标是展示这些优化求解器在解决复杂现实问题中的能力和可能性。
我们使用了三只股票的 24 个月股价(月均值)——微软、Visa、沃尔玛。这些数据较旧,但完美展示了这个过程。
图:三家公司在某个 24 个月期间的月度股价。
如何定义回报?我们可以通过从当前月份的平均股价中减去前一个月的平均股价,并除以前一个月的价格来简单地计算滚动的月度回报。
回报如图所示,
股票的回报是一个不确定的量。我们可以将其建模为随机向量。
投资组合也可以建模为一个向量。
因此,某一投资组合的回报由这些向量的内积给出,它是一个随机变量。百万美元的问题是:
我们如何比较随机变量(对应不同投资组合)以选择“最佳”投资组合?
按照 Markowitz 模型,我们可以将问题表述为,
给定固定金额的钱(比如 $1000),我们应该如何在三只股票中进行投资,以便 (a) 一个月的期望回报至少达到给定的阈值,并且 (b) 最小化投资组合回报的风险(方差)。
我们不能投资负的数量。这是非负性约束,
假设没有交易成本,总投资受限于现有资金,
投资回报,
但这是一个随机变量。所以,我们必须使用期望数量,
假设我们想要一个最小期望回报。因此,
现在,为了建模风险,我们必须计算方差,
总结起来,最终的优化模型是,
接下来,我们展示使用流行的 Python 库来制定和解决这个问题是多么简单。
我们将使用的库是叫做CVXPY的。它是一个嵌入 Python 的凸优化问题建模语言。它允许你以自然的方式表达你的问题,遵循数学模型,而不是求解器要求的限制性标准形式。
完整代码见此 Jupyter notebook。这里,我只展示核心代码片段。
为了设置必要的数据,关键是从每月价格的数据表中计算回报矩阵。代码如下,
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 包的示例页面 以了解使用该框架可以解决的优化问题的广度。
在这篇文章中,我们讨论了如何利用经典经济理论中的关键概念来制定一个简单的股票市场投资优化问题。
为了说明,我们以三家公司每月平均股价的样本数据集为例,展示了如何使用 NumPy、Pandas 等基础 Python 数据科学库以及一个叫做 CVXPY 的优化框架快速建立线性规划模型。
对这些灵活且强大的包有工作知识,对未来的数据科学家来说具有极大的价值,因为在科学、技术和商业问题的各个方面都需要解决优化问题。
鼓励读者尝试更复杂的投资问题版本,以便享受乐趣和学习。
原文。转载许可。
简介: Tirthajyoti Sarkar 是 ON Semiconductor 的高级首席工程师,负责基于深度学习/机器学习的设计自动化项目。
相关内容: