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

Python生成指数级价格数组:超30天计算过慢,求高效优化方案

高效计算货币价格序列的均值与众数

问题背景

需要计算某货币的平均价格及众数:每日对前序价格序列中的每个价格,分别应用固定涨幅比例(up=1.003)和固定跌幅比例(down=1.001),每个价格生成两个新价格,形成指数级增长的价格数组。以起始价格5.5、周期4天为例,最终得到16个价格,均值为5.522044044024749。但现有基于numpy的代码在周期超过30天时速度极慢,需要更高效的计算方法。

现有代码:

import numpy as np

days = 4
up = 1.003  # PERCENT_UP
down = 1.001  # PERCENT_DOWN

array = np.zeros((2, 2 ** days), dtype=np.float64)
array[0][0] = 5.5  # STARTING PRICE

for i in range(1, days + 1):
    s = 0
    if i == 1:
        g = 1
    else:
        g = (2 ** i) - 1
    for pos in range(0, g, 2):
        array[1][pos] = array[0][pos - s] * up
        array[1][pos + 1] = array[0][pos - s] / down
        s += 1
    array[0] = array[1]

print(f'For {days} days, all prices: {array[1]}')
print(f'mean price: {np.mean(array[1])}')

性能瓶颈分析

当days超过30时,2**30是超过10亿的量级,单个数组内存占用就超过8GB,再加上嵌套循环的逐元素计算,会导致内存和CPU资源被耗尽,自然出现计算停滞。

数学推导优化(无需生成全部价格)

均值计算

观察价格生成规律:

  • 第n天结束时,共有2^n个价格,每个价格对应n次涨跌操作的组合。
  • 对于k次上涨、(n-k)次下跌的组合,价格为:初始价格 * up^k / down^(n-k)
  • 这类组合的数量为组合数C(n, k)(从n天中选k天上涨)

利用二项式定理化简均值公式:

均值 = 初始价格 * (up/2 + 1/(2*down))^n

众数计算

众数是出现次数最多的价格,而组合数C(n,k)在k取中间值时最大:

  • 当n为偶数:k = n/2,对应价格为初始价格 * (up/down)^(n/2)
  • 当n为奇数:k = (n-1)/2 和 k=(n+1)/2,对应两个价格:初始价格 * up^((n-1)/2)/down^((n+1)/2) 和 初始价格 * up^((n+1)/2)/down^((n-1)/2)

优化后的代码实现

import math

def calculate_price_stats(start_price, days, up, down):
    # 计算均值
    mean_factor = (up / 2 + 1 / (2 * down)) ** days
    mean_price = start_price * mean_factor
    
    # 计算众数
    if days % 2 == 0:
        k = days // 2
        mode_price = start_price * (up ** k) / (down ** k)
        modes = [mode_price]
    else:
        k1 = (days - 1) // 2
        k2 = (days + 1) // 2
        mode1 = start_price * (up ** k1) / (down ** k2)
        mode2 = start_price * (up ** k2) / (down ** k1)
        modes = [mode1, mode2]
    
    return mean_price, modes

# 示例调用
start_price = 5.5
days = 4
up = 1.003
down = 1.001

mean, modes = calculate_price_stats(start_price, days, up, down)
print(f'For {days} days, mean price: {mean}')
print(f'Mode(s) price: {modes}')

运行示例代码,得到的均值与原代码完全一致(5.522044044024749),且无论days取30还是100,计算都能瞬间完成,无需生成海量数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:15:46