用技術指導投資是一種什么樣的體驗 -- Selenium 基金分析【附超詳注釋 Python code】

在這里插入圖片描述

關注一下~,更多商業(yè)數據分析案例等你來撩

只要輸入基金代碼即可獲取其歷年基金凈值的爬蟲程序與數據分析源代碼都已準備好钞翔,公眾號 “ 數據分析與商業(yè)實踐 ” 后臺回復 ” 基金爬蟲 “ 即可獲取 ~~

前言

理財就是理生活芬失,如果理財的過程中還能結合自己所學的技術顷蟆,豈不美哉绎谦?

"投資 80% 看行為衅码,20% 看技術;風險在人聲鼎沸處浪腐,機會在無人問津時纵揍。" 這是股神老巴的一句名言。的確牛欢,只有持有得久骡男,坐得住,能夠堅持定期不定額的投資傍睹,摒棄喜漲厭跌的心理,才能看到賺錢的曙光犹菱。

在這里插入圖片描述

本文靈感來源于筆者的一位極具慧眼的投資老哥拾稳,在投資的股票中,會使用i問財和同花順等分析網站確認入市時機腊脱,篩選出好的公司访得,同時剔除周期股,剔除基本面轉壞的股票陕凹,并且也能分析公司的財報是否存在收入美化悍抑,資產美化,資金現金流是否異常等杜耙。后來才知道這只是基本操作搜骡,TA 還懂得個股分析與行業(yè)分析,各種高大上的模型與指標配合接地氣的操作佑女,再輔以超于常人的投資心態(tài)记靡,令TA在近10年的股票投資中佳報頻傳谈竿。

沒想到我這個不到兩年經驗的投資小白也有能跟 TA 搭上話的一天。" 幫我寫個爬蟲唄摸吠,我想只要我輸入指定的基金代碼空凸,就能夠獲取該基金歷年的凈值信息,接著還能夠自動按年分組并求出每年 25%寸痢,50%呀洲,75% 對應的凈值分位點,把程序打包發(fā)給我啼止。當然两嘴,如果能夠寫個 JAVA 小程序或者嵌入桌面提醒就更好了,這樣我就不用一兩周看一次了族壳,半年高枕無憂憔辫,反正基金只是鬧著玩,我只按照凈值來仿荆,不管什么它的主要重倉" 大佬在電話里淡淡的說...

[圖片上傳失敗...(image-8f8bfc-1596024379263)]


爬蟲構建

這就是強者的世界嗎贰您?既然大佬都發(fā)話了,那小弟只能竭盡全力了拢操。上段話的藍字為主要需求锦亦,至于后期的小程序開發(fā)或桌面提醒功能都先不談,本文著重于爬蟲的設計很簡單的凈值分析令境,下圖為爬蟲的設計思路杠园,展示了用到的函數和大概步驟,數字代表運行順序舔庶,寫入文件的函數嵌在模擬瀏覽器行為的函數中:


在這里插入圖片描述

以近幾天漲勢正猛的招商中證白酒指數分級為例:


在這里插入圖片描述

在這里插入圖片描述

小循環(huán)的設置比較簡單抛蚁,畢竟每頁的數據量固定,都是10條惕橙,但不同基金的頁數不同瞧甩,所以我們只需要提前捕捉到 ” 共xxx頁 “ 的 xxx ,然后將其設置結束大循環(huán)的終點標志即可弥鹦。爬蟲代碼只有 120 行左右(包含了非常非常詳細的注釋)肚逸,因篇幅原因不便展示,后臺回復關鍵字領取彬坏,7.4更新朦促,本文底部即可獲取。


Pandas 分析

在這里插入圖片描述

在這里插入圖片描述

簡單分析一下 2015~2019 結果(僅針對基金凈值而言):

  • 50%分位點并不是逐年上升栓始,而是在17年達到最大值务冕,而后開始下降
  • 75%分位點與最大值都是在17年達到一個較大值后,在下一年稍有回落混滔,從去年開始又呈現上升趨勢洒疚。
  • ...

至于數據可視化部分就留給大家自行探索了歹颓。

注:相關數據源和超詳細的代碼(python,Jupyter Notebook 版本 + 詳細注釋)已經整理好油湖,在 “數據分析與商業(yè)實踐” 公眾號后臺回復 “ 基金爬蟲 ” 即可獲取。

[圖片上傳失敗...(image-c0b64f-1596024379263)]
不到70行Python代碼乏德,輕松玩轉決策樹預測客戶違約模型(附案例數據與代碼)

后續(xù)會不斷更新常見場景下的 Python 實踐


在這里插入圖片描述

更新

還是直接上代碼吧撤奸,不過要下載一個瀏覽器驅動喊括,全套代碼郑什,操作和演示視頻在公眾號后臺~~

from selenium import webdriver  # 瀏覽器驅動
from selenium.webdriver.common.keys import Keys  # 模擬瀏覽器點擊時需要用

import time,csv
import random 

fieldnames = ['日期', '單位凈值', '累計凈值', '日漲幅'] # 待獲取的目標字段

# 根據用戶命名來創(chuàng)建的 csv 文件
def createFile(file_name):
    # 寫入文件的域名
    # 創(chuàng)建文件進行存儲
    with open(file_name + '.csv', 'w', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)

# 將數據寫入文件的函數
def writeFile(data, file_name):
    """ data: 傳入寫入的數據; file_name:可根據基金名稱自定義 """
    # 對剛才創(chuàng)建的文件進行“追加寫”
    with open(file_name + '.csv', 'a', encoding='utf-8') as f:
        writer = csv.DictWriter(f, fieldnames=fieldnames)
        writer.writerow(data)

def parse_data(client_input, file_name):
    """
    傳入完整的基金代碼钝满,返回數據弯蚜,供寫入文件的函數寫入
    :param client_input: 用戶輸入的完整基金代碼
           file_name: 用戶自定義的生成文件的名字
    :return: 基金凈值數據
    """
    # ------------------------ 基礎配置 ------------------------
    # 設置不加載圖片剃法,提速
    chrome_opt = webdriver.ChromeOptions()  # 告知 webdriver:即將需要添加參數

    # 需要添加的參數們
    prefs = {"profile.managed_default_content_settings.images": 2}
    chrome_opt.add_experimental_option("prefs", prefs)

    # 初始化瀏覽器碎捺,即運行該行代碼將會打開瀏覽器
    driver = webdriver.Chrome(chrome_options=chrome_opt)

    # 找尋規(guī)律后發(fā)現的指定代碼后的基金網址
    basic_url = 'https://www.howbuy.com/fund/'
    full_url = f'{basic_url + client_input}' # 全網址等于基本構造 + 人為輸入的基金代碼
    print(f'即將模擬瀏覽器打開如下基金網頁:{full_url}')

    # --------------- 開始模擬瀏覽器打開指定基金網頁并點擊歷史凈值 ----------------
    driver.get(full_url)
    # 模擬點擊歷史凈值
    driver.find_element_by_id('open_history_data').send_keys(Keys.ENTER)
    time.sleep(1.5) # 設置緩沖時間

    # ------------------------- 激動人心的模擬爬取 ------------------------
    ## 獲取需要爬取的總頁數
    page_info = driver.find_element_by_xpath('//*[@id="fHuobiData"]/div').text
    print(page_info)
    ## 包含最大頁碼的內容格式模板如下
    """

                    第1頁/共115頁 
    """
    ## 由上可知,需要替換掉空格贷洲,換行符收厨,&nbsp 以及 第1頁/共 和 頁,這幾樣東西
    ## 當然恩脂,也可以用正則表達式來操作帽氓,這樣快很多,不用寫那么多 replace
    import re
    total_pages = re.findall('共(\d+)頁', page_info, re.S)[0] # re.S 消除換行符的影響
    print(f'該基金共 {total_pages} 頁')  # 檢查一下
    print('='*55)
    print('開始爬取...')
    # 爬取歷史凈值信息俩块,并模擬翻頁
    try:
        for i in range(1, int(total_pages)+1):
            print(f'正在爬取第 {i} 頁')
            try:
                for j in range(2, 11):  # 每一頁共 10 條信息:2~11
                    # 日期
                    date_xpath = '//*[@id="fHuobiData"]/table/tbody/tr[{}]/td[1]'
                    date = driver.find_element_by_xpath(date_xpath.format(j)).text
                    # 單位凈值
                    net_value_xpath = '//*[@id="fHuobiData"]/table/tbody/tr[{}]/td[2]'
                    net_value = driver.find_element_by_xpath(net_value_xpath.format(j)).text
                    # 累計凈值
                    total_net_value_xpath = '//*[@id="fHuobiData"]/table/tbody/tr[{}]/td[3]'
                    total_net_value = driver.find_element_by_xpath(total_net_value_xpath.format(j)).text
                    # 日漲幅
                    daily_increase_xpath = '//*[@id="fHuobiData"]/table/tbody/tr[{}]/td[4]/span'
                    daily_increase = driver.find_element_by_xpath(daily_increase_xpath.format(j)).text

                    print(date, net_value, total_net_value, daily_increase)
                ## ---------------- 將爬取到的數據寫入 csv 文件 ---------------------
                    data = {
                        '日期': date,
                        '單位凈值': net_value,
                        '累計凈值': total_net_value,
                        '日漲幅': daily_increase
                    }
                    # 寫入數據
                    writeFile(data, file_name=file_name)

                # 模擬點擊下一頁: 在大循環(huán)處模擬
                driver.find_element_by_xpath('//*[@id="fHuobiData"]/div/a[3]').send_keys(Keys.ENTER)
                time.sleep(random.random()*2)
            except Exception as e:
                print(e.args)
                continue
            print('\n')

    except Exception as e:
        print(e.args)  # 為分享方便,只是設置最簡單的捕獲異常浓领,日后再說


# 調度爬蟲的總函數
def main():
    client_input = input("請輸入完整基金代碼:")
    file_name = input("請輸入你希望創(chuàng)建的文件名(無需添加引號或后綴)玉凯,如 我的基金:")
    createFile(file_name=file_name)
    print('='*50)
    parse_data(client_input, file_name=file_name)

# 主程序接口
if __name__ == '__main__':
    main()
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市联贩,隨后出現的幾起案子漫仆,更是在濱河造成了極大的恐慌,老刑警劉巖泪幌,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盲厌,死亡現場離奇詭異署照,居然都是意外死亡,警方通過查閱死者的電腦和手機吗浩,發(fā)現死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門建芙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人懂扼,你說我怎么就攤上這事禁荸。” “怎么了阀湿?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵赶熟,是天一觀的道長。 經常有香客問我陷嘴,道長映砖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任灾挨,我火速辦了婚禮邑退,結果婚禮上,老公的妹妹穿的比我還像新娘涨醋。我一直安慰自己瓜饥,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布浴骂。 她就那樣靜靜地躺著乓土,像睡著了一般。 火紅的嫁衣襯著肌膚如雪溯警。 梳的紋絲不亂的頭發(fā)上趣苏,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音梯轻,去河邊找鬼食磕。 笑死,一個胖子當著我的面吹牛喳挑,可吹牛的內容都是我干的彬伦。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伊诵,長吁一口氣:“原來是場噩夢啊……” “哼单绑!你這毒婦竟也來了?” 一聲冷哼從身側響起曹宴,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤搂橙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后笛坦,有當地人在樹林里發(fā)現了一具尸體区转,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡苔巨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了废离。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侄泽。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厅缺,靈堂內的尸體忽然破棺而出蔬顾,到底是詐尸還是另有隱情,我是刑警寧澤湘捎,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布诀豁,位于F島的核電站,受9級特大地震影響窥妇,放射性物質發(fā)生泄漏舷胜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一活翩、第九天 我趴在偏房一處隱蔽的房頂上張望烹骨。 院中可真熱鬧,春花似錦材泄、人聲如沸沮焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽峦树。三九已至,卻和暖如春旦事,著一層夾襖步出監(jiān)牢的瞬間魁巩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工姐浮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谷遂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓卖鲤,卻偏偏與公主長得像肾扰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛋逾,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354