四目观天下

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

期货量化交易软件:如何使用时间序列挖掘的数据标签3.0

[复制链接]
发表于 2024-4-25 08:31:26 | 显示全部楼层 |阅读模式
同样,我们将获得最佳学习率的这部分代码封装到函数get_learning_rate()中,并将获得的最佳学习率作为其返回值:
5 L) C  O: l; E9 o" kdef get_learning_rate():        pl.seed_everything(42)    trainer = pl.Trainer(accelerator="cpu", gradient_clip_val=0.1,logger=False)    net = NHiTS.from_dataset(        training,        learning_rate=3e-2,        weight_decay=1e-2,        loss=MQF2DistributionLoss(prediction_length=max_prediction_length),        backcast_loss_ratio=0.0,        hidden_size=64,        optimizer="AdamW",    )    res = Tuner(trainer).lr_find(        net, train_dataloaders=t_loader, val_dataloaders=v_loader, min_lr=1e-5, max_lr=1e-1    )    lr_=res.suggestion()    return lr_
+ C: j; |# h7 E% |8 d如果您想可视化学习率,可以添加以下代码:
0 ~# U  U2 o/ ^! {8 |0 ?, c 期货量化交易软件:如何使用时间序列挖掘的数据标签3.0-1.jpg 添加图片注释,不超过 140 字(可选)print(f"suggested learning rate: {res.suggestion()}")fig = res.plot(show=True, suggest=True)fig.show()) j& d2 D+ {2 ~( V- E# U$ `, f- q
此示例中的结果如下:  H1 M7 Q* f# s" V' ]
/ d- N3 M; f5 ^
期货量化交易软件:如何使用时间序列挖掘的数据标签3.0-2.jpg 添加图片注释,不超过 140 字(可选)9 m3 \  F! G- a$ o) W: ~- m
建议学习率:0.003981071705534973。2. 定义EarlyStoping回调此回调主要用于监测验证损失,并在损失连续几个时期没有改善时停止训练。这样可以防止模型过拟合。# m3 h6 q9 x2 ]& d! W7 O9 w6 b& H/ k
early_stop_callback = EarlyStopping(monitor="val_loss",                                     min_delta=1e-4,                                     patience=10,                                      verbose=True,                                     mode="min"); c) O1 H0 j6 a  r& p% _
这里需要注意的参数是“patience”,它主要控制在训练过程中,如果损失连续几个时期没有改善,何时停止。我们把它设置为10。3. 定义ModelCheckpoint回调此回调主要用于控制模型归档和归档的名称。我们主要设置这两个变量。ck_callback=ModelCheckpoint(monitor='val_loss',                            mode="min",                            save_top_k=1,                              filename='{epoch}-{val_loss:.2f}')
4 B: |+ X3 s% R: |1 \/ {“save_top_k”用于控制保存前几个最好的模型。我们将其设置为1,只保存最好的模型。4. 定义训练模型我们首先需要在lightning.pytarch中实例化一个Trainer类,并添加我们之前定义的两个回调。  P' B( ~- W5 |2 d6 K' }# d
trainer = pl.Trainer(    max_epochs=ep,    accelerator="cpu",    enable_model_summary=True,    gradient_clip_val=1.0,    callbacks=[early_stop_callback,ck_callback],    limit_train_batches=30,    enable_checkpointing=True,)
2 c$ l8 M# A% m% g' O& y这里我们需要注意的参数是“max_epochs”(最大训练时期数)、“gradient_clip_val”(用于防止梯度爆炸)和“回调”。这里“max_epochs”使用ep,这是我们稍后将定义的全局变量,而“callbacks”是我们的回调集合。接下来,我们还需要定义NHiTS模型并实例化它:% i3 F' c# J$ R7 W+ {! a
net = NHiTS.from_dataset(    training,    learning_rate=lr,    log_interval=10,    log_val_interval=1,    weight_decay=1e-2,    backcast_loss_ratio=0.0,    hidden_size=64,    optimizer="AdamW",    loss=MQF2DistributionLoss(prediction_length=max_prediction_length),). S9 u& D$ B/ k# l
这里,参数通常不需要修改,只需使用默认的参数即可。这里我们只将“loss”修改为MQF2DistributionLoss 损失函数。5. 训练模块 我们使用Trainer对象的fit()函数来训练模型:$ l0 e+ M9 t0 J! B5 p
trainer.fit(    net,    train_dataloaders=train_dataloader,    val_dataloaders=val_dataloader,)
6 j1 q9 M+ |  E类似地,我们将这部分代码封装到一个函数train()中:def train():    early_stop_callback = EarlyStopping(monitor="val_loss",                                         min_delta=1e-4,                                         patience=10,  # The number of times without improvement will stop                                        verbose=True,                                         mode="min")    ck_callback=ModelCheckpoint(monitor='val_loss',                                mode="min",                                save_top_k=1,  # Save the top few best ones                                filename='{epoch}-{val_loss:.2f}')    trainer = pl.Trainer(        max_epochs=ep,        accelerator="cpu",        enable_model_summary=True,        gradient_clip_val=1.0,        callbacks=[early_stop_callback,ck_callback],        limit_train_batches=30,        enable_checkpointing=True,    )    net = NHiTS.from_dataset(        training,        learning_rate=lr,        log_interval=10,        log_val_interval=1,        weight_decay=1e-2,        backcast_loss_ratio=0.0,        hidden_size=64,        optimizer="AdamW",        loss=MQF2DistributionLoss(prediction_length=max_prediction_length),    )    trainer.fit(        net,        train_dataloaders=t_loader,        val_dataloaders=v_loader,        # ckpt_path='best'    )return trainer/ c/ D. T  c! L/ h# ^9 Y3 u6 q( k
此函数将返回一个经过训练的模型,可用于预测任务。
$ J% N5 }7 C" m% @8 l. t定义执行逻辑1. 定义全局变量:
% @. B& V% |7 pep=200__train=Falsemt_data_len=200000max_encoder_length = 2*96max_prediction_length = 30batch_size = 128- F9 L8 h  ]  L% X6 Q
__train用于控制我们当前是在训练还是测试模型。值得注意的是,ep用于控制最大训练时期。由于我们已经设置了EarlyStoping,因此可以将该值设置得更大一点,因为当模型不再收敛时,它将自动停止。mt_data_len是从客户端获得的最近时间序列数据的数量。max_encoder_length 和 max_prediction_length 分别是最大编码长度和最大预测长度。2.训练当训练完成时,我们还需要将当前的最佳训练结果保存到本地文件中,因此我们定义了一个json文件来保存这些信息:info_file='results.json'为了使我们的训练过程更加清晰,我们需要避免在训练过程中输出一些不必要的警告信息,因此我们将添加以下代码:, D- {; K( Y3 L7 f5 V4 Q
warnings.filterwarnings("ignore")
2 V" [9 t$ r% i$ `接下来是我们的训练逻辑:/ Q) C6 l3 z4 O& H/ @$ S
dt=get_data(mt_data_len=mt_data_len)if __train:    # print(dt)    # dt=get_data(mt_data_len=mt_data_len)    t_loader,v_loader,training=spilt_data(dt,                                    t_shuffle=False,t_drop_last=True,                                    v_shuffle=False,v_drop_last=True)    lr=get_learning_rate()    trainer__=train()    m_c_back=trainer__.checkpoint_callback    m_l_back=trainer__.early_stopping_callback    best_m_p=m_c_back.best_model_path    best_m_l=m_l_back.best_score.item()    # print(best_m_p)    if os.path.exists(info_file):        with open(info_file,'r+') as f1:            last=json.load(fp=f1)            last_best_model=last['last_best_model']            last_best_score=last['last_best_score']            if last_best_score > best_m_l:                last['last_best_model']=best_m_p                last['last_best_score']=best_m_l                json.dump(last,fp=f1)    else:                       with open(info_file,'w') as f2:            json.dump(dict(last_best_model=best_m_p,last_best_score=best_m_l),fp=f2), K0 M: y. L* c+ ~* O4 Y, e$ ?
训练完成后,您可以在根目录的results.json文件中找到我们最佳模型的存储位置和最佳分数。在训练过程中,您将看到一个进度条,显示每个 epoch 的进度。
http://www.simu001.cn/x288753x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Archiver| ( 桂ICP备12001440号-3 )|网站地图

GMT+8, 2026-8-17 12:13 , Processed in 1.888893 second(s), 34 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表