🚀 AI 一键生成 joinquant 策略代码

如何在 JoinQuant 平台计算股票估值的 1stdv 和 -1stdv?(附 Python 源码)

joinquant | 发布时间: 2026/5/27
以下内容由 EasyQuant 生成。

问题描述

股票估值中常有1stdv和-1stdv是如何计算的?

请问大神,股票估值中常有1stdv,请问这个是如何计算的?

解决方案

股票估值中的 1stdv 和 -1stdv 是什么?

在股票估值(如市盈率 PE 或市净率 PB 估值通道)中,1stdv-1stdv 指的是历史估值均值加减一倍标准差(Standard Deviation)。这是一种基于统计学正态分布假设的估值分析方法。

  • 均值(Mean):代表该股票在过去一段时间内(如3年、5年或10年)的平均估值水平。
  • 标准差(Standard Deviation, stdv):衡量历史估值偏离均值的波动程度。
  • +1stdv(均值 + 1倍标准差):通常被视为高估警戒线。如果当前估值突破此线,说明股票比历史上约 84% 的时间都要贵。
  • -1stdv(均值 - 1倍标准差):通常被视为低估安全线。如果当前估值跌破此线,说明股票比历史上约 84% 的时间都要便宜。

计算步骤

  1. 获取历史数据:获取目标股票过去 N 个交易日(例如过去 1000 个交易日)的每日 PE(市盈率)或 PB(市净率)数据。
  2. 计算均值(Mean):将这 N 个交易日的估值数据相加后除以 N。
  3. 计算标准差(Stdv):计算这 N 个数据相对于均值的标准差。
  4. 计算通道线
    • 上限 (1stdv) = 均值 + 标准差
    • 下限 (-1stdv) = 均值 - 标准差

JoinQuant (聚宽) 平台代码实现

在聚宽平台中,我们可以使用 get_valuation 函数轻松获取历史估值数据,并利用 pandas 库计算均值和标准差。以下是在聚宽研究环境策略中可用的 Python 代码示例:

import pandas as pd
import numpy as np
from jqdata import *

def calculate_valuation_bands(stock_code, end_date, count=1000):
    """
    计算指定股票的 PE 估值均值及 1stdv / -1stdv
    :param stock_code: 股票代码,如 '000001.XSHE'
    :param end_date: 截止日期,如 '2023-10-01'
    :param count: 回溯的交易日天数,默认 1000 天(约 4 年)
    """
    # 1. 获取历史估值数据(这里以市盈率 pe_ratio 为例)
    df = get_valuation(stock_code, end_date=end_date, count=count, fields=['pe_ratio'])
    
    if df.empty:
        print(f"未获取到 {stock_code} 的估值数据")
        return None
        
    # 提取 PE 数据序列
    pe_series = df['pe_ratio']
    
    # 2. 计算历史均值
    pe_mean = pe_series.mean()
    
    # 3. 计算标准差
    pe_std = pe_series.std()
    
    # 4. 计算 +1stdv 和 -1stdv
    plus_1_stdv = pe_mean + pe_std
    minus_1_stdv = pe_mean - pe_std
    
    # 获取当前最新 PE
    current_pe = pe_series.iloc[-1]
    
    # 打印结果
    print(f"=== {stock_code} 估值分析 ===")
    print(f"历史 PE 均值: {pe_mean:.2f}")
    print(f"+1 标准差 (1stdv): {plus_1_stdv:.2f}")
    print(f"-1 标准差 (-1stdv): {minus_1_stdv:.2f}")
    print(f"当前 PE: {current_pe:.2f}")
    
    # 估值状态判断
    if current_pe > plus_1_stdv:
        print("结论: 当前估值处于 +1stdv 之上,可能存在【高估】风险。")
    elif current_pe < minus_1_stdv:
        print("结论: 当前估值处于 -1stdv 之下,可能具备【低估】价值。")
    else:
        print("结论: 当前估值处于合理区间(-1stdv 到 +1stdv 之间)。")
        
    return pe_mean, plus_1_stdv, minus_1_stdv

# 示例调用(请在聚宽研究环境中运行)
# calculate_valuation_bands('000001.XSHE', end_date='2023-10-20', count=1000)

策略应用建议

在实际的量化策略中,你可以将上述逻辑放入 handle_data 或定时运行函数中。当股票的 current_pe < minus_1_stdv 时触发买入信号,当 current_pe > plus_1_stdv 时触发卖出信号,从而构建一个经典的估值均值回归策略