跳至主要內容
FinLab

Python新手教學(Part 3):全球指數歷史數據下載大全|for迴圈、zip、dictionary實戰

這個單元我們要利用 for 迴圈將所有的歷史數據爬下來,並且繪製所有的歷史股價。我們也會介紹一些 for 迴圈的進階技巧,並且將這些技巧結合起來,完成這次的功能,想要學習python,就慢慢跟著我們一步一步來吧!

全球指數歷史數據下載教學封面圖

延續上個單元,我們應該已經爬取了world_index這張表格:

已爬取的 world_index 全球指數表格

然後還有一個我們寫好的function

顯示程式碼
import json
import requests
import datetime
import pandas as pd
import numpy as np
 
def crawl_price(stock_id):
 
    d = datetime.datetime.now()
    url = "https://query1.finance.yahoo.com/v8/finance/chart/"+stock_id+"?period1=0&period2="+str(int(d.timestamp()))+"&interval=1d&events=history&=hP2rOschxO0"
 
    res = requests.get(url)
    data = json.loads(res.text)
    df = pd.DataFrame(data['chart']['result'][0]['indicators']['quote'][0], index=pd.to_datetime(np.array(data['chart']['result'][0]['timestamp'])*1000*1000*1000))
    return df

接下來就可以將他們結合,來爬取歷史資料了!在爬取資料之前,有幾個程式的小技巧必須要學會

1. for 迴圈

假如我們要執行重複性的動作,通常第一件事情就是想到for 迴圈,例如我們想要印出1~9,不用for迴圈,我們可以寫成

顯示程式碼
print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)

不使用 for 迴圈逐行印出 1 到 9 的執行結果

但很明顯我們就已經快要中風了,所以改成for迴圈後

顯示程式碼
for i in [1,2,3,4,5,6,7,8,9]:
    print(i)

使用 for 迴圈印出 1 到 9 的執行結果

這樣短短的就寫完了!其中 第一行:我們有一個變數i,他會從1~9不斷變換,並且執行下方的print(i)。第二行要記得加上前方四個空白,通常叫做縮排「indent」,當第一行有for這個標示後,之後就必須用縮排indent直到寫完for迴圈裡的內容為止。

但有時候我們希望同時做兩個迴圈呢?

使用zip

我們可以使用zip,一次執行兩個list:

顯示程式碼
for number, letter in zip([1,2,3], ['a', 'b', 'c']):
    print(number, letter)

使用 zip 同時迭代兩個 list 的執行結果

最後,我們要使用 dictionary 將全球的指數給存起來。

dictionary

這邊先示範最簡單的用法:

顯示程式碼
d = {}
d['a'] = 1
d['b'] = 2
 
# 查找
print(d['b']) # 2
 
# 迴圈
# 其中,d.items 有點像是zip的感覺,
# 針對dictionary中的['a', 'b']和[1,2]進行迴圈)
for letter, number in d.items():
    print(letter, number)
# a 1
# b 2

dictionary 查找與迴圈的執行結果

結合上述的小功能,就可以寫一個程式將世界指數都抓下來了! 我建議你自己試試看~ 寫完之後再往下拉看範例:

顯示程式碼
import time
world_index_history = {}
for symbol, name in zip(world_index['Symbol'], world_index['Name']):
    
    print(name)
    
    world_index_history[name] = crawl_price(symbol)
    time.sleep(5)

以 for 迴圈爬取所有全球指數歷史資料的執行過程

假如你有認真研究前三點功能,相信這些代碼應該難不倒你!其中沒有教到的是,我們利用time.sleep(5),來休息一下,不要抓的太頻繁,不然會被封鎖,除此之外,上述代碼非常簡單,寫一個for迴圈,將所有的指數都抓下來,存在world_index_history中。

繪製指數

接下來,我們可以用一樣的for迴圈,來將指數給畫出來

顯示程式碼
for name, history in world_index_history.items():
    history.close.plot()

用 for 迴圈繪製所有全球指數歷史股價走勢圖

這個單元的程式碼,都可以使用 colab 來執行喔!趕快來玩玩看吧!

有了指數,接下來要做什麼呢?

下個單元,我們要來分析一下這些指數,看看哪些適合投資,哪些不適合,敬請期待~

這一系列是我們影音課程的化簡版,

想建立自己的策略?

用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案

免費開始