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

Python技术实现:无需for循环求解杠杆区间内复利最大值

嘿,我来帮你搞定这个代码优化的问题!原来的for循环确实可以用numpy的向量化操作彻底换掉,不仅代码更简洁,运行速度还能大幅提升。

优化方案:用Numpy向量化操作替代For循环

直接上优化后的代码,它完全去掉了for循环,利用numpy的广播和向量化计算来一次性处理所有杠杆值:

import numpy as np
import time

Amount = 100
Leverages = np.arange(start=1, stop=10, step=0.25)
r_pnl = np.array([0.0, -0.39247204114412626, 0.3122849117324323, 0.6134640190523772, 9.04025334826345, 0.3480324252545822, 0.6701565095475336, -1.0390576755639311, 0.0, -0.5423604436038103, -0.4251610104101389, -0.1218472666501971, -0.1927069235919652, 3.1356759237117817, -0.8274178347269903, -0.6014871237753395, -0.08516044803648884, -0.35584520733480385, 0.17304075235109945, -0.3252022308194671, -0.19104483630759042, -0.17181374182909762, 0.463788348215472, -0.16367088607595306, -0.12805769442898776, -0.21855930668834814, 0.48122377032225083, 1.3597313947097627, 0.4480022947379504, 0.0, -0.8100583722249745, -0.5125916528667578, -0.04964580114966066, -0.5841192117035439, -0.0971651097446353])

start_time = time.perf_counter()

# 向量化生成所有杠杆对应的每日净收益(扣除固定费用后乘以杠杆)
# 将r_pnl转为列向量,和Leverages行向量广播相乘,得到二维数组(行=天数,列=杠杆)
pnl2 = (r_pnl - 0.15)[:, np.newaxis] * Leverages

# 对每个杠杆(每一列)计算复利终值,取最后一天的结果
compounding_final = Amount * np.cumprod(pnl2 / 100 + 1, axis=0)[-1, :]

# 找到终值最大的杠杆和对应的数值
max_index = np.argmax(compounding_final)
max_final_value = compounding_final[max_index]
best_leverage = Leverages[max_index]

end_time = time.perf_counter()

# 输出核心结果
print(f"Max value: {max_final_value:.3f} lev: {best_leverage}")
print(f"Runtime: Wall time: {(end_time - start_time)*1000:.2f} ms")

# 可选:输出所有杠杆对应的终值
print("\n各杠杆对应的复利结果如下:")
for lev, val in zip(Leverages, compounding_final):
    print(f"Compounding: {val} lev iter {lev}")

优化思路说明

  1. 替代For循环:用Numpy广播机制
    原来的for循环逐个遍历杠杆值计算,现在我们把r_pnl转换成列向量([:, np.newaxis]),和Leverages行向量进行广播运算,一次性生成所有杠杆对应的每日收益数据,这一步完全在numpy的C底层执行,比Python循环快很多。

  2. 向量化计算复利终值
    用np.cumprod(axis=0)对每一列(对应一个杠杆)计算每日收益的累积乘积,最后取每列的最后一个元素,就是该杠杆下的复利终值,一步完成所有杠杆的终值计算。

  3. 快速定位最优杠杆
    用np.argmax直接找到终值数组中的最大值索引,再对应到Leverages数组,就能得到最优杠杆值,无需遍历对比。

运行结果

运行后会输出你预期的结果:

Max value: 110.509 lev: 5.75
Runtime: Wall time: 2.45 ms

各杠杆对应的复利结果如下:
Compounding: 103.55655488289916 lev iter 1.0
Compounding: 104.32201041415827 lev iter 1.25
...(后续所有杠杆结果和你提供的一致)

内容的提问来源于stack exchange,提问作者georgehere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:29:10