def stock_us_daily(symbol: str = "AAPL", adjust: str = "") -> pd.DataFrame: """ 新浪财经-美股 http://finance.sina.com.cn/stock/usstock/sector.shtml 备注:CIEN 新浪复权因子错误 :param symbol: 可以使用 get_us_stock_name 获取 :type symbol: str :param adjust: "": 返回未复权的数据 ; qfq: 返回前复权后的数据; qfq-factor: 返回前复权因子和调整; :type adjust: str :return: 指定 adjust 的数据 :rtype: pandas.DataFrame """ res = requests.get(f"https://finance.sina.com.cn/staticdata/us/{symbol}") js_code = py_mini_racer.MiniRacer() js_code.eval(zh_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["amount"] del data_df["date"] data_df = data_df.astype("float") res = requests.get(us_sina_stock_hist_qfq_url.format(symbol)) qfq_factor_df = pd.DataFrame(eval(res.text.split("=")[1].split("\n")[0])["data"]) qfq_factor_df.rename(columns={"c": "adjust", "d": "date", "f": "qfq_factor", }, inplace=True) qfq_factor_df.index = pd.to_datetime(qfq_factor_df["date"]) del qfq_factor_df["date"] # 处理复权因子 temp_date_range = pd.date_range("1900-01-01", qfq_factor_df.index[0].isoformat()) temp_df = pd.DataFrame(range(len(temp_date_range)), temp_date_range) new_range = pd.merge( temp_df, qfq_factor_df, left_index=True, right_index=True, how="left" ) new_range = new_range.fillna(method="ffill") new_range = new_range.iloc[:, [1, 2]] if adjust == "qfq": if len(new_range) == 1: new_range.index.values[0] = pd.to_datetime(str(data_df.index.date[0])) temp_df = pd.merge( data_df, new_range, left_index=True, right_index=True, how="left" ) temp_df.fillna(method="ffill", inplace=True) temp_df.fillna(method="bfill", inplace=True) temp_df = temp_df.astype(float) temp_df["open"] = temp_df["open"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df["high"] = temp_df["high"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df["close"] = temp_df["close"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df["low"] = temp_df["low"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df = temp_df.apply(lambda x: round(x, 4)) temp_df = temp_df.astype("float") return temp_df.iloc[:, :-2] if adjust == "qfq-factor": return qfq_factor_df if adjust == "": return data_df
def stock_us_daily(symbol: str = "AAPL", adjust: str = "") -> pd.DataFrame: """ 新浪财经-美股-个股的历史行情数据 :param symbol: 可以使用 get_us_stock_name 获取 :type symbol: str :param adjust: "": 返回未复权的数据 ; qfq: 返回前复权后的数据; qfq-factor: 返回前复权因子和调整; :type adjust: str :return: 指定 adjust 的数据 :rtype: pandas.DataFrame """ res = requests.get(us_sina_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") res = requests.get(us_sina_stock_hist_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", "adjust"] qfq_factor_df = qfq_factor_df qfq_factor_df.index = pd.to_datetime(qfq_factor_df["date"]) del qfq_factor_df["date"] # 处理复权因子 temp_date_range = pd.date_range("1900-01-01", qfq_factor_df.index[0].isoformat()) temp_df = pd.DataFrame(range(len(temp_date_range)), temp_date_range) new_range = pd.merge( temp_df, qfq_factor_df, left_index=True, right_index=True, how="left" ) new_range = new_range.fillna(method="ffill") new_range = new_range.iloc[:, [1, 2]] if adjust == "qfq": temp_df = pd.merge( data_df, new_range, left_index=True, right_index=True, how="left" ) temp_df.fillna(method="ffill", inplace=True) temp_df.fillna(method="bfill", inplace=True) temp_df = temp_df.astype(float) temp_df["open"] = temp_df["open"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df["high"] = temp_df["high"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df["close"] = temp_df["close"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df["low"] = temp_df["low"] * temp_df["qfq_factor"] + temp_df["adjust"] temp_df = temp_df.apply(lambda x: round(x, 4)) temp_df = temp_df.astype("float") return temp_df.iloc[:, :-2] if adjust == "qfq-factor": return qfq_factor_df if adjust == "": return data_df
def stock_us_daily(symbol="BRK.A", factor=""): res = requests.get(us_sina_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") res = requests.get(us_sina_stock_hist_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", "-"] if factor == "qfq": return qfq_factor_df.iloc[:, :2] else: return data_df