1. 程式人生 > 實用技巧 >一份Python程式碼讓我在基金市場一個月賺了10萬!

一份Python程式碼讓我在基金市場一個月賺了10萬!

因為疫情的原因,現在全世界都在加速印錢,在這種“大水漫灌”的背景下,我們手頭的現金加速貶值,如果通過理財跑贏通脹是我們每個人需要思考的問題。國內的投資渠道匱乏,大部分人選擇銀行定期或者各種寶,但是可以明顯感受到的是不管是銀行定期還是各種寶,現在的利率都在下降,及時通脹水平不變也是跑不贏的。

於是一部分人把目光投向了基金和證券市場。買基金就是選基金經理,相信他能幫你賺錢,買股票就是選公司,相信自己的眼光。作為新時代的青年,我還是願意自己去選公司,用我的技術來輔助決策,構建自己的交易體系。本文就介紹一下怎樣通過獲取各證券公司的分析師研報來輔助我們選股。

我在前段時間用這個研究方法,找到了一隻股票,當時就 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 爬蟲
(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)(* ̄︶ ̄)
以上內容無用,為本篇部落格被搜尋引擎抓取使用