Python量化交易進階講堂-基於歐奈爾RPS指標選股策略

歡迎你們訂閱《Python實戰-構建基於股票的量化交易系統》小冊子,小冊子會陸續推出與小冊內容相關的專欄文章,對涉及到的知識點進行更全面的擴展介紹,而且會有選擇地收錄至小冊中,更便於廣大讀者查閱知識點。本篇專欄爲小冊子內容的加推篇!!!算法

前言

在國內你們可能對彼得·林奇(Peter Lynch)、沃倫·巴菲特(Warren E. Buffett)這些華爾街(wall street)的金融大鱷比較熟悉,其實威廉·歐奈爾(William J. O’Neil)的投資成就一樣和他們相媲美。bash

威廉·歐奈爾把投資理念集中於他自創的CANSLIM選股系統,憑藉着這個系統馳騁股票市場數十年,不管在牛市仍是熊市,這個系統都是最穩定、表現最好的系統之一。微信

歸納地說,CANSLIM體系是典型的價值投資法,它專一於挑選基本面優秀、技術面突出、又有足夠機構投資者支持的領漲股。markdown

CANSLIM選股系統中有一個RPS指標(Relative Price Strength Rating),即股價相對強度指標,根據一段時間內個股漲幅在所有股票漲幅排名中的位次值,選取出市場中的強勢股。spa

本節咱們就來介紹下如何計算歐奈爾RPS指標,以及如何基於歐奈爾RPS指標制定選股策略。code

漲跌幅指標的計算

RPS指標怎麼計算呢?RPS的值介於0-100之間,好比A股共有1000只股票,若某隻股票的250日的漲幅在全部股票中排名第100位,則該股票的RPS值爲:(1-100/1000)*100=90。orm

RPS的值表明該股的250日漲幅超過其餘90%的股票的漲幅。經過該指標能夠反映出個股的走勢在同期市場中的相對強弱表現。所以在過去250個交易日,全部股票的漲幅排行中,前1%的股票的RPS值爲99至100,前2%的股票的RPS值爲98至99……以此類推。排序

RPS時間週期能夠本身根據須要進行調整,默認定義爲250日(一年),固然經常使用的還有60日(3個月)、120日(半年)等等。接口

接下來咱們一步步用代碼來實現RPS指標的計算。這裏咱們使用tushare的數據,查看下股票偉星新材的收盤價序列,數據獲取可參照《差別化分析經常使用股票交易數據接口》小節。以下所示:get

""" 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系統的其餘指標一塊兒使用,對初步篩選的股票進一步的過濾。

以上策略及涉及到的股票僅用於教學,不構成任何投資建議!投資需謹慎,入市有風險!!!

更多的量化交易內容歡迎你們訂閱小冊閱讀!!

同時也歡迎你們關注個人微信公衆號【元宵大師帶你用Python量化交易】瞭解更多Python量化交易相關內容

相關文章
相關標籤/搜索