算法用负回报计算投资组合权重?

时间:2012-03-20 17:14:23

标签: python algorithm

更新:下面是完整的问题(完整形式有点复杂)这里是一个超级简化版本(这是我要问的核心)。如果我告诉你给我49和17的权重,你将取66(49 + 17)并将每个数除以66(49/66 = 74%和17/66 = 26%)。我的问题是,如果我在上述数字中添加负数-27,你会如何加权(如果我不能使用负重量)?

我不知何故需要在整体体重中代表负数,但负重却是在抛弃我的数字。 39(49 + 17 + -27),导致39/39 = 1.25%,17/39 = 44%,和-27 / 39 = -69%。所以在下面的例子中,如果这是股票,我给你100美元,你怎么知道买多少?


我在计算算法(或逻辑如何执行此操作)时遇到了一些麻烦。

Stock       percent of return              Return
Blue        .98                            50       
Red         .85                            20       
Black       .90                           -30      

它基本上向我们提供了一份报告,说我们要求.98%的回报率为50%,85%的回报率来自20%,90%的回报率来自-30(在这种情况下总回报率为39%) 。我不确定如何将其转化为实际的投资组合(如果我还没有持有该基金,那么购买这笔金额需要多少钱)?

我开始觉得这是不可能的,但我基本上都在问我是否给了你上面的表(名字,回报和我想要捕获的回报百分比)和$ 100你怎么能做出那个投资组合?如果我只给你一个50%的股票,并说我想要100%的回报你可以很容易地购买100美元的单一股票。有两只股票你可以添加总回报/权重并获得权重,但你怎么做处理你想要捕获的负面回报?

我不认为我做对了,但到目前为止这是我的逻辑(如果这是完全错误的,请忽略并建议你喜欢的任何东西)。

Get list of data
total_return = multiple percent_of_return and return (do this as a recursion for all stocks in the list)
take total of all items in total_return (using absolute numbers..no negatives so above 39 equals 42) and figure out the weight of each from that.
multiply these weights by stock price and divide by total to give weight.

结果是(注意:总数从39%变为93%):

Blue 0.52688172
red 0.182795699
black 0.290322581

问题,我真的不确定是否将负重量转换为绝对(正)重量。我不擅长数学(而且最差的是金融)但我不确定如何“买”一定数量的负回报(我给出的两个数据点,但如果需要,我可以用其他数据来丰富它,比如股票价格等)。另外,为了说清楚,我不是已经拥有这些投资组合所以我不能仅仅对现有的投资组合采取这些权重,我使用上述信息作为创建新投资组合的指导(只需要找出一个算法)这样做。)

请帮忙!

更新:我总是从代码中学习,所以这里是我的代码(在python中)和一些测试用例(它非常丑陋,因为我只是为了理解如何做到这一点的逻辑原型):

overall_total_value = []
def test(data_return, datacoeff, data_value):
    total_results = 0
    data_total_of_return = {}
    for x in data_return:
        current_value = data_return[x] * (datacoeff[x]*.001)
        data_total_of_return[x] = current_value
        total_results = total_results + current_value

    #abs
    abs_total_value = 0
    for x in data_total_of_return:
        #print x, '=', abs(data_total_of_return[x])
        abs_total_value = abs_total_value + abs(data_total_of_return[x])

    print abs_total_value
    weight = {}
    for x in data_total_of_return:
        weight[x] = abs(data_total_of_return[x]/abs_total_value)

    total_value = 0
    for x in weight:
        valuer = weight[x] * data_value[x]
        print x, weight[x], '=', valuer
        total_value = total_value + valuer

    print 'ABS total % return: ',total_results
    print total_value
    overall_total_value.append(total_value)

    print "*"*30


data_return = {'Blue':50, 'Red':20, 'Black':-30}
data_value = {'Blue':10.4, 'Red':4, 'Black':8}

datacoeff = { "Blue": 78 , "Red": 0 , "Black": 0 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 48 , "Red": 75 , "Black": 0 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 46 , "Red": 80 , "Black": 0 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 38 , "Red": 100 , "Black": 0 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 62 , "Red": 100 , "Black": 40 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 100 , "Red": 20 , "Black": 50 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 98 , "Red": 55 , "Black": 70 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 90 , "Red": 75 , "Black": 70 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 100 , "Red": 65 , "Black": 80 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 98 , "Red": 70 , "Black": 80 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 96 , "Red": 75 , "Black": 80 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 94 , "Red": 80 , "Black": 80 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 92 , "Red": 85 , "Black": 80 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 90 , "Red": 90 , "Black": 80 , }
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 88 , "Red": 95 , "Black": 80 , }
test(data_return, datacoeff, data_value)
test(data_return, datacoeff, data_value)
datacoeff = { "Blue": 98 , "Red": 100 , "Black": 100 , }
test(data_return, datacoeff, data_value)

4 个答案:

答案 0 :(得分:1)

现在你正试图从回归中计算出这个。如果您能够包括当前市场价值(即,如果您现在出售它们的当前(价格*大小),您将获得您的投资组合中每个头寸的实际权重。从那里可以很简单地将这个< 1的权重乘以你注入投资组合的任何现金。

如果您有权访问股票价格,请将其拉​​入并使用以下逻辑。

decimal portfolioAssets;
Dictionary<stock, decimal> stockAssets = new Dictionary<stock, decimal>();
foreach(stock in stocks)
{
    decimal assets = stock.Shares*stockPrice;
    portfolioAssets =+ assets;
    stockAssets.Add(stock, assets);
}

foreach(stock in stocks)
{
decimal weight = stockAssets[stock]/portfolioAssets;
//do something with weight 
}

答案 1 :(得分:1)

我认为你的这一切都是错的(或者你的数据有些混乱)。 我假设退货栏是你事先没有的东西,否则你可以搞套利,这是无稽之谈。 基本理论:一些股票具有正β系数(它们与市场一致),其他股票具有负β系数(它们与市场相反)。在你提出的情况下,前两个股票(可能)具有相同符号的β系数,而剩下的一个是相反符号的β系数。因此,由于您试图减少损失,因此您的一只股票有负回报是正常的,因为损失被其他两只股票的收益所抵消。

为了简单起见,我们假设您正在尝试投资100美元。

你想得到第一只股票的回报率为.98(无论它们是什么)。

你希望得到第二只股票的回报率为.85(无论它们是什么)。

你想得到第三股股票的回报率.90(无论他们是什么)。

现在让我们规范化所需的回报,使它们总和为1(并保持比例!)。

对于您想要购买的投资组合中的每个$:

.98 /(.98 + .85 + .90)= 0.358974358974359 $第一批股票

.85 /(。98 + .85 + .90)= 0.31135531135531136 $第二股

.90 /(.98 + .85 + .90)= 0.32967032967032966 $第三股

因此,考虑到您的100美元捐赠并假设您可以自由购买部分股票,您将分别投资:

35.90美元,31.14美元,32.96美元

最后,(事实并非如此!)每当你在期望的回报(第一栏)中找到减号时,它实际上意味着你卖空该股票(即借入标的资产以卖出它以非常高的价格开发未来。

>>> desired_returns = [.98,.85,.9]
>>> real_weights = [i/sum([abs(j) for j in desired_returns]) for i in desired_returns]
>>> real_weights
[0.358974358974359, 0.31135531135531136, 0.32967032967032966]
>>> cash_available=100
>>> labels=['blue','red','green']
>>> for i in range(len(desired_returns)):
...     if desired_returns[i]>=0:
...          print "Buy %s$ of the stock %s" % (cash_available*real_weights[i],labels[i])
...     else:
...           print "Short sell %s$ of the stock %s" % (abs(cash_available*real_weights[i]),labels[i])
Buy 35.8974358974$ of the stock blue
Buy 31.1355311355$ of the stock red
Buy 32.967032967$ of the stock green

答案 2 :(得分:0)

你能用ABS()包围你的整个公式,以返回绝对值,这会消除你的负数吗?

答案 3 :(得分:0)

如果你的头寸很短,那么股票的数量肯定是负数吗?如果你有一个-ve数量的股票,每个股票都有-ve值,你的投资组合中将有+ ve值。但总的来说,+ / - 符号没有必要匹配,为什么你不能持有已经失去价值并为你的财富做出贡献的股票呢?

如果您购买了90股价值30美元的股票,那么您已经损失了2700个(或者当地货币)。就个人而言,我认为对投资组合总价值的贡献为-34.54%并不存在问题。但是,我同意你的一只股票对你的投资组合的价值贡献超过100%看起来有点奇怪。这表明您可能应该按照您所关联的问题的答案中给出的建议,并忽略,在对投资组合中的持股价值进行加权时,完全为负值。

在你的情况下,我不会做的是开始忽略-ve数字,因为它们会使你的结果看起来不整洁。包含在 - 中的信息对于评估您的投资组合至关重要。选择适合您目的的原始信息的推导,我的意思是,如果您不喜欢按照问题计算权重的方式,请选择一个适合您目的的统计数据。

相关问题