[英]download stock price history from yahoo finance with python 3.5
[英]Multithreaded download of yahoo stock history with python yfinance
我正在嘗試下載股票代碼列表的歷史數據並將每個數據導出到 csv 文件。 我可以把它作為一個 for 循環來工作,但是當股票行情列表在 1000 的時候這很慢。 我正在嘗試對進程進行多線程處理,但我不斷收到許多不同的錯誤。 有時它只會下載 1 個文件,有時會下載 2 或 3 次,甚至會下載 6 次,但絕不會超過這個數。 我猜這與擁有 6 核 12 線程處理器有關,但我真的不知道。
import csv
import os
import yfinance as yf
import pandas as pd
from threading import Thread
ticker_list = []
with open('tickers.csv', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
name = None
for row in reader:
if row[0]:
ticker_list.append(row[0])
start_date = '2019-03-03'
end_date = '2020-03-04'
data = pd.DataFrame()
def y_hist(i):
ticker = ticker_list[i]
data = yf.download(ticker, start=start_date, end=end_date, group_by="ticker")
data.to_csv('yhist/' + ticker + '.csv', sep=',', encoding='utf-8')
threads = []
for i in range(os.cpu_count()):
print('registering thread %d' % i)
threads.append(Thread(target=y_hist,args=(i,)))
for thread in threads:
thread.start()
for thread in threads:
thread.join()
print('done')
這是一個帶有代碼的 csv 示例文件,足以對此進行測試。 股票代碼.csv
這些是我閱讀和使用代碼的頁面,以嘗試完成這項工作:
這是一個帶有輸出的簡化版本,也許有助於澄清問題。
import os
import pandas as pd
import yfinance as yf
from threading import Thread
ticker_list = ['IBM','MSFT','QQQ','SPY','FB','XLV','XLF','XLK','XLE','GTHX','IYR','ONE','ROG','OLED','GLD']
def y_hist():
for ticker in ticker_list:
print(ticker)
threads = []
for i in range(os.cpu_count()):
threads.append(Thread(target=y_hist))
for thread in threads:
thread.start()
for thread in threads:
thread.join()
輸出:
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
OLEDIBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
GLD
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
IBM
GLD
MSFT
ROG
OLED
GLD
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
IBM
MSFT
QQQ
SPY
IBM
MSFT
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
IBM
MSFT
QQQ
SPY
FB
XLV
XLF
XLK
XLE
GTHX
IYR
ONE
ROG
OLED
GLD
GLD
雖然這不會直接修復我損壞的代碼,但它是一個可以獲得相同結果的解決方案。 它使用 yfinance 內置的多線程能力。 不幸的是,我仍然不知道為什么原始代碼不起作用,並且仍然希望對此提供反饋。 同時,如果有人正在尋找同一問題的解決方案,這將起作用。
import csv
import os
import yfinance as yf
import pandas as pd
import time
start = time.time()
ticker_list = []
with open('tickers.csv', 'r') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
name = None
for row in reader:
if row[0]:
ticker_list.append(row[0])
data = yf.download(
tickers = ticker_list,
period = '1y',
interval = '1d',
group_by = 'ticker',
auto_adjust = False,
prepost = False,
threads = True,
proxy = None
)
data = data.T
for ticker in ticker_list:
data.loc[(ticker,),].T.to_csv('yhist/' + ticker + '.csv', sep=',', encoding='utf-8')
print('It took', time.time()-start, 'seconds.')
是時候運行 400 個股票行情列表了:
線程設置為 True
[************************100%************************] 400 400 完成
花了 23.420897006988525 秒。
線程設置為 False
[************************100%************************] 400 400 完成
花了 133.77732181549072 秒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.