
因為疫情的原因,現在全世界都在加速印錢,在這種“大水漫灌”的背景下,我們手頭的現金加速貶值,如果通過理財跑贏通脹是我們每個人需要思考的問題。國內的投資渠道匱乏,大部分人選擇銀行定期或者各種寶,但是可以明顯感受到的是不管是銀行定期還是各種寶,現在的利率都在下降,及時通脹水平不變也是跑不贏的。
於是一部分人把目光投向了基金和證券市場。買基金就是選基金經理,相信他能幫你賺錢,買股票就是選公司,相信自己的眼光。作為新時代的青年,我還是願意自己去選公司,用我的技術來輔助決策,構建自己的交易體系。本文就介紹一下怎樣通過獲取各證券公司的分析師研報來輔助我們選股。
我在前段時間用這個研究方法,找到了一只股票,當時就 ALLIN 了,再加上運氣好,不到一個月時間盈利超十萬,於是我美滋滋地賣出止盈。當然這里面有運氣成分,但是這種方法確實可以提高選股效率,給自己輔助決策。
尋找目標頁面
我們要通過分析師的研報來輔助我們選股,第一個步驟就是獲取這些分析師的研報,我第一個反應就是去東方財富網站(https://www.eastmoney.com/)上尋找,這里得誠摯地感謝一下東方財富網站,證券投資方面的數據資料真的是應有盡有。
我們進入東方財富網的首頁,找到“股票”欄目的“數據”子欄目:

股票-數據
點擊進去,就到了股票數據的首頁了,然后我們找到左側的菜單,從中找到“研究報告”,選擇研究報告的子菜單“個股研報”:

研究報告-個股研報
點擊進去,就是我們的個股研報頁面了,這就是我們獲取研報的目標頁面:

個股研報
在這個頁面我們可以看到最長兩年內的所有個股研報,我們可以看到研報、相關個股、股票評級、股票未來盈利預測等信息,這些信息是我們選股的關鍵,是我們需要獲取的信息。
獲取數據
觀察這個頁面,我們可以看到這是個分頁的表格,我們可能需要通過分頁獲取數據。不管怎么樣,我們先打開開發者工具,刷新一下頁面,看看能不能找到數據請求。由於首頁是預加載的,我們沒有發現數據請求,所以我們嘗試着點擊第二頁看看:

第二頁
我們可以很容易地找到數據請求,我們看到的請求是這樣的:
http://reportapi.eastmoney.com/report/list?cb=datatable3175804&industryCode=&pageSize=50&industry=&rating=&ratingChange=&beginTime=2018-10-27&endTime=2020-10-27&pageNo=2&fields=&qType=0&orgCode=&code=*&rcode=&p=2&pageNum=2&_=1603766081350
我們再看看這個請求返回的數據:

第二頁返回數據
很顯然,這就是我們需要的數據,獲取到你是如此地簡單!接下來我們的任務就是分析請求的 URL 和參數了。
這個 URL 也很好分析,我們可以很清楚地看到幾個關鍵參數:
- pageSize:每頁記錄數
- beginTime:開始日期
- endTime:結束日期
- pageNo:頁碼
- pageNum:頁碼
這幾個參數是我們很容易觀察出來的,我們再用不同的頁面嘗試幾次,可以看到 pageNum 是沒用的,頁面用 pageNo 參數就可以。另外,我們可以看到返回的結果在 json 數據的外層包了一層,以 “datatable3175804” 開頭,這個其實就是參數里面的 cb 參數。其他的一些參數是具體的條件篩選,如果你不是要具體篩選某些條件下的研報,就可以直接復制就行。
有了這些信息,我們就可以開始寫程序請求數據了:
def __init__(self): self.header = {"Connection": "keep-alive", "Cookie": "st_si=30608909553535; cowminicookie=true; st_asi=delete; cowCookie=true; intellpositionL=2048px; qgqp_b_id=c941d206e54fae32beffafbef56cc4c0; st_pvi=19950313383421; st_sp=2020-10-19%2020%3A19%3A47; st_inirUrl=http%3A%2F%2Fdata.eastmoney.com%2Fstock%2Flhb.html; st_sn=15; st_psi=20201026225423471-113300303752-5813912186; intellpositionT=2579px", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36", "Host": "reportapi.eastmoney.com" } self.conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='root', db='east_money', charset='utf8') self.cur = self.conn.cursor() self.url = 'http://reportapi.eastmoney.com/report/list?cb=datatable1351846&industryCode=*&pageSize={}&industry=*&rating=&ratingChange=&beginTime={}&endTime={}&pageNo={}&fields=&qType=0&orgCode=&code=*&rcode=&p=2&pageNum=2&_=1603724062679' def getHtml(self, pageSize, beginTime, endTime, pageNo): print(self.url.format(pageSize, beginTime, endTime, pageNo)) response = requests.get(self.url.format(pageSize, beginTime, endTime, pageNo), headers=self.header) html = response.content.decode("utf-8") return html
注意這里的返回數據的編碼是 utf-8,需要用 utf-8 去解碼。
獲取到數據后,下一步我們需要解析數據,從返回的數據中抽取我們覺得需要的重要數據:
def format_content(self, content): if len(content): content = content.replace('datatable1351846(', '')[:-1] return json.loads(content) else: return None def parse_data(self, items): result_list = [] for i in items['data']: result = {} obj = i result['title'] = obj['title'] #報告名稱 result['stockName'] = obj['stockName'] #股票名稱 result['stockCode'] = obj['stockCode'] #股票code result['orgCode'] = obj['stockCode'] #機構code result['orgName'] = obj['orgName'] #機構名稱 result['orgSName'] = obj['orgSName'] #機構簡稱 result['publishDate'] = obj['publishDate'] #發布日期 result['predictNextTwoYearEps'] = obj['predictNextTwoYearEps'] #后年每股盈利 result['predictNextTwoYearPe'] = obj['predictNextTwoYearPe'] #后年市盈率 result['predictNextYearEps'] = obj['predictNextYearEps'] # 明年每股盈利 result['predictNextYearPe'] = obj['predictNextYearPe'] # 明年市盈率 result['predictThisYearEps'] = obj['predictThisYearEps'] #今年每股盈利 result['predictThisYearPe'] = obj['predictThisYearPe'] #今年市盈率 result['indvInduCode'] = obj['indvInduCode'] # 行業代碼 result['indvInduName'] = obj['indvInduName'] # 行業名稱 result['lastEmRatingName'] = obj['lastEmRatingName'] # 上次評級名稱 result['lastEmRatingValue'] = obj['lastEmRatingValue'] # 上次評級代碼 result['emRatingValue'] = obj['emRatingValue'] # 評級代碼 result['emRatingName'] = obj['emRatingName'] # 評級名稱 result['ratingChange'] = obj['ratingChange'] # 評級變動 result['researcher'] = obj['researcher'] # 研究員 result['encodeUrl'] = obj['encodeUrl'] # 鏈接 result['count'] = int(obj['count']) # 近一月個股研報數 result_list.append(result) return result_list
這里我們把返回的數據去掉外層包裝,然后解析成 json,存儲在列表中。
我們獲得了數據之后,接下來就是存儲了,考慮到以后會經常用這份數據,並且會不斷地獲取最新的數據,所以我需要存儲在一個方便查詢並且性能穩定的介質中,這里我使用 MySQL 進行存儲。
def insertdb(self, data_list): attrs = ['title', 'stockName', 'stockCode', 'orgCode', 'orgName', 'orgSName', 'publishDate', 'predictNextTwoYearEps', 'predictNextTwoYearPe', 'predictNextYearEps', 'predictNextYearPe', 'predictThisYearEps', 'predictThisYearPe', 'indvInduCode', 'indvInduName', 'lastEmRatingName', 'lastEmRatingValue', 'emRatingValue', 'emRatingName', 'ratingChange', 'researcher', 'encodeUrl', 'count'] insert_tuple = [] for obj in data_list: insert_tuple.append((obj['title'], obj['stockName'], obj['stockCode'], obj['orgCode'], obj['orgName'], obj['orgSName'], obj['publishDate'], obj['predictNextTwoYearEps'], obj['predictNextTwoYearPe'], obj['predictNextYearEps'], obj['predictNextYearPe'], obj['predictThisYearEps'], obj['predictThisYearPe'], obj['indvInduCode'], obj['indvInduName'], obj['lastEmRatingName'], obj['lastEmRatingValue'], obj['emRatingValue'],obj['emRatingName'], obj['ratingChange'], obj['researcher'], obj['encodeUrl'], obj['count'])) values_sql = ['%s' for v in attrs] attrs_sql = '('+','.join(attrs)+')' values_sql = ' values('+','.join(values_sql)+')' sql = 'insert into %s' % 'report' sql = sql + attrs_sql + values_sql try: print(sql) for i in range(0, len(insert_tuple), 20000): self.cur.executemany(sql, tuple(insert_tuple[i:i+20000])) self.conn.commit() except pymysql.Error as e: self.conn.rollback() error = 'insertMany executemany failed! ERROR (%s): %s' % (e.args[0], e.args[1]) print(error)
跑完程序,我的數據庫里面數據是這樣的:

存儲數據
使用數據
限於篇幅,本文先介紹獲取數據部分,只要數據在手,其他的就都好說了。不過畢竟是投資股票,任何輔助決策數據都必須結合個股的行情數據,所以股票數據是必須的,這個數據的獲取方式我們之前的文章中有介紹。大致說下怎樣使用這份數據吧。
- 可以根據歷史推薦之后一段時間(比如一個月、半年等)計算自推薦之日起個股的漲幅,如果某個分析師推薦多個股票都有不錯的收益,那么這個分析師可以加入觀察列表,后續推薦個股可以重點關注。自己也可以做一個最牛分析師榜單!
- 股票評級和股票評級變動這兩個條件可以好好看看。個人經驗來說,如果是首次推薦買入,一般可以重點看看。另外,評級變動如果是向好的方向變化的也可以重點看看,比如上次是“買入”,現在變成“強烈買入”,那么值得重點關注。
- 每股盈利和市盈率也可以輔助判斷。可以根據預測的明年和后年的每股盈利和市盈率計算出個股大致的漲幅預期。如果預期漲幅比較大,那么是可以重點關注的。
這幾個方向都是可以根據數據去做分析的,當然這些方向只是幫助我們更快地進行篩選個股,我們還需要認真地看研究報告,分析個股的基本面,才能最終決策。
總結
本文介紹了如何從東方財富網站上獲取證券公司分析師的個股研報數據,基於獲取到的數據,提示了幾個可以分析運用的方向。限於篇幅,沒有對具體的分析運用具體展開描述,大家可以自行研究。
注意:如果你是打算找python高薪工作的話。我建議你多寫點真實的企業項目積累經驗。不然工作都找不到,當然很多人沒進過企業,怎么會存在項目經驗呢? 所以你得多找找企業項目實戰多練習下撒。如果你很懶不想找,也可以進我的Python交流圈:1156465813。群文件里面有我之前在做開發寫過的一些真實企業項目案例。你可以拿去學習,不懂都可以在裙里找我,有空會耐心給你解答下。
以下內容無用,為本篇博客被搜索引擎抓取使用
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
python 是干什么的 零基礎學 python 要多久 python 為什么叫爬蟲
python 爬蟲菜鳥教程 python 爬蟲萬能代碼 python 爬蟲怎么掙錢
python 基礎教程 網絡爬蟲 python python 爬蟲經典例子
python 爬蟲
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上內容無用,為本篇博客被搜索引擎抓取使用