使用强化学习(使用Python代码!)预测股票价格
这些是我们如今定期听到的有关股市的句子。您可以将HDFC替换为在动荡的2020年期间兴旺的任何其他股票,其叙述仍然非常相似。
股市是赚钱和投资的有趣媒介。这也是一个有利可图的选择,它可以增加您的贪婪并做出明智的决定。这主要是由于市场的波动性。这是一场赌博,通常会导致获利或亏损。没有正确的股票价格预测模型。价格走势很大程度上受供求比率的影响。
股票价格强化学习形象
在本文中,我们将尝试通过使用强化学习来减轻这种情况。我们将介绍用于股票市场预测的再学习技术。
我们可以用来预测股票价格的技术
由于它是对连续值的预测,因此可以使用任何一种回归技术:
线性回归将帮助您预测连续值
时间序列模型是可用于与时间相关的数据的模型
ARIMA是一种用于预测未来时间相关预测的模型
LSTM也是一种用于股价预测的技术。LSTM指的是长期短期记忆,它利用神经网络来预测连续值。LSTM非常强大,以保留长期记忆而著称
但是,还有另一种可用于股票价格预测的技术,即强化学习。
股票价格强化学习Google股票
什么是强化学习?
强化学习是除监督学习和无监督学习之外的另一种机器学习类型。这是一个基于代理的学习系统,其中代理在目标是最大化记录的环境中采取行动。强化学习不需要像监督学习那样使用标记数据。
强化学习在较少的历史数据的情况下效果很好。它利用值函数并根据为该操作决定的策略进行计算。
强化学习被建模为马尔可夫决策过程(MDP):
环境E和代理状态S
代理采取的一组动作A
P(s,s')=> P(st + 1 = s'| st = s,at = a)是从一种状态s到s'的转变概率
R(s,s')–任何行动立即获得奖励
我们如何通过强化学习来预测股市价格?
强化学习的概念可以应用于特定股票的股价预测,因为它使用的基本原理是需要较少的历史数据,并在基于代理的系统中根据当前环境预测较高的回报。通过遵循强化学习模型,我们将看到某个股票的股价预测示例。它利用了Q学习的概念进一步解释。
设计强化学习模型的步骤是–
导入库
创建将做出所有决定的代理商
定义用于格式化值的基本功能,Sigmoid函数,读取数据文件等
培训代理商
评估代理商绩效
定义强化学习环境
股票价格预测的MDP:
代理–在环境E中工作的代理A
动作–买/卖/持有
状态–数据值
奖励-损益
代理环境股票价格强化学习
Q的作用–学习
Q学习是一种无模型的强化学习算法,用于学习告知操作人员在何种情况下应采取何种操作的操作质量。Q学习在从当前状态开始的任何连续步骤中最大化总回报的期望值的意义上找到了一种最佳策略。
取得资料
前往Yahoo Finance
输入公司名称,例如。HDFC银行
选择时间段,例如5年
单击下载以下载CSV文件
预测股价上涨学习数据
让我们在Python中实现我们的模型
导入库
要构建强化学习模型,请导入所需的用于对神经网络层建模的python库和一些基本操作的NumPy库。
进口喀拉拉邦
从keras.models导入顺序
从keras.models导入load_model
从keras.layers导入密集
从keras.optimizers导入Adam
导入数学
将numpy导入为np
随机导入
来自收藏品进口双端队列
创建代理
代理代码以各种参数的一些基本初始化开始。定义了一些静态变量,例如gamma,epsilon,epsilon_min和epsilon_decay。这些是阈值常数,用于驱动股票的整个购买和出售过程并保持参数的跨步。这些最小值和衰减值在正态分布中的作用类似于阈值。
代理设计分层神经网络模型以采取购买,出售或持有的行动。通过查看其先前的预测以及当前的环境状态,可以采取这种行动。act方法用于预测要采取的下一个动作。如果内存已满,还有另一种称为expReplay的方法可以重置内存。
类代理:
def __init __(self,state_size,is_eval = False,model_name =“”):
self.state_size = state_size#归一化的前几天
self.action_size = 3#坐,买,卖
self.memory =双端队列(maxlen = 1000)
self.inventory = []
self.model_name =模型名称
self.is_eval = is_eval
自我伽玛= 0.95
self.epsilon = 1.0
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
self.model = load_model(model_name)如果is_eval否则self._model()
def _model(self):
模型= Sequential()
model.add(Dense(units = 64,input_dim = self.state_size,activation =“ relu”))
model.add(Dense(units = 32,Activation =“ relu”))
model.add(Dense(units = 8,Activation =“ relu”))
model.add(Dense(self.action_size,activation =“ linear”))
model.compile(loss =“ mse”,Optimizer = Adam(lr = 0.001))
退货模式
def行为(自身,状态):
如果不是self.is_eval和random.random()<= self.epsilon:
返回random.randrange(self.action_size)
选项= self.model.predict(状态)
返回np.argmax(options [0])
def expReplay(self,batch_size):
mini_batch = []
l = len(自我记忆)
对于范围(l-batch_size + 1,l)中的i:
mini_batch.append(self.memory [i])
在mini_batch中完成状态,动作,奖励,next_state的操作:
目标=奖励
如果没有完成:
目标=奖励+ self.gamma * np.amax(self.model.predict(next_state)[0])
target_f = self.model.predict(状态)
target_f [0] [action] =目标
self.model.fit(state,target_f,epochs = 1,verbose = 0)
如果self.epsilon> self.epsilon_min:
self.epsilon * = self.epsilon_decay
定义基本功能
编写formatprice()来构造货币格式。getStockDataVec()会将库存数据带入python。将S形函数定义为数学计算。getState()的编码方式为它给出了数据的当前状态。
def formatPrice(n):
return(“-Rs。”如果n <0,否则为“ Rs。”)+“ {0:.2f}”。format(abs(n))
def getStockDataVec(key):
vec = []
lines = open(key +“。csv”,“ r”)。read()。splitlines()
用于行中的行[1:]:
#print(行)
#print(float(line.split(“,”)[4]))
vec.append(float(line.split(“,”)[4]))
#print(vec)
返回vec
def sigmoid(x):
返回1 /(1 + math.exp(-x))
def getState(data,t,n):
d = t-n + 1
block = data[d:t + 1] if d >= 0 else -d * [data[0]] + data[0:t + 1] # pad with t0
res = []
for i in range(n - 1):
res.append(sigmoid(block[i + 1] - block[i]))
return np.array([res])
Training the Agent
Depending on the action that is predicted by the model
import sys
stock_name = input("Enter stock_name
window_size = input()
episode_count = input()
stock_name = str(stock_name)
window_size = int(window_size)
episode_count = int(episode_count)
agent = Agent(window_size)
data = getStockDataVec(stock_name)
l = len(data) - 1
batch_size = 32
for e in range(episode_count + 1):
print("Episode " + str(e) + "/" + str(episode_count))
state = getState(data
total_profit = 0
agent.inventory = []
for t in range(l):
action = agent.act(state)
# sit
next_state = getState(data
reward = 0
if action == 1: # buy
agent.inventory.append(data[t])
print("Buy: " + formatPrice(data[t]))
elif action == 2 and len(agent.inventory) > 0: # sell
bought_price = window_size_price = agent.inventory.pop(0)
reward = max(data[t] - bought_price
total_profit += data[t] - bought_price
print("Sell: " + formatPrice(data[t]) + " | Profit: " + formatPrice(data[t] - bought_price))
done = True if t == l - 1 else False
agent.memory.append((state
state = next_state
if done:
print("--------------------------------")
print("Total Profit: " + formatPrice(total_profit))
print("--------------------------------")
if len(agent.memory) > batch_size:
agent.expReplay(batch_size)
if e % 10 == 0:
agent.model.save(str(e))
Training Output at the end of the first episode:
Total Profit: Rs.340.03
训练输出图
The feedback i.e. reward is given to the Agent for further processing
Evaluation of the model
Once the model has been trained depending on new data
stock_name = input("Enter Stock_name
model_name = input()
model = load_model(model_name)
window_size = model.layers[0].input.shape.as_list()[1]
agent = Agent(window_size
data = getStockDataVec(stock_name)
print(data)
l = len(data) - 1
batch_size = 32
state = getState(data
print(state)
total_profit = 0
agent.inventory = []
print(l)
for t in range(l):
action = agent.act(state)
print(action)
# sit
next_state = getState(data
reward = 0
if action == 1: # buy
agent.inventory.append(data[t])
print("Buy: " + formatPrice(data[t]))
elif action == 2 and len(agent.inventory) > 0: # sell
bought_price = agent.inventory.pop(0)
reward = max(data[t] - bought_price
total_profit += data[t] - bought_price
print(“卖出:” + formatPrice(data [t])+“ |利润:” + formatPrice(data [t]-buy_price))
完成=如果t == l-1否则为False
agent.memory.append((状态,动作,奖励,next_state,完成))
状态= next_state
如果完成:
打印(” - - - - - - - - - - - - - - - - ”)
打印(股票名称+“总利润:” +格式价格(总利润))
打印(” - - - - - - - - - - - - - - - - ”)
打印(“总利润为:”,formatPrice(total_profit))
题库