代码实现筛选2015年至2016年A股市场沪深300指数情绪因子、成长因子、质量因子、动量因子中的有效因子
时间: 2023-08-10 20:04:17 浏览: 112
好的,这里是一个Python实现筛选2015年至2016年A股市场沪深300指数情绪因子、成长因子、质量因子、动量因子中的有效因子的代码。代码中使用了pandas、numpy、tushare、statsmodels等库来处理数据和计算因子。
```python
import pandas as pd
import numpy as np
import tushare as ts
import statsmodels.api as sm
# 设置tushare的token
ts.set_token('your_token')
# 获取沪深300指数成分股
hs300 = ts.get_hs300s()
# 筛选出2015年至2016年的数据
start_date = '2015-01-01'
end_date = '2016-12-31'
# 获取每只股票的收盘价和总市值
close_price = pd.DataFrame()
total_mv = pd.DataFrame()
for code in hs300['code']:
df = ts.pro_bar(ts_code=code, asset='E', start_date=start_date, end_date=end_date)
close_price[code] = df['close']
total_mv[code] = df['total_mv']
# 计算日收益率、动量因子和情绪因子
daily_returns = close_price.pct_change()
momentum = daily_returns.rolling(window=12).sum().shift(1)
sentiment = pd.read_csv('sentiment.csv', index_col='date')
# 计算成长因子和质量因子
earnings_yield = pd.DataFrame(np.zeros((len(total_mv), len(total_mv.columns))), index=total_mv.index, columns=total_mv.columns)
book_to_price = pd.DataFrame(np.zeros((len(total_mv), len(total_mv.columns))), index=total_mv.index, columns=total_mv.columns)
for date in total_mv.index:
data = ts.pro_bar(ts_code='', asset='E', start_date=date, end_date=date)
for code in total_mv.columns:
if code in data['ts_code'].values:
pb_ratio = data[data['ts_code']==code]['pb'].values[0]
pe_ratio = data[data['ts_code']==code]['pe'].values[0]
total_share = data[data['ts_code']==code]['total_share'].values[0]
close = close_price[code][date]
earnings = (close*total_share)/(total_mv[code][date]*10000)
earnings_yield[code][date] = earnings/total_mv[code][date]
book_to_price[code][date] = pb_ratio/(pe_ratio*earnings_yield[code][date])
# 计算因子之间的相关系数
factors = pd.concat([momentum, sentiment, earnings_yield, book_to_price], axis=1)
corr = factors.corr()
# 使用OLS回归计算因子的t值和p值
t_values = pd.DataFrame(np.zeros((len(factors.columns),)), index=factors.columns, columns=['t_value'])
p_values = pd.DataFrame(np.zeros((len(factors.columns),)), index=factors.columns, columns=['p_value'])
for factor in factors.columns:
X = sm.add_constant(factors.drop(factor, axis=1))
y = factors[factor]
model = sm.OLS(y, X)
results = model.fit()
t_values[factor] = results.tvalues[-1]
p_values[factor] = results.pvalues[-1]
# 筛选t值大于2且p值小于0.05的因子
valid_factors = t_values[(t_values > 2) & (p_values < 0.05)].dropna().index.tolist()
print(valid_factors)
```
这段代码中,首先使用tushare库获取沪深300指数成分股,然后使用pandas库获取每只股票的收盘价和总市值,并筛选出2015年至2016年的数据。接下来,我们计算了每只股票的日收益率、动量因子、情绪因子、成长因子和质量因子。其中,动量因子是指过去12个月的收益率之和,情绪因子是从外部数据源(如新闻、社交媒体等)获取的情绪指数。成长因子是指盈利率与市净率之比,质量因子是指市净率与市盈率和盈利率之积之比。接下来,我们计算了因子之间的相关系数,并使用OLS回归计算了每个因子的t值和p值。最后,我们筛选出了t值大于2且p值小于0.05的因子,作为2015年至2016年A股市场沪深300指数中的有效因子。
阅读全文