python 量化,获取量化模型之一的线性回归——量化 05
获取日线历史行情,并求线性回归代码
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 个自定义函数:
- def get_stock_data(symbol, table_name=None):获取日线历史行情数据,可以是指数、股票和基金。参数有 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.”
#金融 #投资 #股票 #数据分析 #基金 #python量化
版权声明:
作者:余汉波
链接:https://www.sanrenjz.com/2023/06/26/python-%e9%87%8f%e5%8c%96%ef%bc%8c%e8%8e%b7%e5%8f%96%e9%87%8f%e5%8c%96%e6%a8%a1%e5%9e%8b%e4%b9%8b%e4%b8%80%e7%9a%84%e7%ba%bf%e6%80%a7%e5%9b%9e%e5%bd%92-%e9%87%8f%e5%8c%96-05/
文章版权归作者所有,未经允许请勿转载。
THE END