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
相关产品推荐
相关产品推荐

