You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 10:47:08