如何按行位置权重不等额拆分DataFrame中的投资组合资金?
按行位置权重不等额分配资金计算持股数量
核心思路
根据DataFrame的行数生成递减的权重系数序列(如n行则生成[n, n-1, ..., 1]),将每个系数除以系数总和得到对应行的资金分配比例,再用该比例乘以总投资资金计算单只股票的分配额度,最后除以股价取整得到可购买数量。
实现代码(向量化版本,效率更高)
import math # 假设portfolio_size是总投资资金,hqm_dataframe是目标DataFrame(包含'Price'列) n = len(hqm_dataframe.index) # 生成递减权重系数:第一行系数最大,依次递减 weight_coefficients = list(range(n, 0, -1)) total_coeff = sum(weight_coefficients) # 计算每只股票的资金分配额 hqm_dataframe['Allocation'] = portfolio_size * hqm_dataframe.index.map( lambda idx: weight_coefficients[idx] / total_coeff ) # 计算应购买的股票数量(向下取整) hqm_dataframe['Number of Shares to Buy'] = hqm_dataframe.apply( lambda row: math.floor(row['Allocation'] / row['Price']), axis=1 ) # 查看结果 hqm_dataframe
兼容原代码风格的循环版本
如果更习惯用循环实现,可参考以下代码:
import math n = len(hqm_dataframe.index) weight_coefficients = list(range(n, 0, -1)) total_coeff = sum(weight_coefficients) for i in hqm_dataframe.index: # 计算当前行的资金分配比例 weight_ratio = weight_coefficients[i] / total_coeff # 分配给当前股票的资金 position_size = portfolio_size * weight_ratio # 计算可购买的股票数量 hqm_dataframe.loc[i, 'Number of Shares to Buy'] = math.floor( position_size / hqm_dataframe.loc[i, 'Price'] ) # 查看结果 hqm_dataframe
示例验证
比如当DataFrame有4行时:
- 权重系数为
[4,3,2,1],总和为10 - 各行分配比例分别为40%、30%、20%、10%,完全符合需求
- 无论行数是3、5还是其他数值,该逻辑都会自动生成对应比例的权重
内容的提问来源于stack exchange,提问作者Isaac Chan
相关产品推荐
相关产品推荐

