前言
在國內大家可能對彼得·林奇(Peter Lynch)、沃倫·巴菲特(Warren E. Buffett)這些華爾街(wall street)的金融大鱷比較熟悉,其實威廉·歐奈爾(William J. O’Neil)的投資成就同樣和他們相媲美。
威廉·歐奈爾把投資理念集中於他自創的CANSLIM選股系統,憑借着這個系統馳騁股票市場數十年,無論在牛市還是熊市,這個系統都是最穩定、表現最好的系統之一。
概括地說,CANSLIM體系是典型的價值投資法,它專注於挑選基本面優秀、技術面突出、又有足夠機構投資者支持的領漲股。
CANSLIM選股系統中有一個RPS指標(Relative Price Strength Rating),即股價相對強度指標,根據一段時間內個股漲幅在全部股票漲幅排名中的位次值,選取出市場中的強勢股。
本節我們就來介紹下如何計算歐奈爾RPS指標,以及如何基於歐奈爾RPS指標制定選股策略。
漲跌幅指標的計算
RPS指標怎么計算呢?RPS的值介於0-100之間,比如A股共有1000只股票,若某只股票的250日的漲幅在所有股票中排名第100位,則該股票的RPS值為:(1-100/1000)*100=90。
RPS的值代表該股的250日漲幅超過其他90%的股票的漲幅。通過該指標可以反映出個股的走勢在同期市場中的相對強弱表現。因此在過去250個交易日,所有股票的漲幅排行中,前1%的股票的RPS值為99至100,前2%的股票的RPS值為98至99……以此類推。
RPS時間周期可以自己根據需要進行調整,默認定義為250日(一年),當然常用的還有60日(3個月)、120日(半年)等等。
接下來我們一步步用代碼來實現RPS指標的計算。這里我們使用tushare的數據,查看下股票偉星新材的收盤價序列,數據獲取可參照《差異化分析常用股票交易數據接口》小節。如下所示:
""" trade_date 2018-01-02 19.78 2018-01-03 20.36 2018-01-04 20.60 2018-01-05 20.77 2018-01-08 20.62 2018-01-09 20.96 2018-01-10 20.53 ... 2019-12-31 13.17 Name: close, Length: 487, dtype: float64 """ 復制代碼
計算股票N日的漲跌幅,公式為:今日收盤價/昨日收盤價-1,其實也可以使用DataFrame.pct_change()這個方法,效果是一樣的。為了顯示比較直觀以5日漲幅為例,如下所示,當然對於缺失值我們應該按之前介紹的方法用0去填充。
""" trade_date 2018-01-02 NaN 2018-01-03 NaN 2018-01-04 NaN 2018-01-05 NaN 2018-01-08 NaN 2018-01-09 0.059656 2018-01-10 0.008350 ... 2019-12-31 0.025701 Name: close, Length: 487, dtype: float64 """ 復制代碼
因為RPS指標指的是一段時間內個股漲幅在全部股票漲幅排名中的位次值,所以接下來我們要計算出全部股票的120日漲跌幅數值,如下所示:
""" 平安銀行 萬科A 國農科技 ... 繼峰股份 方盛制葯 讀者傳媒 trade_date ... 2019-07-03 0.524483 0.220502 NaN ... 0.016753 0.576159 0.147368 2019-07-04 0.507543 0.227669 NaN ... NaN 0.554585 0.151579 2019-07-05 0.427692 0.181308 NaN ... 0.040506 0.495763 0.096192 2019-07-08 0.395277 0.163673 NaN ... -0.008906 0.389344 0.043478 2019-07-09 0.406832 0.166000 NaN ... -0.044529 0.384146 0.029703 2019-07-10 0.364185 0.151599 NaN ... -0.047134 0.338614 0.043651 2019-07-11 0.340594 0.163282 NaN ... -0.034982 0.324803 0.048000 2019-07-12 0.384314 0.171937 NaN ... -0.028894 0.333992 0.029762 2019-07-15 0.384768 0.199041 NaN ... -0.014066 0.355865 0.042510 2019-07-16 0.342773 0.194754 NaN ... -0.007732 0.351085 0.021825 2019-07-17 0.306298 0.185287 0.267123 ... -0.040764 0.339921 0.034137 2019-07-18 0.333659 0.205046 0.244923 ... -0.033376 0.338028 0.011834 2019-07-19 0.341323 0.192158 0.225904 ... -0.011796 0.370297 -0.011583 2019-07-22 0.339458 0.212476 0.138211 ... -0.045514 0.352475 -0.046967 2019-07-23 0.338521 0.181102 0.148126 ... -0.045337 0.406000 -0.027668 2019-07-24 0.341063 0.184117 0.162694 ... -0.029948 0.394790 -0.002004 ... ... ... ... ... ... ... ... 2019-12-31 0.210449 0.103945 0.085536 ... 0.037227 0.224189 0.390152 [124 rows x 3003 columns] """ 復制代碼
其中不同股票因為上市的時間不同,所以120日周期的移動漲跌幅會存在缺失值,我們可以用0去填充。
同學們可以參照《股票交易策略:線性回歸算法建立選股策略》小節獲取市場全部股票信息,再逐個獲取個股數據。
當然筆者已經把數據存儲為CSV文件,這樣下次可以從CSV文件中導入,有需要的同學可以通過交流群獲取,文件如下所示:
我們看下2019-12-31這一天平安銀行120日漲幅為0.210449,我們用可視化方法看下這一天全部股票的漲跌幅排布如何,顯示效果如下所示:
可以發現在3000只股票中, 120日收益率在[-0.11188698 -0.03826044]區間的股票最多,有657只,在這個區間附近也非常多。分布的數值如下所示:
""" [ 3. 8. 7. 22. 67. 151. 348. 657. 547. 427. 225. 145. 102. 97. 62. 25. 30. 15. 15. 6. 9. 8. 8. 5. 2. 0. 2. 0. 2. 0. 1. 0. 0. 1. 0. 1. 0. 0. 3. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 1.] [-0.62727273 -0.55364619 -0.48001966 -0.40639312 -0.33276658 -0.25914005 -0.18551351 -0.11188698 -0.03826044 0.03536609 0.10899263 0.18261916 0.2562457 0.32987224 0.40349877 0.47712531 0.55075184 0.62437838 0.69800491 0.77163145 0.84525799 0.91888452 0.99251106 1.06613759 1.13976413 1.21339066 1.2870172 1.36064373 1.43427027 1.50789681 1.58152334 1.65514988 1.72877641 1.80240295 1.87602948 1.94965602 2.02328256 2.09690909 2.17053563 2.24416216 2.3177887 2.39141523 2.46504177 2.5386683 2.61229484 2.68592138 2.75954791 2.83317445 2.90680098 2.98042752 3.05405405] """ 復制代碼
我們選取前10只股票可視化漲跌幅值,顯示效果如下所示:
RPS指標的計算
下一步對全部股票的漲跌幅值進行排序,排序完成后我們可以得到每一天的漲幅排名,如下所示:
""" 2019-11-22 中國天楹 0.548611 中國長城 0.515271 深大通 0.502844 深桑達A 0.490971 全新好 0.450980 德賽電池 0.408602 神州數碼 0.325490 平安銀行 0.257258 ... ... 長虹華意 -0.139588 特發信息 -0.140711 興業礦業 -0.148893 方大集團 -0.152330 """ 復制代碼
然后對每個股票的漲跌幅從1開始逐個編號排序,並且計算出RPS指標,以下是某一天經過排序后漲跌幅排名以及對應的RPS值和股票代碼,以DataFrame數據格式存儲,此處我們只羅列了其中的10只,如下所示:
""" pct name rps n 1 0.457271 全新好 90.0 2 0.190374 平安銀行 80.0 3 0.101951 國農科技 70.0 4 0.088542 中國寶安 60.0 5 0.071986 萬科A 50.0 6 -0.051693 深振業A 40.0 7 -0.052493 神州高鐵 30.0 8 -0.058116 深物業A 20.0 9 -0.077844 世紀星源 10.0 10 -0.078804 *ST美麗 0.0 """ 復制代碼
同樣我們看下截止到2019-12-31這一天漲幅榜前十名和后十名分別是什么股票,如下所示:
RPS指標的選股
有了每天的股票RPS值排名以后,我們就可以把每天排名第一的股票匯集起來,如下所示:
""" pct name rps 20190703 2.925358 金運激光 99.9667 20190704 2.883792 金運激光 99.9667 20190705 2.779621 興齊眼葯 99.9667 20190708 3.089744 興齊眼葯 99.9667 20190709 3.130105 興齊眼葯 99.9667 ... ... ... ... 20191120 2.724040 寶鼎科技 99.9667 20191230 2.931699 漫步者 99.9667 20191231 3.054054 漫步者 99.9667 [124 rows x 3 columns] """ 復制代碼
好了,計算RPS指標只是第一步,然后我們會針對這些數據展開可視化選股分析。
首先查看下2019年7月3日-2019年12月31日每日RPS的情況,這里我們僅列出每日RPS排名前十的股票,顯示效果如下所示:
從中可以看到里面出現不少熟悉的“妖股”身影,比如金運激光、興齊眼葯、寶鼎科技、漫步者……

拿漫步者和金運激光來說,漫步者在A點開始RPS一直處於高位,保持着強勢股的特征。金運激光在B點開始一直下跌,然后持續處於低位,股價一直反彈不起來。可見RPS的實戰意義是,在強勢股出現第一波上漲后發現它,然后深入挖掘,。當強勢股轉弱時也可以通過RPS的變化來觀察。
總結
由此可見通過RPS指標可以初步篩選出市場中的強勢股,對於選股過程來說意義重大。另一方面,該指標仍舊需要結合CANSLIM系統的其他指標一起使用,對初步篩選的股票進一步的過濾。
以上策略及涉及到的股票僅用於教學,不構成任何投資建議!投資需謹慎,入市有風險!!!