关于get_data_stooq读取不了大陆股票那点事

        为什么要写这篇帖子呢?这要从一个课程上机作业说起,老师上课说要把yahoo换成stooq,然而换完之后输出的时候却发现根本发现毫无作用。

       先简单粗暴一点,直接上解决办法,下面会再详细说明为什么会这样。

       1.直接找到get_data_stooq的源文件(最终会到stooq.py文件中),找到自定义的_get_params(self, symbol, country="US")方法。

       2.此时有两条解决办法:

       ①在一堆.x里再加一行.cn;

       ②将if not symbol.startswith("^"):整个涵盖的范围全部注释掉。

       3.返回自己的文件(注意stooq网站大陆股票代码是“六位数字.CN”),发现完美运行。

        以一个最简单的获取股票指数的代码为例,示例如下:

import pandas_datareader
code1 = '600785.ss'
code2 = 'BYD'   #不是比亚迪
stock1 = pandas_datareader.get_data_stooq(code1,'2020-01-01','2020-01-31')
stock2 = pandas_datareader.get_data_stooq(code2,'2020-01-01','2020-01-31')
print("stock1:")
print(stock1.head())
print("stock2:")
print(stock2.head())

        输出如下:

stock1:
Empty DataFrame
Columns: []
Index: []
stock2:
               Open     High      Low    Close        Volume
Date                                                        
2020-01-31  30.5942  30.9013  29.5512  29.6310  1.074975e+06
2020-01-30  29.2541  30.7039  29.1643  30.6540  1.425216e+06
2020-01-29  29.5412  30.0777  29.0756  29.6110  8.458384e+05
2020-01-28  28.7874  29.7107  28.6289  29.4535  1.063691e+06
2020-01-27  28.3806  28.9968  28.1922  28.5691  1.292586e+06

        相信也有不少小伙伴print的时候也看到上面这个输出了吧,到底为什么美股可以而大陆股票不行呢?然后疯狂百度,得到的回应大多还是和.ss或者一堆其他的方法,但是都无济于事,也没有围绕最本质的问题展开(这就是我一天的心路历程)。

      为了解答这个疑惑,我们打开官网https://stooq.com/

         查找一下上面的两支股票,可以发现stooq上对大陆的股票的代码是“六位数字.CN”,美股是“代码.US”。这里先提醒下,即便改为.CN还是不行。

       随后我们进入源文件stooq.py,找到_get_params(self, symbol, country="US")方法

         在这里我们可以看到,默认的会将你输入的股票代码用.进行切割,然后和已有的后缀进行匹配,如果匹对失败将默认视为美股。显然.cn不在其中,这也就是问题所在。

if not symbol.startswith("^"):
    if len(symbol_parts) == 1:
        symbol = ".".join([symbol, country])
    elif symbol_parts[1].lower() == "pl":
        symbol = symbol_parts[0]
    else:
        if symbol_parts[1].lower() not in [
            "de",
            "hk",
            "hu",
            "jp",
            "uk",
            "us",
            "f",
            "b",
            "cn"
        ]:
            symbol = ".".join([symbol, "US"])

        因此像上述代码一样加上cn或者将上述文件全部注释掉就好,至此,问题完美解决。

你可能感兴趣的:(pandas,数据分析,数据挖掘,python,金融)