如何计算指数首次突破20后两周的平均资产价格路径?
解决方法:捕捉指数突破20后两周的资产价格路径
步骤1:数据预处理
先把日期列转成可计算的时间格式,并设置为索引(方便后续时间切片操作):
import pandas as pd # 转换日期格式为datetime df['date'] = pd.to_datetime(df['date']) # 按日期排序并设为索引 df = df.set_index('date').sort_index()
步骤2:识别首次突破20的事件
标记那些前一天指数低于20、当天首次达到/超过20的关键日期:
# 生成突破标记列:当天指数≥20,且前一天指数<20 df['breakout'] = (df['Some index'] >= 20) & (df['Some index'].shift(1) < 20) # 提取所有突破日期 breakout_dates = df[df['breakout']].index.tolist()
步骤3:提取每个突破后两周的价格数据
这里分两种常见场景处理:
场景A:按交易日计算两周(通常为10个交易日)
# 存储所有突破后的价格路径 paths = [] for breakout_date in breakout_dates: # 截取突破当天及之后9个交易日(共10天)的资产价格 path = df.loc[breakout_date:].iloc[:10]['Asset price'].reset_index(drop=True) # 给每条路径命名,方便后续识别 path.name = f'breakout_{breakout_date.date()}' paths.append(path) # 合并所有路径,按突破后的天数对齐 all_paths = pd.concat(paths, axis=1)
场景B:按自然日计算两周(14天)
paths = [] for breakout_date in breakout_dates: # 计算两周后的自然日 end_date = breakout_date + pd.Timedelta(days=14) # 截取突破日到两周后区间内的资产价格 path = df.loc[breakout_date:end_date]['Asset price'].reset_index(drop=True) path.name = f'breakout_{breakout_date.date()}' paths.append(path) all_paths = pd.concat(paths, axis=1)
步骤4:计算平均价格路径
对齐所有路径后,按行求均值就能得到突破后的平均价格走势:
# 计算每天的平均资产价格 average_path = all_paths.mean(axis=1).reset_index() average_path.columns = ['day', 'avg_asset_price'] # day列代表突破后的第n天(0=突破当天,1=次日...)
补充提示
- 如果只需要分析第一次突破的情况,直接取
breakout_dates[0]即可,不用遍历所有突破日期 - 若要计算累计收益,可通过
average_path['avg_asset_price'] / average_path['avg_asset_price'].iloc[0] - 1得到相对收益曲线
内容的提问来源于stack exchange,提问作者coder-shmoder
相关产品推荐
相关产品推荐

