Python实现投资组合收益率数据分区间排序的方案咨询
实现方案
Python生态里用numpy或者pandas就能直接实现你的需求,不需要额外安装小众库,1万条数据处理效率完全够用,两种方案如下:
方法1:numpy实现(轻量快速,适合纯数值处理)
核心用np.histogram计算区间频数,np.digitize给数据打区间标签,后续直接算概率、排序都很方便。
import numpy as np # 替换成你自己的收益率列表 returns = np.random.normal(0, 0.02, 10000) # 区间划分两种可选方式: # 方式1:指定划分多少个等宽区间,比如分10个区间 bin_count = 10 counts, bin_edges = np.histogram(returns, bins=bin_count) # 方式2:手动指定区间边界,适合按业务规则划分,比如按收益率阈值分 # bin_edges = [-np.inf, -0.1, -0.05, -0.02, 0, 0.02, 0.05, 0.1, np.inf] # counts, _ = np.histogram(returns, bins=bin_edges) # 计算各区间对应概率 probabilities = counts / len(returns) # 给每条数据打所属区间标签 bin_labels = np.digitize(returns, bins=bin_edges) # 按区间对原数据排序 sorted_data = sorted(zip(returns, bin_labels), key=lambda x: x[1]) # 输出验证 print("区间边界:", bin_edges) print("各区间样本数:", counts) print("各区间概率:", probabilities)
方法2:pandas实现(可读性高,适合后续数据分析)
如果你的数据需要后续做分组统计、可视化,用pandas的cut/qcut分箱函数更便捷:
cut:支持等宽分箱、自定义边界分箱qcut:等频分箱,每个区间样本数一致,适合收益率这类可能有偏态的分布,避免出现空区间
import pandas as pd import numpy as np returns = np.random.normal(0, 0.02, 10000) df = pd.DataFrame(returns, columns=["return"]) # 等宽分10个区间 df["bin"] = pd.cut(df["return"], bins=10) # 等频分10个区间(每个区间1000条数据) # df["bin"] = pd.qcut(df["return"], q=10) # 直接统计各区间概率,自动按区间排序 bin_prob = df["bin"].value_counts(normalize=True).sort_index() print("各区间概率分布:\n", bin_prob) # 按区间对整个数据集排序 sorted_df = df.sort_values("bin")
内容的提问来源于stack exchange,提问作者Gonçalo Sassetti
相关产品推荐
相关产品推荐

