用python对股票的移动平均线、相对强弱指数、布林带指标这三个指标,实现定义交易策略、获取数据、数据清洗和预处理、特征工程、建模选择、数据集划分、模型训练、模型评估、模型优化、回测、风险管理给出代码并详细解释
时间: 2023-09-17 13:13:01 浏览: 111
股票数据(不包括当天) -python代码
本题需要用到的库有:pandas、numpy、talib、scikit-learn、matplotlib、yfinance、backtrader。在开始之前,我们需要先安装这些库。
1. 定义交易策略
移动平均线策略:当短期均线(如5日均线)上穿长期均线(如20日均线)时,买入股票;当短期均线下穿长期均线时,卖出股票。
相对强弱指数策略:当RSI指标低于30时,买入股票;当RSI指标高于70时,卖出股票。
布林带指标策略:当股票价格低于下轨时,买入股票;当股票价格高于上轨时,卖出股票。
我们可以先定义一个函数来实现这些交易策略:
```
def trading_strategy(data):
# 移动平均线策略
data['short_ma'] = talib.SMA(data['Close'], timeperiod=5)
data['long_ma'] = talib.SMA(data['Close'], timeperiod=20)
data['signal_ma'] = np.where(data['short_ma'] > data['long_ma'], 1, 0)
data['signal_ma'] = np.where(data['short_ma'] < data['long_ma'], -1, data['signal_ma'])
# 相对强弱指数策略
data['rsi'] = talib.RSI(data['Close'], timeperiod=14)
data['signal_rsi'] = np.where(data['rsi'] < 30, 1, 0)
data['signal_rsi'] = np.where(data['rsi'] > 70, -1, data['signal_rsi'])
# 布林带指标策略
data['upper'], data['middle'], data['lower'] = talib.BBANDS(data['Close'], timeperiod=20)
data['signal_bb'] = np.where(data['Close'] < data['lower'], 1, 0)
data['signal_bb'] = np.where(data['Close'] > data['upper'], -1, data['signal_bb'])
# 综合策略
data['signal'] = data['signal_ma'] + data['signal_rsi'] + data['signal_bb']
data['signal'] = np.where(data['signal'] > 1, 1, data['signal'])
data['signal'] = np.where(data['signal'] < -1, -1, data['signal'])
return data
```
2. 获取数据
我们可以使用 `yfinance` 库来获取数据,例如获取阿里巴巴的股票数据:
```
import yfinance as yf
data = yf.download('BABA', start='2015-01-01', end='2021-07-31')
```
3. 数据清洗和预处理
我们需要检查数据是否存在缺失值或异常值,并进行必要的处理。在这里,我们可以使用 `fillna` 函数来填充缺失值:
```
data.fillna(method='ffill', inplace=True)
```
4. 特征工程
在这里,我们已经在交易策略中计算了指标。我们可以在特征中选择这些指标来进行建模。
```
features = ['Open', 'High', 'Low', 'Close', 'Volume', 'short_ma', 'long_ma', 'rsi', 'upper', 'middle', 'lower']
data = data[features]
```
5. 建模选择
我们可以使用 scikit-learn 库来选择最好的模型。例如,我们可以使用 `GridSearchCV` 函数来选择支持向量机的最优参数:
```
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
params = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
model = GridSearchCV(SVC(), params)
```
6. 数据集划分
我们可以使用 `train_test_split` 函数将数据集划分为训练集和测试集:
```
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
7. 模型训练
我们可以使用 `fit` 函数来训练模型:
```
model.fit(X_train, y_train)
```
8. 模型评估
我们可以使用 `score` 函数来评估模型性能:
```
score = model.score(X_test, y_test)
```
9. 模型优化
我们可以使用交叉验证等技术来优化模型性能。
10. 回测
我们可以使用 backtrader 库来进行回测。例如,我们可以定义一个 `Backtest` 类来回测我们的策略:
```
import backtrader as bt
class Backtest(bt.Strategy):
def __init__(self):
self.signal = self.datas[0].signal
def next(self):
if self.signal == 1:
self.buy()
elif self.signal == -1:
self.sell()
cerebro = bt.Cerebro()
data = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data)
cerebro.addstrategy(Backtest)
cerebro.run()
cerebro.plot()
```
11. 风险管理
我们可以使用风险管理技术来降低投资风险。例如,我们可以使用 `stop_loss` 函数来设置止损:
```
class Backtest(bt.Strategy):
def __init__(self):
self.signal = self.datas[0].signal
def next(self):
if self.signal == 1:
self.buy(exectype=bt.Order.Market, size=1000)
self.stop_loss = self.data.close[0] * 0.9
elif self.signal == -1:
self.sell(exectype=bt.Order.Market, size=1000)
if self.position:
if self.data.close[0] < self.stop_loss:
self.sell(exectype=bt.Order.Market, size=self.position.size)
```
阅读全文