python实现多因子选股模型构建,使用tushare数据库获取数据,随机森林构建股票分类涨跌模型,模型回测时计算年化收益率、夏普比率及最大回撤率
时间: 2023-08-06 18:13:16 浏览: 323
好的,这个任务比较复杂,需要用到多个模块和算法。我会逐步为你解释,让你理解整个过程。
首先,需要安装tushare库,可以使用以下命令进行安装:
```
pip install tushare
```
然后,我们需要获取数据。这个过程分为两步:先获取股票基本信息,再获取历史行情数据。获取股票基本信息的代码如下:
```python
import tushare as ts
# 获取股票基本信息
stock_info = ts.get_stock_basics()
print(stock_info.head())
```
这里我们只需要获取股票代码和所属行业,后面会用到股票代码作为索引,所以需要将其设置为索引:
```python
# 将股票代码设置为索引
stock_info = stock_info.set_index('code')
# 只保留所属行业这一列
stock_info = stock_info[['industry']]
print(stock_info.head())
```
接下来,我们获取历史行情数据。这里我们以获取000001.SZ(平安银行)的历史行情数据为例,代码如下:
```python
import tushare as ts
# 获取历史行情数据
hist_data = ts.get_hist_data('000001')
print(hist_data.head())
```
这里我们只保留收盘价这一列,并将其作为新的一列添加到数据中:
```python
# 只保留收盘价这一列
hist_data = hist_data[['close']]
# 将收盘价作为新的一列添加到数据中
stock_info['close'] = hist_data['close']
print(stock_info.head())
```
现在我们已经获取了股票基本信息和历史行情数据,接下来我们需要构建多因子选股模型。这里我们以以下因子作为样本特征:每股收益、市盈率、市净率、总市值、流通市值,代码如下:
```python
import tushare as ts
# 获取股票基本信息
stock_info = ts.get_stock_basics()
# 将股票代码设置为索引
stock_info = stock_info.set_index('code')
# 只保留所属行业这一列
stock_info = stock_info[['industry']]
# 获取历史行情数据
hist_data = ts.get_hist_data('000001')
# 只保留收盘价这一列
hist_data = hist_data[['close']]
# 将收盘价作为新的一列添加到数据中
stock_info['close'] = hist_data['close']
# 获取每股收益、市盈率、市净率、总市值、流通市值
financial_data = ts.get_profit_data(2019, 3)
financial_data = financial_data.set_index('code')
financial_data = financial_data[['eps', 'pe', 'pb', 'totalAssets', 'liquidAssets']]
# 将所有数据合并为一个DataFrame
df = pd.concat([stock_info, financial_data], axis=1)
# 丢弃nan值
df = df.dropna()
# 打印数据
print(df.head())
```
接下来,我们需要将数据分为训练集和测试集。这里我们使用sklearn库的train_test_split函数进行划分:
```python
from sklearn.model_selection import train_test_split
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('close', axis=1), df['close'], test_size=0.2, random_state=0)
```
接下来,我们使用随机森林算法构建股票分类涨跌模型。代码如下:
```python
from sklearn.ensemble import RandomForestRegressor
# 使用随机森林算法构建股票分类涨跌模型
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(X_train, y_train)
```
接下来,我们使用模型进行预测,并计算模型的性能指标。代码如下:
```python
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score
# 使用模型进行预测
y_pred = model.predict(X_test)
# 计算均方误差和R2值
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差:", mse)
print("R2值:", r2)
```
最后,我们计算年化收益率、夏普比率及最大回撤率。代码如下:
```python
import matplotlib.pyplot as plt
# 计算每日收益率
daily_returns = (y_test - y_test.shift(1)) / y_test.shift(1)
# 计算累计收益率
cum_returns = np.cumprod(1 + daily_returns) - 1
# 计算年化收益率
annual_returns = (1 + cum_returns[-1]) ** (250 / len(daily_returns)) - 1
# 计算波动率
volatility = np.std(daily_returns) * np.sqrt(250)
# 计算夏普比率
sharpe_ratio = (annual_returns - 0.03) / volatility
# 计算最大回撤率
max_drawdown = ((cum_returns - cum_returns.cummax()) / cum_returns.cummax()).min()
# 打印结果
print("年化收益率:", annual_returns)
print("夏普比率:", sharpe_ratio)
print("最大回撤率:", max_drawdown)
# 绘制收益曲线
plt.plot(cum_returns)
plt.show()
```
这样就完成了多因子选股模型构建和股票分类涨跌模型的构建、回测和性能指标计算。
阅读全文