价格相对强度(PRS)也称为相对强度(RS),是衡量在一段时间区间(通常为12个月)内一个股票价格相对于整体股票的强度,它的值在1至99之间,值越大,相对强度越高。PRS在国际投资界被广泛使用。
通常的计算方法:在同一段时间区间内,计算每一只个股的涨幅,按降序排列(rank),根据排名打分,第一名99分,最后一名1分,以此类推。(IPO未满一年的股票,以及长期停牌的股票一般要剔除。)
长期的大牛股的PRS值一般都大于85。趋势投资或动量投资建议不要买RS值小于60的股票。成长股的RS值一般在80或85以上。
由于整体股票市场的体量较大,以A股为例, 3680多家的股票, RS值在80以上的个股也有730多家,这对我们选股也是有难度的。
而从行业分布着手,事情变得相对容易,再者,行业分析也更适合产业政策和实体经济。
聚宽的JQData提供了被广泛使用的申万行业一级指数的历史数据(finance.SW1_DAILY_PRICE)以及估值数据(finance.SW1_DAILY_VALUATION)。
其具体的api可以参照:
我们对申万28个一级行业,通过jqdata的获取申万行业一级指数的历史数据(finance.SW1_DAILY_PRICE),按照PRS的计算方法可以得到不同时间区间的PRS的值。
而行业指数RS值在80以上的只有5至6个行业,这给我们分析阶段市场资金的流向以及行业前景的预期很有帮助。
jqdata的申万一级行业估值数据(finance.SW1_DAILY_VALUATION)则已经直接计算出了28个行业的每日的换手率,PE,PB和分红比率。这给我们分析不同行业的估值水平(PE,PB)和市场偏好(PB)以及市场热点(换手率)提供了有用的数据。
具体的分析方法可以查看我的研究代码。
通过价格相对强度(RS)研究数据我们可以看到:近3个月来,电子,计算机,国防军工,食品饮料,医药生物的RS值排名最高,这给我们选股指明了方向。
以上这些只是初步的分析,提供一种思路。通过JQdata提供的申万行业的指数的数据,我们还可以进一步计算各个行业的PRS值的曲线,分析变化趋势。还可以计算行业的历史估值区间的数据,来判断当前估值水平在历史估值中的位置。欢迎大家一起讨论!
研究
收起
*研究
0
您需要登录后才能查看源码 ,点击登录
# 申万行业指数import pandas as pdfrom jqdata import *import datetime
lastTD = get_trade_days(count=2)[-1] # 最近一个交易日print(f'最近一个交易日: {str(lastTD)}')beforeLastTD = get_trade_days(count=3)[-2] # 前一个交易日print(f'前一个交易日: {str(beforeLastTD)}')
最近一个交易日: 2019-09-06 前一个交易日: 2019-09-05
class Industry():""" 通过计算阶段时间的申万一级行业指数的涨幅,发现指数的价格相对强度(PRS); 通过获取申万一级行业的换手率, 发现市场热点,估值水平则分应投资者对不同行业的喜好程度。 """def __init__(self, industry_type='sw_l1', Date=lastTD):self.industry_type = industry_typeself.Date = Datedef industry_name(self): # 行业代码和名称'''Q:为什么有些申万行业代码没有成分股? A:申万的行业代码在14年2月21有一次比较大改动,新增了11个行业代码: ['801710','801720','801730','801740','801750','801760','801770', '801780','801790','801880','801890'],弃用了6个行业代码:['801060', '801070','801090','801100','801190','801220'] 所以新增行业代码在2014-02-21之前没有成分股,弃用的行业代码在2014-02-21之后没有成分股。 '''industry_name = get_industries(self.industry_type)inds = []for i in industry_name.index.tolist():if len(get_industry_stocks(i)):inds.append(i)df_inds = industry_name[industry_name.index.isin(inds)]df_inds = df_inds[['name']]return df_inds# def __str__(self):# return f'sw_l1 industry_code list: {self.industry_name()}'def RS_industry_swl1(self): # 申万一级行业指数的价格相对强度(PRS)RS = pd.DataFrame()for periods in [20, 60, 120]: # 这里的交易时间间隔可以根据需要自定义start_date = get_trade_days(count=periods)[0]print(start_date)df = finance.run_query(query(finance.SW1_DAILY_PRICE ).filter(finance.SW1_DAILY_PRICE.code.in_(self.industry_name().index.tolist()), finance.SW1_DAILY_PRICE.date >= start_date, ).order_by(finance.SW1_DAILY_PRICE.date.desc()))df = df.set_index('code')print(len(df))# df.dropna()df = df[['name', 'change_pct']]rt = df.groupby(by='code').sum()rt['rank'] = rt['change_pct'].rank(ascending=False)rt['rs'] = round(100*(1 - rt['rank']/len(rt)), 2)rt = rt.rename(columns={'change_pct': f'rt_{str(periods)}'})rt = rt.rename(columns={'rs': f'rs_{str(periods)}'})RS = pd.concat([RS, rt, self.industry_name()['name']], axis=1, sort=True)RS = RS.sort_values(by='rs_20', ascending=False)#RS = pd.concat([RS, self.industry_name()['name']], axis=1, sort=True),return RSdef industry_swl1_valuation(self): # 申万一级行业的估值""" 这里的时间通过while循环直到取得数据为止,不然数据为空!!! """tradedate = datetime.date.today() #print(tradedate)i = 0while True:df = finance.run_query(query(finance.SW1_DAILY_VALUATION ).filter(finance.SW1_DAILY_VALUATION.code.in_(self.industry_name().index.tolist()), finance.SW1_DAILY_VALUATION.date == tradedate , ).order_by(finance.SW1_DAILY_VALUATION.date.desc()))df = df[['date', 'code', 'name', 'turnover_ratio', 'pe', 'pb', 'dividend_ratio']]df = df.set_index('code')df = df.sort_values(by='turnover_ratio', ascending=False)if len(df) != 0:breakelse:i += 1 # print(i)tradedate = get_trade_days(count=5)[-i]print(tradedate)return df# if __name__ == '__main__':# inds = Industry('sw_l1')# indus_name =inds.industry_name()# print(f'申万一级行业代码及名称, 一共有{str(len(indus_name))}个:')# print(indus_name)# print('申万一级行业的估值,换手率等:')# val_inds = inds.industry_swl1_valuation()# print(val_inds)# # 可以将数据保存为csv文件,方便进一步分析查看# print('申万一级行业指数的价格相对强度(PRS):')# RS_inds = inds.RS_industry_swl1()# print(RS_inds)# # 可以将数据保存为csv文件,方便进一步分析查看
inds = Industry('sw_l1')indus_name =inds.industry_name()print(f'申万一级行业代码及名称, 一共有{str(len(indus_name))}个:')indus_name
申万一级行业代码及名称, 一共有28个:
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
name | |
---|---|
801740 | 国防军工I |
801020 | 采掘I |
801110 | 家用电器I |
801160 | 公用事业I |
801770 | 通信I |
801010 | 农林牧渔I |
801120 | 食品饮料I |
801750 | 计算机I |
801050 | 有色金属I |
801890 | 机械设备I |
801170 | 交通运输I |
801710 | 建筑材料I |
801780 | 银行I |
801040 | 钢铁I |
801130 | 纺织服装I |
801880 | 汽车I |
801180 | 房地产I |
801230 | 综合I |
801760 | 传媒I |
801200 | 商业贸易I |
801140 | 轻工制造I |
801720 | 建筑装饰I |
801080 | 电子I |
801790 | 非银金融I |
801030 | 化工I |
801210 | 休闲服务I |
801730 | 电气设备I |
801150 | 医药生物I |
print('申万一级行业的估值,换手率等:')val_inds = inds.industry_swl1_valuation()val_inds# 可以将数据保存为csv文件,方便进一步分析查看
申万一级行业的估值,换手率等: 2019-09-06
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
date | name | turnover_ratio | pe | pb | dividend_ratio | |
---|---|---|---|---|---|---|
code | ||||||
801770 | 2019-09-06 | 通信 | 4.2041 | 39.84 | 2.76 | 0.45 |
801750 | 2019-09-06 | 计算机 | 3.6793 | 57.51 | 3.92 | 0.36 |
801080 | 2019-09-06 | 电子 | 3.5874 | 37.94 | 3.14 | 0.65 |
801010 | 2019-09-06 | 农林牧渔 | 2.2959 | 40.17 | 3.88 | 0.92 |
801740 | 2019-09-06 | 国防军工 | 2.2093 | 63.94 | 2.74 | 0.28 |
801760 | 2019-09-06 | 传媒 | 1.7814 | 37.10 | 2.23 | 0.79 |
801050 | 2019-09-06 | 有色金属 | 1.7434 | 38.48 | 2.08 | 0.71 |
801890 | 2019-09-06 | 机械设备 | 1.5524 | 26.61 | 2.06 | 1.03 |
801150 | 2019-09-06 | 医药生物 | 1.4719 | 35.59 | 3.34 | 0.76 |
801140 | 2019-09-06 | 轻工制造 | 1.3480 | 22.62 | 1.69 | 1.12 |
801730 | 2019-09-06 | 电气设备 | 1.3172 | 32.63 | 2.14 | 0.83 |
801790 | 2019-09-06 | 非银金融 | 1.3069 | 17.22 | 1.97 | 1.75 |
801110 | 2019-09-06 | 家用电器 | 1.2774 | 16.12 | 3.23 | 2.52 |
801120 | 2019-09-06 | 食品饮料 | 1.2714 | 32.85 | 6.78 | 1.33 |
801230 | 2019-09-06 | 综合 | 1.2266 | 27.94 | 1.67 | 0.35 |
801880 | 2019-09-06 | 汽车 | 1.1568 | 18.24 | 1.57 | 2.16 |
801210 | 2019-09-06 | 休闲服务 | 1.1394 | 34.27 | 3.84 | 0.67 |
801200 | 2019-09-06 | 商业贸易 | 1.0581 | 17.96 | 1.47 | 1.46 |
801030 | 2019-09-06 | 化工 | 1.0424 | 19.48 | 1.83 | 1.84 |
801710 | 2019-09-06 | 建筑材料 | 0.9578 | 11.41 | 1.71 | 2.45 |
801130 | 2019-09-06 | 纺织服装 | 0.9087 | 23.55 | 1.80 | 1.77 |
801180 | 2019-09-06 | 房地产 | 0.7335 | 9.19 | 1.30 | 3.06 |
801160 | 2019-09-06 | 公用事业 | 0.6423 | 20.22 | 1.52 | 1.85 |
801170 | 2019-09-06 | 交通运输 | 0.6232 | 17.98 | 1.50 | 1.61 |
801720 | 2019-09-06 | 建筑装饰 | 0.5847 | 10.07 | 1.03 | 1.77 |
801020 | 2019-09-06 | 采掘 | 0.3732 | 13.60 | 1.19 | 2.07 |
801040 | 2019-09-06 | 钢铁 | 0.3512 | 7.32 | 0.93 | 4.31 |
801780 | 2019-09-06 | 银行 | 0.1478 | 6.66 | 0.79 | 3.73 |
print('申万一级行业指数的价格相对强度(PRS):')RS_inds = inds.RS_industry_swl1()#可以将数据保存为csv文件,方便进一步分析查看RS_inds
申万一级行业指数的价格相对强度(PRS): 2019-08-12 560 2019-06-17 1680 2019-03-18 3360
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
rt_20 | rank | rs_20 | name | rt_60 | rank | rs_60 | name | rt_120 | rank | rs_120 | name | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
801080 | 20.34 | 1.0 | 96.43 | 电子I | 26.89 | 1.0 | 96.43 | 电子I | 13.05 | 3.0 | 89.29 | 电子I |
801750 | 20.21 | 2.0 | 92.86 | 计算机I | 16.04 | 3.0 | 89.29 | 计算机I | 7.23 | 8.0 | 71.43 | 计算机I |
801740 | 16.10 | 3.0 | 89.29 | 国防军工I | 17.68 | 2.0 | 92.86 | 国防军工I | 12.52 | 4.0 | 85.71 | 国防军工I |
801770 | 14.95 | 4.0 | 85.71 | 通信I | 4.67 | 12.0 | 57.14 | 通信I | -3.49 | 14.0 | 50.00 | 通信I |
801760 | 14.04 | 5.0 | 82.14 | 传媒I | 6.70 | 9.0 | 67.86 | 传媒I | -12.18 | 26.0 | 7.14 | 传媒I |
801120 | 12.70 | 6.0 | 78.57 | 食品饮料I | 14.11 | 5.0 | 82.14 | 食品饮料I | 30.26 | 1.0 | 96.43 | 食品饮料I |
801150 | 11.67 | 7.0 | 75.00 | 医药生物I | 14.25 | 4.0 | 85.71 | 医药生物I | 6.92 | 9.0 | 67.86 | 医药生物I |
801110 | 10.64 | 8.0 | 71.43 | 家用电器I | 8.25 | 8.0 | 71.43 | 家用电器I | 9.68 | 5.0 | 82.14 | 家用电器I |
801730 | 9.84 | 9.0 | 67.86 | 电气设备I | 5.50 | 10.0 | 64.29 | 电气设备I | -7.87 | 20.0 | 28.57 | 电气设备I |
801790 | 9.71 | 10.0 | 64.29 | 非银金融I | 11.07 | 7.0 | 75.00 | 非银金融I | 7.71 | 7.0 | 75.00 | 非银金融I |
801710 | 9.62 | 11.0 | 60.71 | 建筑材料I | 2.78 | 17.0 | 39.29 | 建筑材料I | 1.44 | 10.0 | 64.29 | 建筑材料I |
801880 | 9.37 | 12.0 | 57.14 | 汽车I | 4.10 | 14.0 | 50.00 | 汽车I | -4.20 | 16.0 | 42.86 | 汽车I |
801030 | 9.19 | 13.0 | 53.57 | 化工I | 5.49 | 11.0 | 60.71 | 化工I | -3.51 | 15.0 | 46.43 | 化工I |
801230 | 8.63 | 14.0 | 50.00 | 综合I | 1.51 | 20.0 | 28.57 | 综合I | -9.01 | 23.0 | 17.86 | 综合I |
801890 | 8.38 | 15.0 | 46.43 | 机械设备I | 4.47 | 13.0 | 53.57 | 机械设备I | -4.85 | 17.0 | 39.29 | 机械设备I |
801170 | 8.17 | 16.0 | 42.86 | 交通运输I | 3.72 | 15.0 | 46.43 | 交通运输I | 0.20 | 12.0 | 57.14 | 交通运输I |
801140 | 8.13 | 17.0 | 39.29 | 轻工制造I | 2.36 | 18.0 | 35.71 | 轻工制造I | -8.27 | 22.0 | 21.43 | 轻工制造I |
801210 | 8.02 | 18.0 | 35.71 | 休闲服务I | 11.75 | 6.0 | 78.57 | 休闲服务I | 15.85 | 2.0 | 92.86 | 休闲服务I |
801130 | 7.19 | 19.0 | 32.14 | 纺织服装I | 0.77 | 21.0 | 25.00 | 纺织服装I | -10.08 | 25.0 | 10.71 | 纺织服装I |
801200 | 6.97 | 20.0 | 28.57 | 商业贸易I | 0.10 | 22.0 | 21.43 | 商业贸易I | -7.88 | 21.0 | 25.00 | 商业贸易I |
801720 | 6.69 | 21.0 | 25.00 | 建筑装饰I | -1.63 | 25.0 | 10.71 | 建筑装饰I | -13.00 | 27.0 | 3.57 | 建筑装饰I |
801020 | 6.52 | 22.0 | 21.43 | 采掘I | -1.73 | 26.0 | 7.14 | 采掘I | -6.23 | 19.0 | 32.14 | 采掘I |
801040 | 4.95 | 23.0 | 17.86 | 钢铁I | -5.91 | 28.0 | 0.00 | 钢铁I | -21.15 | 28.0 | 0.00 | 钢铁I |
801160 | 4.85 | 24.0 | 14.29 | 公用事业I | 1.54 | 19.0 | 32.14 | 公用事业I | -5.75 | 18.0 | 35.71 | 公用事业I |
801180 | 4.52 | 25.0 | 10.71 | 房地产I | -3.66 | 27.0 | 3.57 | 房地产I | -9.86 | 24.0 | 14.29 | 房地产I |
801050 | 4.22 | 26.0 | 7.14 | 有色金属I | -0.32 | 23.0 | 17.86 | 有色金属I | -3.11 | 13.0 | 53.57 | 有色金属I |
801010 | 3.11 | 27.0 | 3.57 | 农林牧渔I | 3.22 | 16.0 | 42.86 | 农林牧渔I | 7.93 | 6.0 | 78.57 | 农林牧渔I |
801780 | 1.97 | 28.0 | 0.00 | 银行I | -0.73 | 24.0 | 14.29 | 银行I | 0.72 | 11.0 | 60.71 | 银行I |