天天看點

python爬取股票最新資料并用excel繪制樹狀圖

大家好,最近大A的白馬股們簡直跌媽不認,作為重倉了抱團白馬股基金的養雞少年,每日那是一個以淚洗面啊。

python爬取股票最新資料并用excel繪制樹狀圖

跌媽不認

不過從金融界最近一個交易日的大盤雲圖來看,其實很多中小股還是紅色滴,綠的都是白馬股們。

以下截圖:

python爬取股票最新資料并用excel繪制樹狀圖

2月26日大盤雲圖

那麼,今天我們試着用python爬取最近交易日的股票資料,并試着用excel簡單繪制上面這個樹狀圖。本文旨在抛磚引玉,吼吼。

目錄:

  • 1. 爬取網易财經各闆塊股票資料
  • 2. excel樹狀圖
    • 2.1.  簡單的樹狀圖
    • 2.2. 帶有增長率的樹狀圖

1. 爬取網易财經各闆塊股票資料

目标網址:

​​http://quotes.money.163.com/old/#query=hy010000&DataType=HS_RANK&sort=PERCENT&order=desc&count=24&page=0​​

python爬取股票最新資料并用excel繪制樹狀圖

網易财經-行情中心

由于這個爬蟲部分比較簡單,這裡不做過多贅述,僅介紹一下思路并附上完整代碼供大家參考。

爬蟲思路:

  1. 請求目标網站資料,解析出主要行業(新)的資料:行業闆塊名稱及對應id(如金融,hy010000)
  2. 根據行業闆塊對應id構造新的行業股票資料網頁
  3. 由于翻頁網址不變
  4. 代入參數,擷取全部頁數,然後翻頁爬取全部資料

爬蟲代碼:

# -*- coding: utf-8 -*-
"""
Created Feb 28 10:30:56 2021
@author: 可以叫我才哥
"""

import requests
import re
import pandas as pd

# 擷取全部闆塊及闆塊id
url = 'http://quotes.money.163.com/old/#query=hy001000&DataType=HS_RANK&sort=PERCENT&order=desc&count=24&page=0'

r = requests.get(url)

html = r.text
# 替換非字元為空,便于下面的正則
html = re.sub('\s','',html)
# 正則擷取 闆塊及id所在區域
labelHtml = re.findall(r'</span>主要行業\(新\)</a>(.*?)</span>證監會行業\(新\)',html)[0]
# 正則闆塊和id,結果為由元組組成的清單
label = re.findall(r'"qid="(hy.*?)"qquery=.*?"title="(.*?)">',labelHtml)
# 轉化為dataframe類型
dfLabel = pd.DataFrame(label,columns=['id','闆塊'])

# 根據闆塊id和翻頁擷取頁面資料(json格式)
def get_json(hy_id, page):
    query = 'PLATE_IDS:' + str(hy_id)
    params={
        'host': 'http://quotes.money.163.com/hs/service/diyrank.php',
        'page': page,
        'query': query,
        'fields': 'NO,SYMBOL,NAME,PRICE,PERCENT,UPDOWN,FIVE_MINUTE,OPEN,YESTCLOSE,HIGH,LOW,VOLUME,TURNOVER,HS,LB,WB,ZF,PE,MCAP,TCAP,MFSUM,MFRATIO.MFRATIO2,MFRATIO.MFRATIO10,SNAME,CODE,ANNOUNMT,UVSNEWS', #你可以不用這麼多字段
        'sort': 'PERCENT',
        'order': 'desc',
        'count': '24',
        'type': 'query',
        }
    url = 'http://quotes.money.163.com/hs/service/diyrank.php?'
    r = requests.get(url,params=params)
    j = r.json()
    
    return j

# 空清單用于存取每頁資料
dfs = []
# 周遊全部闆塊
for hy_id,闆塊 in dfLabel.values:
    # 擷取頁數
    j = get_json(hy_id, 0)
    pages = j['pagecount']
    
    for page in range(pages):
        j = get_json(hy_id, page)
        data = j['list']
        df = pd.DataFrame(data)
        df['闆塊'] = 闆塊
        dfs.append(df)
    print(f'已爬取{len(dfs)}個闆塊資料')

result = pd.concat(dfs)     

      

2. excel樹狀圖

excel樹狀圖是在office2016級之後版本中新加的圖表類型,想要繪制需要基于此版本及之後的版本哦。

2.1.  簡單的樹狀圖

簡單的樹狀圖繪制流程:框選資料—>插入—>圖表—>選中樹狀圖 即可。

python爬取股票最新資料并用excel繪制樹狀圖

樹狀圖繪制流程

以下圖為例,在樹狀圖中,每個色塊代表一個省份,色塊面積大小則由其GDP值大小決定。

python爬取股票最新資料并用excel繪制樹狀圖

2020年全國各地GDP

2.2. 帶有增長率的樹狀圖

我們發現,在基礎的樹狀圖中,色塊顔色除了差別色塊之外并沒有其他特殊含義。拿GDP來說,除了值之外我們一般也會去看其增長率,那麼是否可以讓色塊顔色和增長率有關聯呢?

下面我們試着探究一下,如果成功的話,那麼金融界的大盤雲圖似乎也可以用excel樹狀圖來進行繪制了不是!

思路:

  1. 我們希望色塊顔色能代表增長率,比如紅色是上漲,綠色是下降且顔色越深代表絕對值越大
  2. 再對每個色塊進行對應的顔色填充即可

由于 樹狀圖頂多支援多級,色塊顔色也隻能手動單一填充,怎麼辦呢?既然手動可以,那麼其實就可以用​

​VBA自動化​

​這個過程咯。

2.3.1. 增長率配色

基于思路1,我們需要對增長率進行配色,最簡單的就是用​

​條件格式​

​裡的色階。

框選增長率資料—>開始—>條件格式—>色階(選中那個讓值越大顔色越紅的,由于這裡有負增長率,是以選了帶紅綠的):

python爬取股票最新資料并用excel繪制樹狀圖

色階

為了更好的展示區分正負增長率,我們在設定完色階後再進行管理規則:

  • 我們将中間值設為數字0,這樣負增長率就是綠色,正增長率就是紅色;
  • 我們将最大值設定為百分點值80,也就是增長率前80%的值都是最紅的。
python爬取股票最新資料并用excel繪制樹狀圖

調整規則

最終配色效果:

python爬取股票最新資料并用excel繪制樹狀圖

配色效果

2.3.2. VBA填充色塊顔色

先看效果:

湖北因為收到疫情影響最大,有接近小半年屬于封省狀态,全年增長率為負數。

python爬取股票最新資料并用excel繪制樹狀圖

各省GDP及增長率

由于條件格式下單元格顔色是不固定的無法通過vba擷取,我們需要将顔色指派到新的一列中去,需要用到如下操作:

選中增長率資料複制,然後點選剪切闆最右下角會出現剪貼闆,再滑鼠左鍵選擇需要粘貼的地方如E2,點選剪貼闆中需要粘貼的資料即可。 這個時候,被粘貼的單元格區域的顔色就是固定的了,你可以選擇删除資料隻留顔色部分。

python爬取股票最新資料并用excel繪制樹狀圖

單元格色複制操作流程

VBA思路:

  • 激活需要操作的圖表(​

    ​Activate​

    ​)
  • 周遊全部的系列和資料點(​

    ​ActiveChart.FullSeriesCollection(1).Points.Count​

    ​)
  • 從第一個資料點開始,擷取對應增長率單元格顔色(​

    ​ActiveSheet.Range("E" & i + 1).Interior.Color​

    ​)
  • 将單元格指派給該資料點(​

    ​Selection.Format.Fill.ForeColor.RGB​

    ​)

VBA代碼:

Sub My_Color()

    ActiveSheet.ChartObjects("圖表 1").Activate
    '周遊全部的資料點
    For i = 1 To ActiveChart.FullSeriesCollection(1).Points.Count
       '選中資料點
       ActiveChart.FullSeriesCollection(1).Points(i).Select
       '擷取單元格顔色
       MyColor = ActiveSheet.Range("E" & i + 1).Interior.Color
       '将單元格顔色指派給對應資料點填充色
       Selection.Format.Fill.ForeColor.RGB = MyColor
    Next

End Sub

      

執行腳本過程如下:

python爬取股票最新資料并用excel繪制樹狀圖

好了,以上就是本次全部内容,大家可以試着爬取股票資料,然後試着繪制一下。