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 个自定义函数:

  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.”

#金融 #投资 #股票 #数据分析 #基金 #python量化

THE END