我有一个每日回报为6个投资组合(PORT1,PORT2,PORT3,... PORT6)的数据框。
我已经定义了复合年收益和风险调整收益的功能。我可以为任何一个PORT运行此功能。
我想找到投资组合的组合(假设权重相等)以获得最高的回报。例如,PORT1,PORT3,PORT4和PORT6的组合可能会提供最高风险调整后的收益。有没有一种方法可以在所有组合上自动运行定义的功能并获得所需的组合?
未包含任何代码,因为我认为没有必要显示用于确定风险调整收益的计算。
def returns(PORT):
val = ... [computation of return here for PORT]
return val
答案 0 :(得分:2)
在多维空间中找到最佳位置是可能的,但是人们已经发了大财,找到了实现此目标的更好方法。
一开始的问题是列出您的可能性空间。您有6个维度,并且大概要在所有6个维度中分配1个单位的“填充”,以使分配向量{a,b,c,d,e,f
}总计为1
。那仍然是一个无穷大的数字,所以也许我们只以0.10的增量开始。因此,在6个维度上有10种增量可能,为您提供10 ^ 6种可能性。
因此,简单的暴力破解方法将是“简单地”在整个参数空间中运行函数,存储值并选择最佳值。
这可能不是您想要的答案,还存在其他方法,包括随机化猜测并将结果限制在更易于管理的范围内。但是性能的提高却被不确定性和与客户的潜在困难对话所抵消:“这是什么意思呢?”。
要对最佳选择进行猜测,了解每个投资组合在不同情况下的响应曲线以及您可能期望其在何种风险/回报下运行将很有帮助。它们是线性的,二次的还是更复杂的?如果可以对其进行数学建模,则可以使用算法来减少搜索空间。
简短(但基本的)答案是"it depends"
。
答案 1 :(得分:1)
你可以
import itertools
best_return = 0
for r in range(len(PORTS)):
for PORT in itertools.combinations(PORTS,r):
cur_return = returns(PORT)
if cur_return > best_return :
best_return = cur_return
best_PORT = PORT
您也可以
max([max([PORT for PORT in itertools.combinations(PORTS,r)], key = returns)
for r in range(len(PORTS))], key = returns)
但是,与CS相比,这更是一个经济学问题。给定一组头寸及其收益和风险,有明确的公式可以找到最佳投资组合而不必强求它。