方差分析_单因素、多因素、析因方差分析

发布于:2025-04-06 ⋅ 阅读:(20) ⋅ 点赞:(0)

目录

前置:

步骤

1 数据准备

2 数据合并到一个表中

3 方差分析验证 

3.1 单因素方差分析

3.2 多因素方差分析

3.3 析因方差分析

数据


前置:

1 知识点来自《量化投资_以Python为工具》书籍,第十六章,页码227

2 使用其他数据过一遍方差分析的知识点:验证因子对一个连续型变量是否有影响

连续型因变量 A股2024年收益率 被影响的变量,可以理解为方程式中的y
因子 股票所属行业 可能的影响因素
因子 股票所属地区 可能的影响因素
因子 2023年净利润同比是否大于0 可能的影响因素

步骤

1 数据准备

1.1  https://mpbeta.csdn.net/mp_blog/creation/editor/147012294 博文中获取的年数据

遍历每个股票的年数据,计算年收益率

(本文年收益率计算方法=(今年收盘价-去年收盘价)/去年收盘价 *100%)

1.2 通达信A股行情获取的行业和地区

打开通达信-》行情-》A股,按34

1.3 2023年净利润同比数据

akshare 获取 同花顺-财务指标-主要指标

df = ak.stock_financial_abstract_ths(symbol=ticker,indicator='按报告期')
df.to_csv(pre_dir+ticker+'.csv',encoding='utf-8')

2 数据合并到一个表中

计算年度收益率,并与行业、地区因子合并

def example_001():
    '''
    P245
    :return:
    '''
    year_dir = r'E:/temp007/year/'
    file_list = os.listdir(year_dir)
    # 收益率 ((今年-去年)/去年)*100%
    ticker_dict = {}
    for file_one in file_list:
        ticker = file_one[0:6]
        df00 = pd.read_csv(year_dir + file_one,encoding='utf-8')
        df00['close_abs'] = df00['closePrice'].abs()
        df00['ret'] = (df00['closePrice']-df00['closePrice'].shift(1))/df00['close_abs'].shift(1)
        ticker_dict[ticker] = df00.loc[df00['o_date']=='2024-12-31'].iloc[0]['ret']
        pass
    df = pd.DataFrame({
        'ticker':list(ticker_dict.keys()),
        'ret':list(ticker_dict.values())
    })
    df_industry = pd.read_excel(r'E:/temp007/全部A股20250403.xlsx',engine='openpyxl',dtype={'代码':str})
    df_ins = df_industry.loc[:,['代码','细分行业','地区']].copy()
    df_ins.rename(columns={'代码':'ticker','细分行业':'industry','地区':'eara'},inplace=True)
    df = pd.merge(df,df_ins,on='ticker',how='left')
    df.to_csv(r'E:/temp007/000.csv',encoding='utf-8')
    pass

合并2023年净利润同比数据 

def example_001_01():
    pre_dir = r'E:/temp005/'
    file_list = os.listdir(pre_dir)
    ticker_dict = {}
    for file_one in file_list:
        ticker = file_one[0:6]
        df = pd.read_csv(pre_dir + file_one,encoding='utf-8')
        res = df.loc[df['报告期']=='2023-12-31'].iloc[0]['净利润同比增长率']
        ticker_dict[ticker] = float(res[0:-1]) if res!='FALSE' else None
        pass
    df00 = pd.read_csv(r'E:/temp007/000.csv',encoding='utf-8',dtype={'ticker':str})
    df01 = pd.DataFrame({
        'ticker':list(ticker_dict.keys()),
        'tongbi':list(ticker_dict.values())
    })
    df00 = pd.merge(df00,df01,on='ticker',how='left')
    df00.to_csv(r'E:/temp007/111.csv',encoding='utf-8')
    pass

3 方差分析验证 

3.1 单因素方差分析

1)待验证:行业是否是2024年收益率的影响因素

def example_001_10():
    import statsmodels.stats.anova as anova
    from statsmodels.formula.api import ols
    year_return = pd.read_csv(r'E:/temp007/111.csv',encoding='utf-8')
    model = ols('ret ~ C(industry)',data=year_return.dropna()).fit()
    # print(model.summary())
    table1 = anova.anova_lm(model)
    print(table1)

p值为 1.024e-41,远远小于0.05。所以,行业是影响2024年收益率的一个因素

2)待验证:地区是否是2024年收益率的影响因素

def example_001_10():
    import statsmodels.stats.anova as anova
    from statsmodels.formula.api import ols
    year_return = pd.read_csv(r'E:/temp007/111.csv',encoding='utf-8')
    model = ols('ret ~ C(eara)',data=year_return.dropna()).fit()
    # print(model.summary())
    table1 = anova.anova_lm(model)
    print(table1)
    pass

p值 0.049574,与0.05非常接近,可以认为地区不是影响2024年收益率的因素

3) 待验证:2023年净利润同比是否大于0是否是2024年收益率的影响因素

def example_001_10():
    import statsmodels.stats.anova as anova
    from statsmodels.formula.api import ols
    year_return = pd.read_csv(r'E:/temp007/111.csv',encoding='utf-8')
    year_return['tongbi00'] = 0
    year_return.loc[year_return['tongbi']>0,'tongbi00'] = 1
    model = ols('ret ~ C(tongbi00)',data=year_return.dropna()).fit()
    # print(model.summary())
    table1 = anova.anova_lm(model)
    print(table1)
    pass

p值 6.7878e-14,远远小于0.05。所以2023年净利润同比是否大于0是影响2024年收益率的一个因素。 

3.2 多因素方差分析

def example_001_10():
    import statsmodels.stats.anova as anova
    from statsmodels.formula.api import ols
    year_return = pd.read_csv(r'E:/temp007/111.csv',encoding='utf-8')
    year_return['tongbi00'] = 0
    year_return.loc[year_return['tongbi']>0,'tongbi00'] = 1
    model = ols('ret ~ C(tongbi00)+C(industry)+C(eara)',data=year_return.dropna()).fit()
    # print(model.summary())
    table1 = anova.anova_lm(model)
    print(table1)
    pass

2023年净利润同比是否大于0,与行业,的p值都远远小于0.05,说明两者对2024年收益率有影响。地区的p值大于0.05,说明地区对2024年收益率没有影响。

3.3 析因方差分析

3.2中,2023年净利润同比是否大于0,与行业,两者对2024年收益率有影响。析因方差分析用来检验两者对2024年收益率的影响是否与另一个因子的水平有关。

def example_001_10():
    import statsmodels.stats.anova as anova
    from statsmodels.formula.api import ols
    year_return = pd.read_csv(r'E:/temp007/111.csv',encoding='utf-8')
    year_return['tongbi00'] = 0
    year_return.loc[year_return['tongbi']>0,'tongbi00'] = 1
    model = ols('ret ~ C(tongbi00)*C(industry)',data=year_return.dropna()).fit()
    # print(model.summary())
    table1 = anova.anova_lm(model)
    print(table1)
    pass

第三个系数的p值 0.9>0.05,即结果并不显著。所以, 2023年净利润同比是否大于0,与行业,两者对2024年收益率的影响并不依赖于另一者的水平。

数据

最后使用的表格数据

 通过网盘分享的文件:方差分析.7z
链接: https://pan.baidu.com/s/1X8ktM-BoDx4FqoRiUmsgoQ?pwd=b8kp 提取码: b8kp