You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按行位置权重不等额拆分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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:42:35