历史文档

【历史文档】高阶技巧-pytorch模型固化+提交模拟交易

由qxiao创建,最终由small_q 被浏览 245 用户

更新

本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明

新版量化开发IDE(AIStudio):

https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW

新版模版策略:

https://bigquant.com/wiki/doc/demos-ecdRvuM1TU

新版数据平台:

https://bigquant.com/data/home

https://bigquant.com/wiki/doc/dai-PLSbc1SbZX

新版表达式算子:

https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS

新版因子平台:

https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5

\

深度学习模型固化

之前有许多帖子是关于tensorflow的模型固化, 这一篇讲的是pytorch框架搭建的模型下的固化.

深度学习拟合动量因子策略

本文使用DNN模型模拟过去四日的动量因子, 输入特征是过去四日的最高价、最低价、开盘价、收盘价, 这些特征能够合成任意形式的动量, 这里选用DNN的目的是使用全连接网络去拟合出一个和三日收益率关联度最高的动量模型. 最后将模型进行保存.

模型固化

由于模型初始化的参数是随机的, 以及优化器路径也有随机性质(SGD、Adam等都包含随机动量因素), 导致训练出来的模型每次结果都不一致, 我们想做的是保存最好的那一次结果, 这时就需要对模型参数进行保存, 我将模型保存写入了”模型训练”的模块当中了:

一般将模型参数保存在userlib文件夹下:

path = '/home/aiuser/work/userlib/model.pth' 
torch.save(model_params, path)

上述图片中的代码做了一个判断: 如果模型保存参数不存在, 那么就保存现有模型, 同时后续本文将模型参数封装进DataSource中.

模型参数加载

之前用DataSource封装了模型参数, 所以在预测模块中作了一次判断: 如果有参数传入预测模块, 则读取模型参数, 如果没有, 则读取固化后的模型参数(第一幅图). 读取之后, 实例化模型, 将模型参数加载进去(第二幅图).

简而言之, 加载模型参数只需要三步:

model_params = torch.load("/home/aiuser/work/userlib/model.pth")   # 加载你保存的模型参数
model = net()                                                      # 实例化你搭建的模型
model.load_state_dict(model_params)                                # 将参数传入你的模型中

将所有训练数据删除, 只保留与预测数据有关的模块即可。

注意

  1. 看到这里你应该发现了, ==无论是训练还是预测, 都需要实例化模型, 所以这里需要你在两个模块都写入模型框架==.
  2. 保存的模型一定要存入userlib中, 以免模拟交易读不到你的模型.
    # 模型建立, 预测或训练都需要传入模型框架
    class net(nn.Module):
        def __init__(self):
            super(net, self).__init__()
            self.fc1 = nn.Linear(xtrain.shape[1], 256)
            self.sig = nn.Sigmoid()
            self.relu = nn.ReLU()
            self.fc2 = nn.Linear(256, 128)
            self.fc3 = nn.Linear(128, 2)
            self.softmax = nn.Softmax(dim=0)
       
            # 将参数初始化为较小的值
            init.xavier_uniform_(self.fc1.weight)
            init.xavier_uniform_(self.fc2.weight)
            init.xavier_uniform_(self.fc3.weight)
        
        def forward(self, data):
            out = self.fc1(data)
            out = self.sig(out)
            out = self.fc2(out)
            out = self.relu(out)
            out = self.fc3(out)
            out = self.softmax(out)
            return out
   


\

提交模拟交易

在你模型固化的代码上绑定实盘参数

提交你的模拟交易

信号检查

试运行阶段是从当天的前一个交易日开始的, 所以我们可以对比一下产生的信号是否一致, 以检查模型固化是否成功:

模型训练+固化代码

https://bigquant.com/codeshare/a1972a2b-305a-4005-aca7-1afb1078a87a

模型加载代码

https://bigquant.com/codeshare/59aa62da-7136-497c-a95b-d3120a796a35

\

标签

深度学习模型输入特征开盘价收盘价模拟交易
{link}