【问题标题】:Stock screener from SentdexSentdex 的股票筛选器
【发布时间】:2019-04-13 16:27:13
【问题描述】:

我正在尝试复制他在 2013 年作为教程上传的 Sentdex 股票筛选器 (https://www.youtube.com/watch?v=Y4GHgJjIQnk)。不幸的是,从那时起很多事情都发生了变化,因此对他提出的代码进行了细微的调整。我只在下面发布了无法正常工作的代码部分。如果有人感兴趣,可以通过上面的链接获得完整的代码。

代码,基本上是原始代码,除了一些关于 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

【问题讨论】:

    标签: python numpy yahoo-finance


    【解决方案1】:

    问题在于您处理来自Yahoo 的响应的方式,更准确地说:

    splitSource = sourceCode.split('\n') 它并不像你想象的那样,处理输出的最好和最简单的方法是使用json.loads(),因为雅虎输出已经在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'])
    

    以及每个值的时间戳。

    【讨论】:

    • 嗨,本,感谢您的贡献。不幸的是,它仍然不适合我。我现在得到的错误是:`字符串索引必须是整数,无法组织提取的数据。 UserWarning: loadtxt: Empty input file: "[]" date, closep, highp, lowp, openp, volume = np.loadtxt(stockFile,delimiter=',', unpack=True, converters={0: bytespdate2num('%Y %m%d')}) 主循环列表分配索引超出范围`而且,最烦人的是,整个 json yahoo 文件现在在此之前打印为输出!
    • 使用json就不用解压了,几分钟后给你完整版
    • 对不起,我是一个相当菜鸟的用户:D
    • 我添加了一个示例,该示例为您提供了一个简单的字典,可以使用简单的键进行浏览,顺便说一句,我之前的答案有一个小错字,您必须有 sourceCode = json.loads(sourceCode) 而不是 SplitSource = json...,我在更新中修复了它回答,请务必接受我的回答;)
    • 我非常乐意接受您的回答,但是您提出的解决方案对我来说并不适用...我尝试实施您的解决方案,但出现了更多错误,例如“HTTP错误 404:未找到未能组织提取的数据。”或“主循环列表分配索引超出范围”。我也尝试单独运行您的示例,但它产生了:“目前正在拉动 FB query1.finance.yahoo.com/v8/finance/chart/FB?interval=2m dict_keys(['volume', 'low', 'high', 'open', 'close', 'timestamp'])"
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 2011-03-15
    • 2022-06-23
    相关资源
    最近更新 更多