问题描述
同花顺交易软件上有个指标,叫ttm高于个股10年多少的数据,这个咱们聚宽数据里有吗?
解决方案
您好!您提到的“TTM高于个股10年多少的数据”,在金融量化中通常被称为**“市盈率(PE TTM)的历史分位数(百分位)”**。这个指标用于衡量当前股票的估值在过去10年历史中处于什么水平(例如:处于近10年20%的位置,说明当前估值比过去10年中80%的时间都要便宜)。
聚宽中有现成的指标吗?
在聚宽(JoinQuant)的API中,没有直接提供“近10年分位数”这样一个单一的现成字段。但是,聚宽提供了非常完整的历史每日估值数据(包含 PE TTM)。您只需要通过几行简单的 Python 代码,提取过去10年的 PE TTM 数据,就可以轻松计算出这个分位数。
如何在聚宽中计算 PE TTM 近10年分位数?
我们可以使用聚宽的 get_valuation 函数获取过去10年的历史市盈率数据,然后使用 scipy.stats.percentileofscore 来计算当前值在历史数据中的百分位。
以下是具体的 Python 实现代码,您可以在聚宽的**研究环境(Jupyter Notebook)**中直接运行测试:
from jqdata import *
import pandas as pd
import datetime
from scipy import stats
def get_pe_ttm_percentile(stock_code, years=10):
"""
计算个股 PE TTM 在过去 N 年中的历史分位数
:param stock_code: 股票代码,如 '000001.XSHE'
:param years: 历史年数,默认为 10 年
:return: (当前PE TTM, 历史分位数百分比)
"""
# 1. 确定时间范围
end_date = datetime.datetime.now().date()
start_date = end_date - datetime.timedelta(days=years * 365)
# 2. 获取历史估值数据 (pe_ratio 即为 PE TTM)
# 注意:get_valuation 每次最多返回 5000 条数据,10年大约 2500 个交易日,单只股票完全没问题
df = get_valuation(stock_code, start_date=start_date, end_date=end_date, fields=['pe_ratio'])
if df.empty:
return None, None
# 3. 数据清洗:去除空值,通常也会剔除市盈率为负的情况(亏损时PE无意义)
pe_series = df['pe_ratio'].dropna()
pe_series = pe_series[pe_series > 0]
if len(pe_series) == 0:
return None, None
# 4. 获取最新一天的 PE TTM
current_pe = pe_series.iloc[-1]
# 5. 计算当前 PE 在历史序列中的分位数 (0-100)
percentile = stats.percentileofscore(pe_series, current_pe)
return current_pe, percentile
# ================= 测试代码 =================
stock = '000001.XSHE' # 平安银行
current_pe, pct = get_pe_ttm_percentile(stock, years=10)
if current_pe:
print(f"股票 {stock} 当前 PE TTM 为: {current_pe:.2f}")
print(f"该估值高于过去 10 年中 {pct:.2f}% 的交易日数据。")
else:
print("未获取到有效数据。")
代码原理解析:
get_valuation:这是聚宽获取市值表数据的核心 API,传入fields=['pe_ratio']即可获取市盈率(TTM)的历史序列。- 数据清洗:历史数据中可能存在亏损导致 PE 为负的情况,通常在计算估值分位时会把负值剔除(
pe_series > 0)。 stats.percentileofscore:这是 SciPy 库中的统计函数,专门用于计算某个数值在一组数据中排在百分之多少的位置,完美契合您的需求。
通过这种方式,您不仅可以计算 10 年的 PE TTM 分位数,还可以灵活修改参数,计算 3 年、5 年的分位数,或者计算 PB(市净率 pb_ratio)、PS(市销率 ps_ratio)的历史分位数,比固定软件上的指标更加灵活强大!