对于每个项目,与数组中的其他两个项目一起计算

2024-10-01 11:26:39 发布

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

对于一个学校项目,我试图计算在给定历史日期由三只股票组成的最高表现投资组合(夏普比率)。你知道吗

我已经知道如何用python收集信息并计算平均收益和方差。然而,我不知道如何迭代数据并比较所有可能投资组合的结果。

例如:

result 1 = stockA + stock B + stock C
result 2 = stockB + Stock C + Stock D
result 3 = stockC + Stock D + Stock E

等等,等等

更为复杂的是,这些股票将被加权。我知道在每种组合中为3只股票做所有可能的权重计算需要几天的时间,所以我打算做一些更精简的事情:

# checks to see which stock will perform better with higher weight:

trialstockA = (stockA * .75) + (stockB * .125) + (stockC * .125)
trialstockB = (stockA * .125) + (stockB * .75) + (stockC * .125)
trialstockC = (stockA * .125) + (stockB * .125) + (stockC * .75)

# if trialstockA should be weighed higher:

if trialstockA > trialstockB and trialstockC:

trialstockA2 = (stockA * .95) + (stockB * .025) + (stockC * .025)
trialstockA3 = (stockA * .85) + (stockB * .075) + (stockC * .075)
trialstockA4 = (stockA * .80) + (stockB * .10) + (stockC * .10)
trialstockA5 = (stockA * .70) + (stockB * .15) + (stockC * .15)
trialstockA6 = (stockA * .65) + (stockB * .175) + (stockC * .175)
trialstockA7 = (stockA * .60) + (stockB * .20) + (stockC * .20)
trialstockA8 = (stockA * .55) + (stockB * .225) + (stockC * .225)
trialstockA9 = (stockA * .50) + (stockB * .25) + (stockC * .25)

然而,这一部分不那么重要。我只是不知道如何迭代每个可能的投资组合。我可以将数据导出到CSV文件中,在CSV文件中它将显示为[NAME (string) ,MEAN RETURN (INT) ,VARIANCE (INT), RISK (INT)],例如[AAPL, .427, .1957, .442],也可以将它们作为变量留在一个scrapy项目中。我有一种感觉,CSV方法可能更容易。你知道吗

我还想知道把这些股票分成三组是否有帮助?你知道吗

希望这是有意义的。不知道还能提什么。。。你知道吗

提前谢谢你的帮助!你知道吗

更新

对于每个股票组合和每个权重组合,目标是在股票组合命名为stockA、stockB和StockC的情况下进行以下计算。为了节省时间,我将把每个股票数据导出到一个csv中,在csv中,股票均值、方差、标准差(风险)和收益列表(大约100个数字)存储在每行股票的不同列中。你知道吗

首先,需要找出两种股票组合之间的相关性:

stockAB_corr = numpy.corrcoef(stockA_returns, stockB_returns)[0, 1]
stockAC_corr = numpy.corrcoef(stockA_returns, stockC_returns)[0, 1]
stockBC_corr = numpy.corrcoef(stockB_returns, stockC_returns)[0, 1]

然后,我们可以运行以下函数:

portfolio_return =  (stockA[avgret] * stockA[weight]) + (stockB)
portfolio_variance = ((stockA[weight]^2) * stockA[variance]) + ((stockB[weight]^2) * stockB[variance]) + ((stockC[weight]^2) * stockC[variance]) + (2*stockA[weight]*stockB[weight]*stockAB_corr*stockA[risk]*stockB[risk]) + (2*stockA[weight]*stockC[weight]*stockAC_corr*stockA[risk]*stockC[risk]) + (2*stockB[weight]*stockC[weight]*stockBC_corr*stockB[risk]*stockC[risk]) 
portfolio_risk = portfolio_variance ** 0.5

Sharpe = (porfolio_return - 0.03)/portfolio_variance

夏普比率是最终的结果。对于每种股票,已经计算出它们各自的方差和平均值。你知道吗


Tags: 数据stockresultreturns股票riskweight方差
1条回答
网友
1楼 · 发布于 2024-10-01 11:26:39

根据@aron的评论,您可以使用^{}模块,特别是^{}^{}。你知道吗

您可以使用combinations从所有可能股票的列表中创建股票集合,使用permutationsset对权重进行唯一排序,使用zipyield从生成器函数将它们合并。你知道吗

import itertools

stocks = ['stock{}'.format(x) for x in xrange(10)]
weights_list = [(0.95, 0.025, 0.025),
               (0.90, 0.05, 0.05),
               (0.85, 0.075, 0.075),
               (0.80, 0.1, 0.1),
               (0.75, 0.125, 0.125),
               (0.70, 0.15, 0.15),
               (0.65, 0.175, 0.175),
               (0.60, 0.20, 0.20),
               (0.55, 0.225, 0.225),
               (0.50, 0.25, 0.25)]


def portfolios(stocks, weights_list):
    for stock_triplet in itertools.combinations(stocks, 3):
        for weights in weights_list:
            unique_weight_orders = set(itertools.permutations(weights))
            for weight_order in unique_weight_orders:
                yield zip(stock_triplet, weight_order)


for port in portfolios(stocks, weights_list):
    print port

输出如下所示:

>>> ...
[('stock0', 0.95), ('stock1', 0.025), ('stock2', 0.025)]
[('stock0', 0.025), ('stock1', 0.025), ('stock2', 0.95)]
[('stock0', 0.025), ('stock1', 0.95), ('stock2', 0.025)]
[('stock0', 0.075), ('stock1', 0.075), ('stock2', 0.85)]
[('stock0', 0.075), ('stock1', 0.85), ('stock2', 0.075)]
[('stock0', 0.85), ('stock1', 0.075), ('stock2', 0.075)]
[('stock0', 0.1), ('stock1', 0.1), ('stock2', 0.8)]
...

相关问题 更多 >