获取日线历史行情,并求线性回归代码

import pandas as pd import numpy as np from scipy import stats import akshare as ak import datetime # 获取日线历史行情 def get_stock_data(symbol, table_name=None): today = datetime.date.today() end_date_str = today.strftime("%Y%m%d") start_date = (today - datetime.timedelta(days=7 * 365)).strftime("%Y%m%d") if table_name == "美股中国企业价值": symbol = "106." + symbol stock_data = ak.stock_us_hist( symbol=symbol, period="daily", start_date=start_date, end_date=end_date_str, adjust="qfq" ) elif table_name == "纳指100价值": symbol = "105." + symbol stock_data = ak.stock_us_hist( symbol=symbol, period="daily", start_date=start_date, end_date=end_date_str, adjust="qfq" ) elif table_name == "港股价值": stock_data = ak.stock_hk_hist( symbol=symbol, period="daily", start_date=start_date, end_date=end_date_str, adjust="qfq" ) elif table_name == "场内基金价值": stock_data = ak.index_zh_a_hist( symbol=symbol, period="daily", start_date=start_date, end_date=end_date_str ) else: if symbol.startswith(("1", "5")): stock_data = ak.fund_etf_hist_em( symbol=symbol, period="daily", start_date=start_date, end_date=end_date_str, adjust="qfq" ) else: stock_data = ak.stock_zh_a_hist( symbol=symbol, period="daily", start_date=start_date, end_date=end_date_str, adjust="qfq" ) return stock_data # 获取线性回归期望值和残差标准差 def linear_regression_dfcf(years_list, symbol, table_name=None): # 参数分别为代码,种类和调取数据年份列表 data = get_stock_data(symbol, table_name=None) df_list = [] for many_years in years_list: # 将调取年份列表放入循环 percent = round(len(data)/7*many_years) y = data.iloc[-percent:]["收盘"] # 调取自定义函数中的"close"列 x = np.arange(len(y)) slope, intercept, r_value, p_value, std_err = stats.linregress(x, y) expected_value = intercept + slope * len(y) # 计算期望值 residuals = y - (intercept + slope * x) # 残差 std_residuals = np.std(residuals) # 残差标准差 # 构建结果DataFrame columns=[f"expected_value_{many_years}year", f"std_residuals_{many_years}year"] result_data = [expected_value, std_residuals] # 上面数据分别表示线性回归期望值、残差标准差、斜率、截距、相关系数、P值、标准误差 result_df = pd.DataFrame(data=[result_data], columns=columns) df_list.append(result_df) result = pd.concat(df_list, axis=1) return result if __name__ == '__main__': data = linear_regression_dfcf([7, 3, 1], "000001") print(data)

打开网易新闻 查看精彩图片

代码说明

代码共有 2 个自定义函数:

  1. def get_stock_data(symbol, table_name=None):获取日线历史行情数据,可以是指数、股票和基金。参数有 2 个,分别是代码和数据来源对代码增加市场,第 2 个为非必要参数。

  2. def linear_regression_dfcf(years_list, symbol, table_name=None):获取线性回归期望值和残差标准差。参数有 3 个,分别是线性回归的年份列表、代码和数据来源对代码增加市场,第 3 个为非必要参数

需要修改的代码

调取函数,需要对代码进行相应的修改 data = linear_regression_dfcf([7, 3, 1], "000001"): 第 1 个参数为获取线性回归的年数,比如求 1 年的线性回归期望值和残差标准着,则列表为[1]。 第 2 个参数要获取线性回归的对象,可以是股票、指数和场内基金。若是港美股需要增加一个参数,比如“纳指100价值”,给代码增加市场代码“105.”