基于SimFin获取事件后5天收盘价作为逻辑回归目标变量的实现问询
基于SimFin获取事件后5天收盘价作为逻辑回归目标变量的实现问询
看起来你已经完成了大部分数据准备工作,就差最后一步把事件发布后5天的收盘价赋值给目标变量了。我来帮你补全代码,同时解释下关键逻辑,避免踩坑:
首先,先补充你代码里遗漏的细节(比如导入pandas),然后一步步实现目标变量的设置:
import pandas as pd import simfin as sf # Load historical data sf.set_data_dir('simfin_data') sf.set_api_key(api_key='') # 记得填入你的SimFin API密钥 prices = sf.load(dataset='shareprices', variant='daily', market='us') df = prices.loc[prices['Ticker'] == 'TSLA'] # 确保索引是datetime类型且按日期升序排列(关键,否则shift会出错) df['Date'] = pd.to_datetime(df['Date']) df = df.set_index('Date').sort_index() df = df[['High', 'Low', 'Open', 'Close', 'Volume']] # Set Target Variable load_target = sf.load(dataset='income', variant='quarterly', market='us') load_target = load_target.loc[load_target['Ticker'] == 'TSLA'] # 将发布日期转为datetime类型,避免日期格式不匹配 load_target['Publish Date'] = pd.to_datetime(load_target['Publish Date']) # 第一步:先计算每个交易日之后第5个交易日的收盘价 # 用shift(-5)是因为我们要取当前日期往后数5个交易日的收盘价(SimFin数据是交易日数据,自动跳过非交易日) df['close_5d_later'] = df['Close'].shift(-5) # 第二步:创建目标变量列,初始为NaN,仅在事件发布日期填充对应5天后的收盘价 df['target'] = pd.NA for publish_date in load_target['Publish Date']: # 检查发布日期是否在行情数据的索引中(避免日期不在交易时间的情况) if publish_date in df.index: df.loc[publish_date, 'target'] = df.loc[publish_date, 'close_5d_later'] # 如果你不需要中间列,可以删掉它 df = df.drop(columns=['close_5d_later'])
关键细节说明:
- 日期排序:一定要确保行情数据是按日期升序排列的,
shift(-5)的逻辑才会正确——它会取当前行之后第5行的收盘价,对应实际的5个交易日之后的价格。 - 日期格式匹配:把
Publish Date转为datetime类型,避免字符串和datetime索引匹配失败的问题。 - 边界检查:加入了发布日期是否在行情数据中的判断,防止因为发布日期是非交易日(比如周末、节假日)导致的索引错误。
- 目标变量逻辑:这里的实现是仅在事件发布当天的行中填充目标值(即该日期5天后的收盘价),其他行保持为缺失值,适合以事件日为样本点的逻辑回归模型;如果你的需求是给每个行都标记最近一次事件后5天的收盘价,可以调整逻辑(比如用向前填充等方式)。
备注:内容来源于stack exchange,提问作者x945
相关产品推荐
相关产品推荐

