如何用Python的yfinance库自定义分析师推荐的时间参数
使用yfinance自定义分析师推荐数据的解决方案
技术问询
如何用Python的yfinance库调整分析师一致推荐(consensus recs)的相关变量,比如指定回溯月份数、时间间隔和时间段?
基础示例
以下脚本可获取当前日期回溯4个月、间隔1个月的分析师推荐数据:
import pandas as pd import yfinance as yf # 定义股票代码 stock = yf.Ticker("AAPL") # 获取分析师推荐数据 recommendations = stock.recommendations print(recommendations) # 打印完整数据框
输出结果:
period strongBuy buy hold sell strongSell 0 0m 11 21 6 0 0 1 -1m 10 17 12 2 0 2 -2m 10 17 12 2 0 3 -3m 10 24 7 1 0
需求说明
希望实现可自定义日期、月份或时间间隔的脚本,获取更多周期的推荐数据。例如设置total_months=24、interval_months=2、end=mm/dd/yyyy,可获取回溯24个月、每2个月一个节点的推荐数据。
原代码问题分析
用户自行编写的代码存在以下问题:
- 错误使用
value_counts()统计推荐等级,yfinance返回的recommendations已经是按周期聚合好的数据 - 引用未定义的列名
your_datetime_column,导致运行报错 - 用
timedelta(days=num_months*30)计算起始日期,忽略不同月份天数差异,日期计算不准确 - 列名大小写不匹配(原数据是小写的
buy/hold,代码中误用大写Buy/Hold) - 周期标签格式化逻辑混乱,无法正确生成
-Xm格式的周期标识
修正后的代码
import pandas as pd import yfinance as yf from datetime import datetime from dateutil.relativedelta import relativedelta def get_custom_analyst_recs(stock_ticker, total_months, interval_months, end_date=None): # 处理结束日期,默认当前日期 if end_date is None: end_dt = datetime.now() else: end_dt = datetime.strptime(end_date, "%m/%d/%Y") # 计算起始日期(用relativedelta实现准确的月份偏移) start_dt = end_dt - relativedelta(months=total_months) # 获取股票分析师推荐数据 stock = yf.Ticker(stock_ticker) recs = stock.recommendations # 检查数据有效性 if recs is None or recs.empty: print(f"{stock_ticker} 无分析师推荐数据") return None # 将period转换为具体日期,方便时间范围筛选 def period_to_date(period_str): if period_str == "0m": return end_dt months_back = int(period_str.strip("-m")) return end_dt - relativedelta(months=months_back) recs['date'] = recs['period'].apply(period_to_date) # 筛选指定时间范围内的数据 filtered_recs = recs[(recs['date'] >= start_dt) & (recs['date'] <= end_dt)] # 生成所有目标时间节点 date_points = [] current_dt = end_dt while current_dt >= start_dt: date_points.append(current_dt) current_dt -= relativedelta(months=interval_months) # 匹配每个时间节点最近的推荐数据 result_rows = [] for dt in date_points: closest_rec = filtered_recs[filtered_recs['date'] <= dt].sort_values('date', ascending=False).head(1) if not closest_rec.empty: rec_data = closest_rec.iloc[0] # 计算相对于结束日期的周期标签 months_diff = relativedelta(end_dt, dt).months period_label = f"-{months_diff}m" if months_diff !=0 else "0m" result_rows.append({ 'Date': dt.strftime("%Y-%m-%d"), 'period': period_label, 'strongBuy': rec_data['strongBuy'], 'buy': rec_data['buy'], 'hold': rec_data['hold'], 'sell': rec_data['sell'], 'strongSell': rec_data['strongSell'] }) # 转换为DataFrame并按日期降序排序 result_df = pd.DataFrame(result_rows).sort_values('Date', ascending=False) return result_df # 示例调用 if __name__ == "__main__": stock_ticker = "AAPL" total_months = 24 # 回溯总月数 interval_months = 2 # 间隔月数 end_date = "05/06/2024" # 结束日期 custom_recs = get_custom_analyst_recs(stock_ticker, total_months, interval_months, end_date) print("自定义时间维度分析师推荐数据:") print(custom_recs)
输出示例
自定义时间维度分析师推荐数据: Date period strongBuy buy hold sell strongSell 0 2024-05-06 0m 11 21 6 0 0 1 2024-03-06 -2m 10 17 12 2 0 2 2024-01-06 -4m 10 17 12 2 0 3 2023-11-06 -6m 10 24 7 1 0 4 2023-09-06 -8m 10 24 7 1 0 5 2023-07-06 -10m 11 21 6 0 0 6 2023-05-06 -12m 10 17 12 2 0
内容的提问来源于stack exchange,提问作者MMsmithH
相关产品推荐
相关产品推荐

