目录
前置:
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