更新:下面是完整的问题(在它的完整形式有点复杂)这里有一个超级简化的版本(这是我问的核心)如果我告诉你给我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

它基本上为我们提供了一份报告,说我们想要50%的回报率的98%,20%的回报率的85%,以及-30%的回报率的90%(本例中的总数是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

这个问题,我真的不确定是不是把一个负重转换成一个绝对(正)重。我不擅长数学(最糟糕的是金融学),但我不确定如何“购买”1%的负回报(我给出的两个数据点,但如果需要,我可以用其他数据来充实它,如股价等)。另外,为了说明清楚,我已经不拥有这些投资组合了,所以我不能仅仅对现有的投资组合采取这些权重,我用上面的信息作为指导来创造一个新的(只需要找出一个ALGO去做)。
请帮忙!
更新:我总是从代码中学习,所以这里是我的代码(在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)

最佳答案

在我看来,你完全弄错了(或者你的数据有些混乱)。
我假设回报栏是你事先没有的,否则你可以进行套利,这是胡说八道。
基本理论:有些股票的贝塔系数为正(随市场变化),有些股票的贝塔系数为负(逆市场变化)在这种情况下,你已经提出前两个股票(可能)有一个相同符号的贝塔系数,其余的一个是相反符号的贝塔系数。因此,由于你试图减少损失,你的一只股票出现负回报是正常的,因为损失被另外两只股票的收益所抵消。
为了简单起见,我们假设您正试图投资100美元。
你想从第一只股票(不管是什么)中得到.98的回报。
你想得到第二只股票的0.85的回报(不管它们是什么)。
你想得到第三只股票(不管是什么)的0.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

关于python - 计算负 yield 的投资组合权重的算法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9791671/

10-12 20:17