如何用变量替代硬编码索引适配多数据集?股票买卖组合求解
解决任意股票数据集的最大亏损率买卖日期组合问题
需要编写可适配任意数据集的代码,处理带DateTime索引与浮点值的pandas Series类型股票数据,找出亏损率最大的买卖日期组合(卖出日期必须晚于买入日期)。目前代码中存在硬编码日期的问题,无法适配任意数据,且要求不能使用for循环,需要改进方案。
现有代码
数据加载部分
# 加载股票数据 import pandas as pd import numpy as np data = pd.read_csv('NVDA.csv', index_col=0, parse_dates=True) stock = data['Close'] # 设置Jupyter显示选项 from IPython.core.interactiveshell import InteractiveShell InteractiveShell.ast_node_interactivity = "all" pd.set_option('display.float_format', lambda x: '%.2f' % x) pd.set_option('display.max_columns', None)
最大亏损率计算(含硬编码问题)
# 计算历史最高价与当前价的比值(比值越大,亏损越严重) bigloss = stock.cummax() / stock biggestloss = bigloss.nlargest(1) # 确定卖出价格与日期 y = stock.loc[biggestloss.index] # 硬编码日期区间获取历史最高价,无法适配任意数据 losshigh = stock.loc['1999-01-22':'2002-10-09'].max() # 确定买入价格与日期 x = stock[stock == losshigh] # 计算亏损百分比(公式存在错误,应为 (x[0]-y[0])/x[0]*100) percentage = (x[0] - y[0]/x[0])*100
改进方案(无硬编码、无for循环)
核心思路:利用cummax()获取每个时间点的历史最高价,找到亏损率最大的卖出点后,反向定位对应的历史最高价出现日期,全程用pandas内置方法实现,无需循环。
# 1. 计算每个时间点的历史最高价 cum_high = stock.cummax() # 2. 计算每个时间点相对于历史最高价的亏损比值(比值越大,亏损越严重) loss_ratio = cum_high / stock # 3. 找到亏损比值最大的卖出日期 sell_date = loss_ratio.idxmax() sell_price = stock.loc[sell_date] # 4. 找到该卖出日期之前的历史最高价对应的买入日期(取最早出现的最高价日期) buy_price = cum_high.loc[sell_date] buy_date = stock.loc[:sell_date][stock.loc[:sell_date] == buy_price].idxmin() # 5. 计算正确的亏损百分比 max_loss_percent = (buy_price - sell_price) / buy_price * 100 # 输出结果 print(f"最大亏损率买卖组合:") print(f"买入日期:{buy_date.date()},买入价格:{buy_price:.2f}") print(f"卖出日期:{sell_date.date()},卖出价格:{sell_price:.2f}") print(f"亏损率:{max_loss_percent:.2f}%")
关键改进点:
- 移除硬编码日期:通过
stock.loc[:sell_date]动态限定买入日期的时间范围,适配任意数据集 - 修正亏损率计算公式:原公式逻辑错误,正确公式为
(买入价-卖出价)/买入价*100 - 无循环实现:全程使用pandas的向量化方法(
cummax()、idxmax()、idxmin()),符合性能要求 - 鲁棒性提升:自动定位历史最高价的最早出现日期,确保买卖时间逻辑合法(卖在买之后)
内容的提问来源于stack exchange,提问作者Marisa Acevedo
相关产品推荐
相关产品推荐

