def stock_zh_a_cdr_daily( symbol: str = "sh689009", start_date: str = "19900101", end_date: str = "22201116" ) -> pd.DataFrame: """ 新浪财经-A股-CDR个股的历史行情数据, 大量抓取容易封 IP # TODO 观察复权情况 https://finance.sina.com.cn/realstock/company/sh689009/nc.shtml :param start_date: 20201103; 开始日期 :type start_date: str :param end_date: 20201103; 结束日期 :type end_date: str :param symbol: sh689009 :type symbol: str :return: specific data :rtype: pandas.DataFrame """ res = requests.get(zh_sina_a_stock_hist_url.format(symbol)) js_code = py_mini_racer.MiniRacer() js_code.eval(hk_js_decode) dict_list = js_code.call( "d", res.text.split("=")[1].split(";")[0].replace('"', "") ) # 执行js解密代码 data_df = pd.DataFrame(dict_list) data_df.index = pd.to_datetime(data_df["date"]) del data_df["date"] data_df = data_df.astype("float") temp_df = data_df[start_date:end_date] temp_df["open"] = round(temp_df["open"], 2) temp_df["high"] = round(temp_df["high"], 2) temp_df["low"] = round(temp_df["low"], 2) temp_df["close"] = round(temp_df["close"], 2) return temp_df
def stock_zh_a_daily( symbol: str = "sz000001", start_date: str = "19900101", end_date: str = "21000118", adjust: str = "", ) -> pd.DataFrame: """ 新浪财经-A股-个股的历史行情数据, 大量抓取容易封 IP https://finance.sina.com.cn/realstock/company/sh689009/nc.shtml :param start_date: 20201103; 开始日期 :type start_date: str :param end_date: 20201103; 结束日期 :type end_date: str :param symbol: sh600000 :type symbol: str :param adjust: 默认为空: 返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-factor: 返回后复权因子; hfq-factor: 返回前复权因子 :type adjust: str :return: specific data :rtype: pandas.DataFrame """ def _fq_factor(method): if method == "hfq": res = requests.get(zh_sina_a_stock_hfq_url.format(symbol)) hfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"] ) if hfq_factor_df.shape[0] == 0: raise ValueError("sina hfq factor not available") hfq_factor_df.columns = ["date", "hfq_factor"] hfq_factor_df.index = pd.to_datetime(hfq_factor_df.date) del hfq_factor_df["date"] return hfq_factor_df else: res = requests.get(zh_sina_a_stock_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"] ) if qfq_factor_df.shape[0] == 0: raise ValueError("sina hfq factor not available") qfq_factor_df.columns = ["date", "qfq_factor"] qfq_factor_df.index = pd.to_datetime(qfq_factor_df.date) del qfq_factor_df["date"] return qfq_factor_df if adjust in ("hfq-factor", "qfq-factor"): return _fq_factor(adjust.split("-")[0]) res = requests.get(zh_sina_a_stock_hist_url.format(symbol)) js_code = py_mini_racer.MiniRacer() js_code.eval(hk_js_decode) dict_list = js_code.call( "d", res.text.split("=")[1].split(";")[0].replace('"', "") ) # 执行js解密代码 data_df = pd.DataFrame(dict_list) data_df.index = pd.to_datetime(data_df["date"]) del data_df["date"] data_df = data_df.astype("float") r = requests.get(zh_sina_a_stock_amount_url.format(symbol, symbol)) amount_data_json = demjson.decode(r.text[r.text.find("["): r.text.rfind("]") + 1]) amount_data_df = pd.DataFrame(amount_data_json) amount_data_df.index = pd.to_datetime(amount_data_df.date) del amount_data_df["date"] temp_df = pd.merge( data_df, amount_data_df, left_index=True, right_index=True, how="outer" ) temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df["amount"] = temp_df["amount"] * 10000 temp_df["turnover"] = temp_df["volume"] / temp_df["amount"] temp_df.columns = [ "open", "high", "low", "close", "volume", "outstanding_share", "turnover", ] if adjust == "": temp_df = temp_df[start_date:end_date] temp_df.drop_duplicates(subset=["open", "high", "low", "close"], inplace=True) temp_df["open"] = round(temp_df["open"], 2) temp_df["high"] = round(temp_df["high"], 2) temp_df["low"] = round(temp_df["low"], 2) temp_df["close"] = round(temp_df["close"], 2) temp_df.dropna(inplace=True) temp_df.drop_duplicates(inplace=True) return temp_df if adjust == "hfq": res = requests.get(zh_sina_a_stock_hfq_url.format(symbol)) hfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"] ) hfq_factor_df.columns = ["date", "hfq_factor"] hfq_factor_df.index = pd.to_datetime(hfq_factor_df.date) del hfq_factor_df["date"] temp_df = pd.merge( temp_df, hfq_factor_df, left_index=True, right_index=True, how="outer" ) temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df.dropna(inplace=True) temp_df.drop_duplicates(subset=["open", "high", "low", "close", "volume"], inplace=True) temp_df["open"] = temp_df["open"] * temp_df["hfq_factor"] temp_df["high"] = temp_df["high"] * temp_df["hfq_factor"] temp_df["close"] = temp_df["close"] * temp_df["hfq_factor"] temp_df["low"] = temp_df["low"] * temp_df["hfq_factor"] temp_df = temp_df.iloc[:, :-1] temp_df = temp_df[start_date:end_date] temp_df["open"] = round(temp_df["open"], 2) temp_df["high"] = round(temp_df["high"], 2) temp_df["low"] = round(temp_df["low"], 2) temp_df["close"] = round(temp_df["close"], 2) temp_df.dropna(inplace=True) return temp_df if adjust == "qfq": res = requests.get(zh_sina_a_stock_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"] ) qfq_factor_df.columns = ["date", "qfq_factor"] qfq_factor_df.index = pd.to_datetime(qfq_factor_df.date) del qfq_factor_df["date"] temp_df = pd.merge( temp_df, qfq_factor_df, left_index=True, right_index=True, how="outer" ) temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df.dropna(inplace=True) temp_df.drop_duplicates(subset=["open", "high", "low", "close", "volume"], inplace=True) temp_df["open"] = temp_df["open"] / temp_df["qfq_factor"] temp_df["high"] = temp_df["high"] / temp_df["qfq_factor"] temp_df["close"] = temp_df["close"] / temp_df["qfq_factor"] temp_df["low"] = temp_df["low"] / temp_df["qfq_factor"] temp_df = temp_df.iloc[:, :-1] temp_df = temp_df[start_date:end_date] temp_df["open"] = round(temp_df["open"], 2) temp_df["high"] = round(temp_df["high"], 2) temp_df["low"] = round(temp_df["low"], 2) temp_df["close"] = round(temp_df["close"], 2) temp_df.dropna(inplace=True) return temp_df
def stock_zh_a_daily(symbol: str = "sz000613", adjust: str = "") -> pd.DataFrame: """ 新浪财经-A股-个股的历史行情数据, 大量抓取容易封IP :param symbol: sh600000 :type symbol: str :param adjust: 默认为空: 返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-factor: 返回后复权因子; hfq-factor: 返回前复权因子 :type adjust: str :return: specific data :rtype: pandas.DataFrame """ res = requests.get(zh_sina_a_stock_hist_url.format(symbol)) js_code = execjs.compile(hk_js_decode) dict_list = js_code.call("d", res.text.split("=")[1].split(";")[0].replace( '"', "")) # 执行js解密代码 data_df = pd.DataFrame(dict_list) data_df["date"] = data_df["date"].str.split("T", expand=True).iloc[:, 0] data_df.index = pd.to_datetime(data_df["date"]) del data_df["date"] data_df = data_df.astype("float") r = requests.get(zh_sina_a_stock_amount_url.format(symbol, symbol)) amount_data_json = demjson.decode( r.text[r.text.find("["):r.text.rfind("]") + 1]) amount_data_df = pd.DataFrame(amount_data_json) amount_data_df.index = pd.to_datetime(amount_data_df.date) del amount_data_df["date"] temp_df = pd.merge(data_df, amount_data_df, left_index=True, right_index=True, how="outer") temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df["amount"] = temp_df["amount"] * 10000 temp_df["turnover"] = temp_df["volume"] / temp_df["amount"] temp_df.columns = [ "open", "high", "low", "close", "volume", "outstanding_share", "turnover", ] if adjust == "": return temp_df if adjust == "hfq": res = requests.get(zh_sina_a_stock_hfq_url.format(symbol)) hfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"]) hfq_factor_df.columns = ["date", "hfq_factor"] hfq_factor_df.index = pd.to_datetime(hfq_factor_df.date) del hfq_factor_df["date"] temp_df = pd.merge(temp_df, hfq_factor_df, left_index=True, right_index=True, how="left") temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df["open"] = temp_df["open"] * temp_df["hfq_factor"] temp_df["high"] = temp_df["high"] * temp_df["hfq_factor"] temp_df["close"] = temp_df["close"] * temp_df["hfq_factor"] temp_df["low"] = temp_df["low"] * temp_df["hfq_factor"] return temp_df.iloc[:, :-1] if adjust == "qfq": res = requests.get(zh_sina_a_stock_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"]) qfq_factor_df.columns = ["date", "qfq_factor"] qfq_factor_df.index = pd.to_datetime(qfq_factor_df.date) del qfq_factor_df["date"] temp_df = pd.merge(temp_df, qfq_factor_df, left_index=True, right_index=True, how="left") temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df["open"] = temp_df["open"] / temp_df["qfq_factor"] temp_df["high"] = temp_df["high"] / temp_df["qfq_factor"] temp_df["close"] = temp_df["close"] / temp_df["qfq_factor"] temp_df["low"] = temp_df["low"] / temp_df["qfq_factor"] return temp_df.iloc[:, :-1] if adjust == "hfq-factor": res = requests.get(zh_sina_a_stock_hfq_url.format(symbol)) hfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"]) hfq_factor_df.columns = ["date", "hfq_factor"] hfq_factor_df.index = pd.to_datetime(hfq_factor_df.date) del hfq_factor_df["date"] return hfq_factor_df if adjust == "qfq-factor": res = requests.get(zh_sina_a_stock_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])["data"]) qfq_factor_df.columns = ["date", "qfq_factor"] qfq_factor_df.index = pd.to_datetime(qfq_factor_df.date) del qfq_factor_df["date"] return qfq_factor_df
def stock_zh_a_daily(symbol="sh600000", factor=""): """ 从新浪财经-A股获取某个股票的历史行情数据, 大量抓取容易封IP :param symbol: str sh600000 :param factor: str 默认为空, 不复权; qfq, 前复权因子; hfq, 后复权因子; :return: pandas.DataFrame 不复权数据 open high low close volume date 1999-11-10 29.50 29.80 27.00 27.75 174085100 1999-11-11 27.58 28.38 27.53 27.71 29403500 1999-11-12 27.86 28.30 27.77 28.05 15008000 1999-11-15 28.20 28.25 27.70 27.75 11921100 1999-11-16 27.88 27.97 26.48 26.55 23223100 ... ... ... ... ... 2019-10-30 12.75 12.79 12.52 12.59 53734730 2019-10-31 12.68 12.70 12.50 12.51 33347533 2019-11-01 12.50 12.83 12.44 12.75 62705733 2019-11-04 12.75 12.89 12.69 12.74 49737996 2019-11-05 12.74 13.19 12.69 12.95 74274389 后复权因子 date hfq_factor 0 2019-06-11 12.7227249211316980 1 2018-07-13 12.3391802422000990 2 2017-05-25 12.2102441895126000 3 2016-06-23 9.2710670167499010 4 2015-06-23 8.1856186501361000 5 2014-06-24 7.8226125975203010 6 2013-06-03 7.2881483827828000 7 2012-06-26 6.9052943607646000 8 2011-06-03 6.6571999525935000 9 2010-06-10 5.0588982345161000 10 2009-06-09 3.8599078005559000 11 2008-04-24 2.7363470981385000 12 2007-07-18 2.0953391363342000 13 2006-05-25 2.0866878599662000 14 2006-05-12 2.0595609177866000 15 2005-05-12 1.5842776290666000 16 2004-05-20 1.5573493974111000 17 2003-06-23 1.5391056877503000 18 2002-08-22 1.5263436173709000 19 2000-07-06 1.0065019505852000 20 1999-11-10 1.0000000000000000 21 1900-01-01 1.0000000000000000 前复权因子 date qfq_factor 0 2019-06-11 1.0000000000000000 1 2018-07-13 1.0310834813499000 2 2017-05-25 1.0419713745004000 3 2016-06-23 1.3723042771825000 4 2015-06-23 1.5542777479525000 5 2014-06-24 1.6264035528443000 6 2013-06-03 1.7456731467196000 7 2012-06-26 1.8424594602978000 8 2011-06-03 1.9111225457747000 9 2010-06-10 2.5149201133019000 10 2009-06-09 3.2961214563983000 11 2008-04-24 4.6495289028892000 12 2007-07-18 6.0719168083645000 13 2006-05-25 6.0970905928105000 14 2006-05-12 6.1773967505679000 15 2005-05-12 8.0306157757383010 16 2004-05-20 8.1694736854052000 17 2003-06-23 8.2663101191762000 18 2002-08-22 8.3354264245204000 19 2000-07-06 12.6405367756464000 20 1999-11-10 12.7227249211316980 21 1900-01-01 12.7227249211316980 """ res = requests.get(zh_sina_a_stock_hist_url.format(symbol)) js_code = execjs.compile(hk_js_decode) dict_list = js_code.call( 'd', res.text.split("=")[1].split(";")[0].replace( '"', "")) # 执行js解密代码 data_df = pd.DataFrame(dict_list) data_df["date"] = data_df["date"].str.split("T", expand=True).iloc[:, 0] data_df.index = pd.to_datetime(data_df["date"]) del data_df["date"] data_df.astype("float") if not factor: return data_df if factor == "hfq": res = requests.get(zh_sina_a_stock_hfq_url.format(symbol)) hfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])['data']) hfq_factor_df.columns = ["date", "hfq_factor"] return hfq_factor_df if factor == "qfq": res = requests.get(zh_sina_a_stock_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])['data']) qfq_factor_df.columns = ["date", "qfq_factor"] return qfq_factor_df
def stock_zh_a_daily(symbol: str = "sh600751", adjust: str = "") -> pd.DataFrame: """ 新浪财经-A股-个股的历史行情数据, 大量抓取容易封IP :param symbol: sh600000 :type symbol: str :param adjust: 默认为空: 返回不复权的数据; qfq: 返回前复权后的数据; hfq: 返回后复权后的数据; hfq-factor: 返回后复权因子; hfq-factor: 返回前复权因子 :type adjust: str :return: specific data :rtype: pandas.DataFrame """ def _fq_factor(method): if method == 'hfq': res = requests.get(zh_sina_a_stock_hfq_url.format(symbol)) hfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])['data']) if hfq_factor_df.shape[0] == 0: raise ValueError('sina hfq factor not available') hfq_factor_df.columns = ["date", "hfq_factor"] hfq_factor_df.index = pd.to_datetime(hfq_factor_df.date) del hfq_factor_df["date"] return hfq_factor_df else: res = requests.get(zh_sina_a_stock_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])['data']) if qfq_factor_df.shape[0] == 0: raise ValueError('sina hfq factor not available') qfq_factor_df.columns = ["date", "qfq_factor"] qfq_factor_df.index = pd.to_datetime(qfq_factor_df.date) del qfq_factor_df["date"] return qfq_factor_df if adjust in ("hfq-factor", "qfq-factor"): return _fq_factor(adjust.split('-')[0]) res = requests.get(zh_sina_a_stock_hist_url.format(symbol)) js_code = py_mini_racer.MiniRacer() js_code.eval(hk_js_decode) dict_list = js_code.call('d', res.text.split("=")[1].split(";")[0].replace( '"', "")) # 执行js解密代码 data_df = pd.DataFrame(dict_list) data_df.index = pd.to_datetime(data_df["date"]) del data_df["date"] data_df = data_df.astype("float") r = requests.get(zh_sina_a_stock_amount_url.format(symbol, symbol)) amount_data_json = demjson.decode( r.text[r.text.find("["):r.text.rfind("]") + 1]) amount_data_df = pd.DataFrame(amount_data_json) amount_data_df.index = pd.to_datetime(amount_data_df.date) del amount_data_df["date"] temp_df = pd.merge(data_df, amount_data_df, left_index=True, right_index=True, how="outer") temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df["amount"] = temp_df["amount"] * 10000 temp_df["turnover"] = temp_df["volume"] / temp_df["amount"] temp_df.columns = [ 'open', 'high', 'low', 'close', 'volume', 'outstanding_share', 'turnover' ] if adjust == "": return temp_df if adjust == "hfq": res = requests.get(zh_sina_a_stock_hfq_url.format(symbol)) hfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])['data']) hfq_factor_df.columns = ["date", "hfq_factor"] hfq_factor_df.index = pd.to_datetime(hfq_factor_df.date) del hfq_factor_df["date"] temp_df = pd.merge(temp_df, hfq_factor_df, left_index=True, right_index=True, how="outer") temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df["open"] = temp_df["open"] * temp_df["hfq_factor"] temp_df["high"] = temp_df["high"] * temp_df["hfq_factor"] temp_df["close"] = temp_df["close"] * temp_df["hfq_factor"] temp_df["low"] = temp_df["low"] * temp_df["hfq_factor"] temp_df.dropna(how="any", inplace=True) return temp_df.iloc[:, :-1] if adjust == "qfq": res = requests.get(zh_sina_a_stock_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame( eval(res.text.split("=")[1].split("\n")[0])['data']) qfq_factor_df.columns = ["date", "qfq_factor"] qfq_factor_df.index = pd.to_datetime(qfq_factor_df.date) del qfq_factor_df["date"] temp_df = pd.merge(temp_df, qfq_factor_df, left_index=True, right_index=True, how="outer") temp_df.fillna(method="ffill", inplace=True) temp_df = temp_df.astype(float) temp_df["open"] = temp_df["open"] / temp_df["qfq_factor"] temp_df["high"] = temp_df["high"] / temp_df["qfq_factor"] temp_df["close"] = temp_df["close"] / temp_df["qfq_factor"] temp_df["low"] = temp_df["low"] / temp_df["qfq_factor"] temp_df.dropna(how="any", inplace=True) return temp_df.iloc[:, :-1]