'''
# initialize list of lists
data = {'Portfolio1': [20, 9.99, 20, 40, 10], 'Portfolio2': [20,
40, 10.02, 20, 10], 'Portfolio3': [20, 40, 20, 9.98, 10],
'Portfolio4': [20, 40, 20, 10.02, 10]}
df = pd.DataFrame(data)
# print dataframe.
df
'''
Output:
Portfolio 1 Portfolio 2 Portfolio 3 Portfolio 4
20. 20. 20. 20.
9.99 40. 40. 40.
20. 10.02 20. 20.
40 20 9.98 10.02
10. 10. 10. 10.
目標是遍歷投資組合的權重,直到它們加起來正好是 100%
1.) 識別模型中最大權重的安全性
2.) 如果總計 < 100%,則將 0.01% 添加到模型中最大權重的安全性。如果總數 > 100%,則減去 0.01% 到模型中最大權重的安全性。
3.) 檢查總和是否為 100%。如果是,那么停止。如果不是,則重復。
4.) 還需要考慮最大值的變化可能會產生先前較小值的相等權重的可能性(即 40 的最大值更改為 39.99 現在也等于 pandas 列中的現有值,該值等于39.99)。非常罕見的邊緣情況,這就是為什么需要將值增加或減少 0.01 并繼續遍歷列以查看更新的最大值現在是否等于現有值
Current Code=
max_allocation = df['Target Allocation'].idxmax()
allocation_sum = df['Target Allocation'].sum()
def weight_algo(df):
for x in df['Target Allocation']:
if allocation_sum > 100.0:
max_allocation = df['Target Allocation'].max() - 0.01
elif allocation_sum < 100:
max_allocation = df.at[max_allocation] 0.01
else:
break
return df
weight_algo(data)
此函式不會更改最大分配的值,但我沒有收到任何錯誤?
uj5u.com熱心網友回復:
不太確定您對 key 的使用Target Allocation,但如果您的計劃是調整最大持有權重,直到您擁有 100% 的投資組合分配,您可以使用以下代碼在每列上運行一個回圈。
必須注意,如果您的最大重量的小數精度大于 2 位小數,這將不起作用。
portfolios = df.columns
for p in portfolios:
currSum = df[p].sum()
while currSum != 100:
currMax = df[p].idxmax()
if currSum < 100:
df.loc[currMax, p] = 0.01
else:
df.loc[currMax, p] -= 0.01
currSum = df[p].sum()
您撰寫的代碼的問題在于您沒有更新原始資料框,而是增加了單獨變數中最大行的索引。這條線
max_allocation = df.at[max_allocation] 0.01
不正確,尤其是因為您要向整數索引添加分數。另一方面,您只對資料框進行一次傳遞,而實際上在收斂到解決方案之前可能需要幾次迭代。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/392019.html
