Python新手教學(Part 3):全球指數歷史數據下載大全

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

thumbnail 5 4

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

1 3 1

然後還有一個我們寫好的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)
2 3

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

for i in [1,2,3,4,5,6,7,8,9]:
    print(i)
3 2 1

這樣短短的就寫完了!其中
第一行:我們有一個變數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)
4 2

最後,我們要使用 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
6 1 1

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

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)
5 2

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

繪製指數

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

for name, history in world_index_history.items():
    history.close.plot()
f 1

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

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

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

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

FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!