本文介绍如何使用 Python 的 akshare 包获取股票、指数和场内基金的收盘价,并进行数据处理,以获取线性回归的期望值、残差标准差、斜率、截距、相关系数、P 值和标准误差等相关数据。
通过对线性回归相关数据的分析,量化投资者可以更好地判断市场走向。具体步骤如下:
首先,使用 akshare 包获取所需数据,并将其存储在 pandas 数据框中。然后,使用 pandas 和 numpy 库进行数据处理,计算出线性回归所需的各项数据。最后,使用 statsmodels 库进行线性回归分析,并输出结果。
通过以上步骤,我们可以得到更加清晰、简洁和整体可读性的分析结果,帮助量化投资者更好地进行市场分析和投资决策。
整理代码
import akshare as ak
import pandas as pd
import numpy as np
import csv
from scipy import stats
from datetime import datetime, timedelta
# 获取指数、股票、场内基金的线性回归期望值和残差标准差等
def linear_regression_stock_multi(symbol, kind, years_list): # 参数分别为代码,种类和调取数据年份列表
df_list = []
for many_years in years_list: # 将调取年份列表放入循环
# 获取指定股票近多少年的收盘价数据
today = datetime.now().date() # 获取当前时间
start_date = (today - timedelta(days=365*many_years)).strftime('%Y%m%d') # 获取多少年之前的时间
end_date = today.strftime('%Y%m%d') # 对今天的时间设置取结束时间,总设定格式
if kind == '指数': # 种类包括指数、股票和场内基金,不同种类其函数不同,所以,设置了条件
df = ak.index_zh_a_hist(symbol=symbol, period="daily", start_date=start_date, end_date=end_date)
elif kind == '股票':
df = ak.stock_zh_a_hist(symbol=symbol, period="daily", start_date=start_date, end_date=end_date, adjust="qfq")
# 参数分别表示代码、周期、开始时间,结束时间 是否复权
elif kind == '基金':
df = ak.fund_etf_hist_em(symbol=symbol, period="daily", start_date=start_date, end_date=end_date, adjust="qfq")
# 计算线性回归期望值和残差的标准差
y = df["收盘"]
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
index=[f"{many_years}year_expected_value", f"{many_years}year_std_residuals", f"{many_years}year_slope", f"{many_years}year_intercept", f"{many_years}year_r_value", f"{many_years}year_p_value", f"{many_years}year_std_err"]
data = [expected_value, std_residuals, slope, intercept, r_value, p_value, std_err]
# 上面数据分别表示线性回归期望值、残差标准差、斜率、截距、相关系数、P值、标准误差
result_df = pd.DataFrame(data=[data], index=[symbol], columns=index)
df_list.append(result_df)
result = pd.concat(df_list, axis=1)
return result
# 通过读取excel中的列“代码”(注意导入的是str,不是int),进行怎么,需要借助自定义函数dustom_functions(code, kind)
def get_circulate_xslx_str(kind, file_index_code,sheet): # 参数为导入的excel表格和第几张表
codes = pd.read_excel(file_index_code, sheet_name=sheet, engine='openpyxl')['代码'].astype(str).tolist() # 读取csv文件,选择“代码”列,并将其转换为列表。int导入的是整数型
all_data = pd.DataFrame()
for code in codes:
ratios = dustom_functions(code,kind) # 假设有一个名为get_valuation_ratios的函数,返回指定股票的估值比率数据。
all_data = pd.concat([all_data, ratios])
return all_data
# 调取自定义函数,进行循环获取数据
def dustom_functions(code, kind):
if kind == '线性回归':
return linear_regression_stock_multi(code, '股票', [7,3,1])
print(get_circulate_xslx_str('线性回归','测试.xlsx',0))
# print(linear_regression_stock_multi('000300', '指数', [7,3,1]))
此段代码主要是用于获取指数、股票、场内基金的线性回归期望值和残差标准差等,并通过读取 excel 中的列“代码”进行循环获取数据。
其中,linear_regression_stock_multi 函数用于获取指数、股票、场内基金的线性回归期望值和残差标准差等,get_circulate_xslx_str 函数用于通过读取 excel 中的列“代码”,进行怎么,需要借助自定义函数 dustom_functions(code, kind)。
最后,通过调用get_circulate_xslx_str函数,进行循环获取数据,并将结果打印输出。
