Фондовый скрининг от Sentdex - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь скопировать скрининг Sentdex, который он загрузил в качестве учебника еще в 2013 году (https://www.youtube.com/watch?v=Y4GHgJjIQnk). К сожалению, с тех пор многое изменилось, поэтому необходимо внести небольшие изменения в предложенный им код. Iопубликуйте часть кода, которая не работает должным образом, только здесь ниже. Весь код доступен по ссылке выше, если кому-то интересно.

Код, по сути, оригинальный, с некоторыми незначительными исключениями, касающимися YahooМетод url следующий:

import urllib.request
import time
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import matplotlib.dates as mdates
import mpl_finance
from mpl_finance import candlestick_ohlc
import matplotlib
import pylab

...

def graphData(stock,MA1,MA2):

    '''
        Use this to dynamically pull a stock:
    '''
    try:
        print('Currently Pulling',stock)
        urlToVisit = 'https://query1.finance.yahoo.com/v8/finance/chart/'+stock+'?interval=2m'
        stockFile =[]
        try:
            sourceCode = urllib.request.urlopen(urlToVisit).read().decode()
            splitSource = sourceCode.split('\n')
            for eachLine in splitSource:
                splitLine = eachLine.split(',')
                if len(splitLine)==6:
                    if 'values' not in eachLine:
                        stockFile.append(eachLine)
        except Exception as e:
            print(str(e), 'failed to organize pulled data.')
    except Exception as e:
        print(str(e), 'failed to pull pricing data')

    try:
        date, closep, highp, lowp, openp, volume = np.loadtxt(stockFile,delimiter=',', unpack=True, converters={0: bytespdate2num('%Y%m%d')})

Вывод, который я получаю, следующий:

Currently Pulling ABT
UserWarning: loadtxt: Empty input file: "[]"
  date, closep, highp, lowp, openp, volume = np.loadtxt(stockFile,delimiter=',', unpack=True, converters={0: bytespdate2num('%Y%m%d')})
list assignment index out of range
Currently Pulling ABBV
main loop list assignment index out of range

... и т. д. длявсе тикеры в списке sp500 указаны после всех соответствующих импортов.

Есть идеи, что не так? Ссылка, из которой я пытаюсь извлечь информацию, следующая: https://query1.finance.yahoo.com/v8/finance/chart/AAPL?interval=2m

1 Ответ

0 голосов
/ 13 апреля 2019

Проблема связана с тем, как вы обрабатываете ответ от Yahoo, точнее:

splitSource = sourceCode.split('\n') он не работает так, как вы думаете, лучший и самый простой способ обработать вывод -используя json.loads(), поскольку выходные данные Yahoo уже имеют формат json:

import urllib.request
import time
import datetime
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
import matplotlib.dates as mdates
import mpl_finance
from mpl_finance import candlestick_ohlc
import matplotlib
import pylab, json
...

def graphData(stock,MA1,MA2):

    '''
        Use this to dynamically pull a stock:
    '''
    try:
        print('Currently Pulling',stock)
        urlToVisit = 'https://query1.finance.yahoo.com/v8/finance/chart/'+stock+'?interval=2m'
        print(urlToVisit)
        stockFile =[]
        try:
            sourceCode = urllib.request.urlopen(urlToVisit).read().decode()
            sourceCode = json.loads(sourceCode)
            print(sourceCode['chart']['result'][0]['indicators']['quote'][0].keys())
            #dict_keys(['low', 'close', 'open', 'high', 'volume'])
...

Просто просматривая вложенный словарь json.loads, вы можете получить любые данные и в том порядке, в каком вам нравится:

stock = "FB"
print('Currently Pulling',stock)
urlToVisit = 'https://query1.finance.yahoo.com/v8/finance/chart/'+stock+'?interval=2m'
print(urlToVisit)
stockFile =[]
sourceCode = urllib.request.urlopen(urlToVisit).read().decode()
sourceCode = json.loads(sourceCode)
resp_ = {}
resp_ = sourceCode['chart']['result'][0]['indicators']['quote'][0]
resp_['timestamp'] = sourceCode['chart']['result'][0]['timestamp']
print(resp_.keys())
#dict_keys(['close', 'open', 'timestamp', 'volume', 'high', 'low'])

и метки времени для каждого значения.

...