利用强化学习进行股票操作实战(三)利用强化学习进行股票操作实战(三)
与上一篇文章相同之处与上一篇文章相同之处
对于交易策略,与上一篇文章相同,当发出买入指令时,一次性全部买入;当发出卖出指令时,一次性全部卖出。还没有添加加减仓操作。
模型仍然用的是DQN模型。
新增内容新增内容
在之前的基础上加入了交易手续费、印花税等。
在强化学习这个领域中,reward函数是一个需要精心设计的函数。目前暂时没有好的reward设计思路,但还是修改了之前的reward函数。(其实之前的
reward的设计也是错的)
首先将第二天的股票价格的涨跌幅当做reward。
reward =(self.trend[self.t + 1] - self.trend[self.t]) / self.trend[self.t]
在股市的涨跌中,很多涨跌其实是无意义的涨跌(小幅度的上涨或小幅度的下跌回调),如果把这些因素考虑进去会造成模型难以提取到一些有效信息。
因此,当涨跌幅较小时,我设置了reward进行一定程度的缩小。当涨跌程度较大时,我认为这个可能也会影响模型的判断,我同样设置了reward以一定
程度缩小,核心代码如下:
if np.abs(reward)<=0.015:
self.reward = reward * 0.2
elif np.abs(reward)=0.05:
if reward < 0 :
self.reward = (reward+0.05) *0.1 - 0.05
else:
self.reward = (reward-0.05) *0.1 + 0.05
对于股票的买入卖出或不操作等策略,都会影响reward。当股票卖出,r如果未来上涨了会给一个负向的reward,迫使它下次要买入;类似如果卖出,第
二天下跌了就给一个正向的reward。如果股票不进行操作同样会给一个reward,但是这个reward比较小,因为我这边认为模型难以判断未来情况。核心
代码如下:
if self.hold_num > 0 or action == 2:
self.reward = reward
if action == 2:
self.reward = -self.reward
else:
self.reward = -self.reward * 0.1
在制定交易策略时,经常需要将多个交易策略结合在一起,这样才能让交易策略稳定,风险降低。在进行回测时,我加入了均线策略。如果当日收盘价小
于21日均线时,说明该股暂时有一定风险需要进行避险操作。(均线策略在模型训练时不使用)
定义了trick函数获取当日收盘价是否小于21日均线,核心代码如下:
def trick(self):
if self.df['close'][self.t] >= self.df['ma21'][self.t]:
return True
else:
return False
如果模型发出买入指令并且收盘价大于21日均线,买入。如果模型发出不操作指令,但收盘价小于21日均线,卖出。核心代码如下:
if action == 1 and self.hold_money >= (self.trend[self.t]*100 + \
max(self.buy_min, self.trend[self.t]*100*self.buy_rate)) and self.t 0:
# 卖出股票
self.sell_stock(self.hold_num)
if show_log:
print(
'day:%d, sell price:%f,total balance %f,'
% (self.t,self.trend[self.t], self.hold_money)
)
else:
if my_trick and self.hold_num>0 and not self.trick():
self.sell_stock(self.hold_num)
if show_log:
print(
'day:%d, sell price:%f,total balance %f,'
% (self.t,self.trend[self.t], self.hold_money)
)
测试结果测试结果
用000065股票的前1500天数据训练,用后面296天的数据进行测试。
结果如下:
不加均线策略的回测结果:
交易情况交易情况:
评论5