關注一下~,更多商業(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頁
"""
## 由上可知,需要替換掉空格贷洲,換行符收厨,  以及 第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()