我是一個新的 python 用戶,試圖從 Excel 中改進。到目前為止,我大部分時間都在管理,但我陷入了回圈。我正在研究的示例是創建一個股票指數(或投資組合),其中單個股票的權重將基于其市值,但上限為一定水平。我從這些數字開始:
import pandas as pd
df=pd.DataFrame(
{
"Ticker":[
"AAPL","GOGL","AMZN","NVDA","MSFT","NFLX",
],
"mcap":[100000,50000,10000,2000,1000,1000],
}
)
這給了我這個:
Ticker mcap
0 AAPL 100000
1 GOGL 50000
2 AMZN 10000
3 NVDA 2000
4 MSFT 1000
5 NFLX 1000
接下來,我定義了優化步驟和股票在指數中可以擁有的最大權重:
step=0.05
max_weight_in_index=0.3
然后我以一種允許我限制個人重量的方式擴展了表格。基本上,我放入指數(mcap_in_index)的股票總價值等于 mcap * Correction_factor。目前該因子為 1,這意味著所有股票都以其完整的 mcap 進入指數。指數中股票的權重是根據 mcap_in_index 計算的。最后一列(needs_correcting)基本上告訴我是否需要調整校正因子。如果一只股票在指數中的當前權重高于我之前定義的最大權重,則應予以糾正。這就是我如何到達這一步:
df["correction_factor"]=1
df["mcap_in_index"]=df["mcap"]*df["correction_factor"]
df["weight_in_index"]=df["mcap_in_index"]/df["mcap_in_index"].sum()
df.loc[df["weight_in_index"]<=max_weight_in_index,"needs_correcting"]=0
df.loc[df["weight_in_index"]>max_weight_in_index,"needs_correcting"]=1
現在我的表格看起來像這樣(如您所見,我無法弄清楚如何以更具視覺吸引力的方式顯示它,對此感到抱歉):
Ticker mcap correction_factor mcap_in_index weight_in_index needs_correcting
0 AAPL 100000 1 100000 0.609756 1.0
1 GOGL 50000 1 50000 0.304878 1.0
2 AMZN 10000 1 10000 0.060976 0.0
3 NVDA 2000 1 2000 0.012195 0.0
4 MSFT 1000 1 1000 0.006098 0.0
5 NFLX 1000 1 1000 0.006098 0.0
現在我正在查看列需要校正。1 表示股票的當前權重超過了我使用 max_weight_in_index 允許的權重。校正是通過按我之前定義的步驟減小校正因子來完成的。然后我重新計算其他所有內容:
df.loc[df["needs_correcting"]==1,"correction_factor"]=df["correction_factor"]-step
df["mcap_in_index"]=df["mcap"]*df["correction_factor"]
df["weight_in_index"]=df["mcap_in_index"]/df["mcap_in_index"].sum()
df.loc[df["weight_in_index"]<=max_weight_in_index,"needs_correcting"]=0
df.loc[df["weight_in_index"]>max_weight_in_index,"needs_correcting"]=1
現在我的桌子看起來像這樣。如您所見,在 AAPL 和 GOGL 的情況下,它從校正因子中減去了步長。
Ticker mcap correction_factor mcap_in_index weight_in_index needs_correcting
0 AAPL 100000 0.95 95000.0 0.607029 1.0
1 GOGL 50000 0.95 47500.0 0.303514 1.0
2 AMZN 10000 1.00 10000.0 0.063898 0.0
3 NVDA 2000 1.00 2000.0 0.012780 0.0
4 MSFT 1000 1.00 1000.0 0.006390 0.0
5 NFLX 1000 1.00 1000.0 0.006390 0.0
我想不出的是一種回圈最后一步的方法。基本上,重做最后一步,直到 needs_correcting 中的所有值都等于 0(它們的總和必須等于 0)。
手動“回圈”,我得到了下表。這是代碼理想情況下應該做的事情。當然,在現實生活中,我將使用的步驟會小得多,因此“手動”回圈將永遠耗時且毫無意義。
Ticker mcap correction_factor mcap_in_index weight_in_index needs_correcting
0 AAPL 100000 0.1 10000.0 0.294118 0.0
1 GOGL 50000 0.2 10000.0 0.294118 0.0
2 AMZN 10000 1.0 10000.0 0.294118 0.0
3 NVDA 2000 1.0 2000.0 0.058824 0.0
4 MSFT 1000 1.0 1000.0 0.029412 0.0
5 NFLX 1000 1.0 1000.0 0.029412 0.0
對不起,很長的帖子,這是我第一次在這里發帖,我不知道如何解釋我想要做什么。
uj5u.com熱心網友回復:
while df["needs_correcting"].sum()>0:
df.loc[df["needs_correcting"]==1,"correction_factor"]-=step
df["mcap_in_index"]=df["mcap"]*df["correction_factor"]
df["weight_in_index"]=df["mcap_in_index"]/df["mcap_in_index"].sum()
df.loc[df["weight_in_index"]<=max_weight_in_index,"needs_correcting"]=0
df.loc[df["weight_in_index"]>max_weight_in_index,"needs_correcting"]=1
df
###
Ticker mcap correction_factor mcap_in_index weight_in_index \
0 AAPL 100000 0.1 10000.0 0.294118
1 GOGL 50000 0.2 10000.0 0.294118
2 AMZN 10000 1.0 10000.0 0.294118
3 NVDA 2000 1.0 2000.0 0.058824
4 MSFT 1000 1.0 1000.0 0.029412
5 NFLX 1000 1.0 1000.0 0.029412
needs_correcting
0 0.0
1 0.0
2 0.0
3 0.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/504611.html
上一篇:如何在回圈外列印變數的所有值?
