计算负收益证券组合权重的算法?

2024-10-01 13:28:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

它基本上为我们提供了一份报告,说我们想要0.98%的50%的回报率,85%的20%的回报率和90%的-30%的回报率(在这个例子中,总共是39%)。我不确定如何将其转化为实际的投资组合(比如,如果我还没有持有该基金,要买多少钱才能得到这笔钱)?在

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

我不认为我是正确的,但这是我目前的逻辑(如果这是完全错误的,请忽略并建议任何你喜欢的)。在

^{pr2}$

结果是(注:合计从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)

Tags: oftestdatareturnvalueblueredabs
3条回答

你能用ABS()将整个公式括起来,返回绝对值,这样可以消除负数吗?在

现在你要计算整个收益。如果你能同时包括当前的市场价值(即,如果你现在出售这些头寸的话,那么你将获得投资组合中每个头寸的实际权重。从这里开始,你只需将这个权重乘以你在投资组合中注入的现金。在

如果你能接触到股票价格,把它拉进来,然后使用下面的逻辑。在

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 
}

在我看来,你完全弄错了(或者你的数据有些混乱)。 我假设收益列是你事先没有的,否则你可能会进行套利,这是无稽之谈。 基本理论:有些股票的贝塔系数是正的(随大流),有些股票的贝塔系数是负的(它们与市场背道而驰)。在你提出的情况下,前两只股票(可能)有一个相同符号的贝塔系数,而剩下的一个具有相反符号的贝塔系数。因此,由于你试图减少损失,你的一只股票出现负回报是正常的,因为损失被另外两只股票的收益所抵消。在

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

你想得到第一支股票的0.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

相关问题 更多 >