APP下载
报价宝  ›  科技  › 

使用Python优化:如何以最少的风险赚最多的钱?

报价宝 来源:baojiabao.com 发布时间:2019-06-30 16:48:00 10月26日更新
报价宝综合消息使用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的优化框架)在短时间内建立线性规划模型。

掌握这些灵活而强大的软件包的工作知识为即将到来的资料科学家的技能组合带来了巨大的价值,因为解决优化问题的需求出现在科学、技术和业务问题的各个方面。我们鼓励读者尝试更复杂的投资问题,以获得乐趣和学习。

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 报价宝 数码相机价格 手机价格 汽车价格 笔记本电脑价格