最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

股票量化交易軟件:梯度提升在交易系統(tǒng)開發(fā)中的應(yīng)用. 初級的方法

2023-07-12 09:44 作者:大牛啊呢  | 我要投稿

梯度提升是一種強(qiáng)大的機(jī)器學(xué)習(xí)算法。該方法產(chǎn)生了一個(gè)弱模型的集合(例如,決策樹),其中(與赫茲股票交易量化軟件相反)模型是按順序構(gòu)建的,而不是獨(dú)立地(并行地)構(gòu)建的。這意味著下一棵樹從上一棵樹的錯(cuò)誤中學(xué)習(xí),然后重復(fù)這個(gè)過程,增加了弱模型的數(shù)量。這就建立了一個(gè)強(qiáng)大的模型,可以使用異構(gòu)數(shù)據(jù)進(jìn)行泛化。在這個(gè)實(shí)驗(yàn)中,我使用了Yandex開發(fā)的赫茲股票交易量化軟件庫,它與 XGBoost和 LightGBM 一起是最流行的庫之一。

本文的目的是演示如何創(chuàng)建一個(gè)基于機(jī)器學(xué)習(xí)的模型。創(chuàng)建過程包括以下步驟:


  • 接收和預(yù)處理數(shù)據(jù)

  • 使用準(zhǔn)備好的數(shù)據(jù)訓(xùn)練模型

  • 在自定義策略測試器中測試模型

  • 將模型移植到赫茲股票交易量化軟件

Python 語言和 赫茲股票交易量化軟件庫用于準(zhǔn)備數(shù)據(jù)和訓(xùn)練模型。


準(zhǔn)備數(shù)據(jù)

導(dǎo)入所需的 Python 模塊:

import MetaTrader5 as mt5 import pandas as pd import numpy as np from datetime import datetime import random import matplotlib.pyplot as plt from catboost import CatBoostClassifier from sklearn.model_selection import train_test_split mt5.initialize() # check for gpu devices is availible from catboost.utils import get_gpu_device_count print('%i GPU devices' % get_gpu_device_count())


然后初始化所有全局變量:

LOOK_BACK = 250 MA_PERIOD = 15 SYMBOL = 'EURUSD' MARKUP = 0.0001 TIMEFRAME = mt5.TIMEFRAME_H1 START = datetime(2020, 5, 1) STOP = datetime(2021, 1, 1)



這些參數(shù)的作用如下:


  • look_back — 分析歷史的深度

  • ma_period ?— 用于計(jì)算價(jià)格增量的移動(dòng)平均周期數(shù)

  • symbol — 應(yīng)當(dāng)在 MetaTrader 5 終端中載入的交易品種報(bào)價(jià)

  • markup ?— 用于自定義測試器的點(diǎn)差大小

  • timeframe ?— 應(yīng)當(dāng)載入數(shù)據(jù)的時(shí)間框架

  • start, stop ?— 數(shù)據(jù)范圍赫茲股票交易量化軟件

讓我們編寫一個(gè)函數(shù),直接接收原始數(shù)據(jù)并創(chuàng)建一個(gè)包含訓(xùn)練所需列的數(shù)據(jù)幀:

def get_prices(look_back = 15): ? ?prices = pd.DataFrame(mt5.copy_rates_range(SYMBOL, TIMEFRAME, START, STOP), ? ? ? ? ? ? ? ? ? ? ? ? ? ?columns=['time', 'close']).set_index('time') ? ?# set df index as datetime ? ?prices.index = pd.to_datetime(prices.index, unit='s') ? ?prices = prices.dropna() ? ?ratesM = prices.rolling(MA_PERIOD).mean() ? ?ratesD = prices - ratesM ? ?for i in range(look_back): ? ? ? ?prices[str(i)] = ratesD.shift(i) ? ?return prices.dropna()


函數(shù)接收指定時(shí)間段的收盤價(jià)并計(jì)算移動(dòng)平均值,然后計(jì)算增量(價(jià)格和移動(dòng)平均值之間的差)。在最后一步中,它通過 look_back 來計(jì)算額外的列,其中的行向后移動(dòng)到歷史中,這意味著向模型中添加額外的(滯后的)特性。赫茲股票交易量化軟件

例如,對于 look_back=10,數(shù)據(jù)幀中將包含10個(gè)額外的列,其價(jià)格增量為:

>>> pr = get_prices(look_back=LOOK_BACK) >>> pr ? ? ? ? ? ? ? ? ? ? ? close ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? 2 ? ? ? ? 3 ? ? ? ? 4 ? ? ? ? 5 ? ? ? ? 6 ? ? ? ? 7 ? ? ? ? 8 ? ? ? ? 9 time 2020-05-01 16:00:00 ?1.09750 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 ?0.001190 ?0.000566 ?0.000285 2020-05-01 17:00:00 ?1.10074 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 ?0.001190 ?0.000566 2020-05-01 18:00:00 ?1.09976 ?0.002900 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 ?0.001190 2020-05-01 19:00:00 ?1.09874 ?0.001577 ?0.002900 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 2020-05-01 20:00:00 ?1.09817 ?0.000759 ?0.001577 ?0.002900 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ... ? ? ? ? ? ? ? ? ? ? ?... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... 2020-11-02 23:00:00 ?1.16404 ?0.000400 ?0.000105 -0.000581 -0.001212 -0.000999 -0.000547 -0.000344 -0.000773 -0.000326 ?0.000501 2020-11-03 00:00:00 ?1.16392 ?0.000217 ?0.000400 ?0.000105 -0.000581 -0.001212 -0.000999 -0.000547 -0.000344 -0.000773 -0.000326 2020-11-03 01:00:00 ?1.16402 ?0.000270 ?0.000217 ?0.000400 ?0.000105 -0.000581 -0.001212 -0.000999 -0.000547 -0.000344 -0.000773 2020-11-03 02:00:00 ?1.16423 ?0.000465 ?0.000270 ?0.000217 ?0.000400 ?0.000105 -0.000581 -0.001212 -0.000999 -0.000547 -0.000344 2020-11-03 03:00:00 ?1.16464 ?0.000885 ?0.000465 ?0.000270 ?0.000217 ?0.000400 ?0.000105 -0.000581 -0.001212 -0.000999 -0.000547 [3155 rows x 11 columns]

黃色高亮顯示表示每列都有相同的數(shù)據(jù)集,但有一個(gè)偏移量。因此,每一行都是一個(gè)單獨(dú)的訓(xùn)練實(shí)例。

創(chuàng)建訓(xùn)練標(biāo)簽(隨機(jī)抽樣)

訓(xùn)練實(shí)例是特征及其相應(yīng)標(biāo)簽的集合。模型必須輸出一定的信息,模型必須學(xué)會(huì)預(yù)測這些信息。讓我們考慮二元分類,其中模型將預(yù)測將訓(xùn)練示例確定為類0或1的概率。0和1可用于交易方向:買入或賣出。換句話說,模型必須學(xué)會(huì)預(yù)測給定環(huán)境參數(shù)(一組特征)的交易方向。赫茲股票交易量化軟件

def add_labels(dataset, min, max): ? ?labels = [] ? ?for i in range(dataset.shape[0]-max): ? ? ? ?rand = random.randint(min, max) ? ? ? ?if dataset['close'][i] >= (dataset['close'][i + rand]): ? ? ? ? ? ?labels.append(1.0) ? ? ? ?elif dataset['close'][i] <= (dataset['close'][i + rand]): ? ? ? ? ? ?labels.append(0.0) ? ? ? ? ? ? ? ? ? ? ?else: ? ? ? ? ? ?labels.append(0.0) ? ?dataset = dataset.iloc[:len(labels)].copy() ? ?dataset['labels'] = labels ? ?dataset = dataset.dropna() ? ?return dataset

add_labels 函數(shù)隨機(jī)(在最小、最大范圍內(nèi))設(shè)置每筆交易的持續(xù)時(shí)間(以柱形為單位)。通過更改最大和最小持續(xù)時(shí)間,您可以更改交易采樣頻率。因此,如果當(dāng)前價(jià)格大于下一個(gè)“rand”柱向前的價(jià)格,這就是賣出標(biāo)簽(1)。在相反的情況下,標(biāo)簽是0。讓我們看看應(yīng)用上述函數(shù)后數(shù)據(jù)集的外觀:

>>> pr = add_labels(pr, 10, 25) >>> pr ? ? ? ? ? ? ? ? ? ? ? close ? ? ? ? 0 ? ? ? ? 1 ? ? ? ? 2 ? ? ? ? 3 ? ? ? ? 4 ? ? ? ? 5 ? ? ? ? 6 ? ? ? ? 7 ? ? ? ? 8 ? ? ? ? 9 ?labels time 2020-05-01 16:00:00 ?1.09750 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 ?0.001190 ?0.000566 ?0.000285 ? ? 1.0 2020-05-01 17:00:00 ?1.10074 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 ?0.001190 ?0.000566 ? ? 1.0 2020-05-01 18:00:00 ?1.09976 ?0.002900 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 ?0.001190 ? ? 1.0 2020-05-01 19:00:00 ?1.09874 ?0.001577 ?0.002900 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ?0.001477 ? ? 1.0 2020-05-01 20:00:00 ?1.09817 ?0.000759 ?0.001577 ?0.002900 ?0.004227 ?0.001405 ?0.002169 ?0.001600 ?0.002595 ?0.002794 ?0.002442 ? ? 1.0 ... ? ? ? ? ? ? ? ? ? ? ?... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ? ... ? ? ... 2020-10-29 20:00:00 ?1.16700 -0.003651 -0.005429 -0.005767 -0.006750 -0.004699 -0.004328 -0.003475 -0.003769 -0.002719 -0.002075 ? ? 1.0 2020-10-29 21:00:00 ?1.16743 -0.002699 -0.003651 -0.005429 -0.005767 -0.006750 -0.004699 -0.004328 -0.003475 -0.003769 -0.002719 ? ? 0.0 2020-10-29 22:00:00 ?1.16731 -0.002276 -0.002699 -0.003651 -0.005429 -0.005767 -0.006750 -0.004699 -0.004328 -0.003475 -0.003769 ? ? 0.0 2020-10-29 23:00:00 ?1.16740 -0.001648 -0.002276 -0.002699 -0.003651 -0.005429 -0.005767 -0.006750 -0.004699 -0.004328 -0.003475 ? ? 0.0 2020-10-30 00:00:00 ?1.16695 -0.001655 -0.001648 -0.002276 -0.002699 -0.003651 -0.005429 -0.005767 -0.006750 -0.004699 -0.004328 ? ? 1.0

添加了“l(fā)abels”列,其中分別包含買入和賣出的類別號(0或1)?,F(xiàn)在,每個(gè)訓(xùn)練示例或功能集(這里是10個(gè))都有自己的標(biāo)簽,它指示在什么條件下應(yīng)該買入,在什么條件下應(yīng)該賣出(即它屬于哪個(gè)類)。模型必須能夠記住和泛化這些例子-這個(gè)能力將在后面討論。赫茲股票交易量化軟件

開發(fā)自定義測試器

因?yàn)槲覀冋趧?chuàng)建一個(gè)交易系統(tǒng),所以最好有一個(gè)策略測試器來進(jìn)行及時(shí)的模型測試。下面是此類測試器的示例:

def tester(dataset, markup = 0.0): ? ?last_deal = int(2) ? ?last_price = 0.0 ? ?report = [0.0] ? ?for i in range(dataset.shape[0]): ? ? ? ?pred = dataset['labels'][i] ? ? ? ?if last_deal == 2: ? ? ? ? ? ?last_price = dataset['close'][i] ? ? ? ? ? ?last_deal = 0 if pred <=0.5 else 1 ? ? ? ? ? ?continue ? ? ? ?if last_deal == 0 and pred > 0.5: ? ? ? ? ? ?last_deal = 1 ? ? ? ? ? ?report.append(report[-1] - markup + (dataset['close'][i] - last_price)) ? ? ? ? ? ?last_price = dataset['close'][i] ? ? ? ? ? ?continue ? ? ? ?if last_deal == 1 and pred <=0.5: ? ? ? ? ? ?last_deal = 0 ? ? ? ? ? ?report.append(report[-1] - markup + (last_price - dataset['close'][i])) ? ? ? ? ? ?last_price = dataset['close'][i] ? ? ? ? ?return report



tester 函數(shù)接受一個(gè)數(shù)據(jù)集和一個(gè)“標(biāo)記”(可選)并檢查整個(gè)數(shù)據(jù)集,類似于在 MetaTrader 5 測試器中的操作。在每一個(gè)新柱都會(huì)檢查一個(gè)信號(標(biāo)簽),當(dāng)標(biāo)簽改變時(shí),交易就會(huì)反轉(zhuǎn)。因此,賣出信號作為結(jié)束買入頭寸和打開賣出頭寸的信號?,F(xiàn)在,讓我們測試上述數(shù)據(jù)集:赫茲股票交易量化軟件

pr = get_prices(look_back=LOOK_BACK) pr = add_labels(pr, 10, 25) rep = tester(pr, MARKUP) plt.plot(rep) plt.show()


編輯切換為居中


不計(jì)入點(diǎn)差測試原始數(shù)據(jù)集


編輯切換為居中


以70個(gè)五位小數(shù)點(diǎn)差測試原始數(shù)據(jù)集

這是一種理想化的圖像(這就是我們希望模型工作的方式)。由于標(biāo)簽是隨機(jī)抽樣的,這取決于一系列參數(shù),這些參數(shù)決定了交易的最短和最長壽命,因此曲線總是不同的。盡管如此,它們都會(huì)表現(xiàn)出一個(gè)很好的點(diǎn)增長(沿Y軸)和不同的交易數(shù)量(沿X軸)。赫茲股票交易量化軟件

訓(xùn)練 CatBoost 模型

現(xiàn)在,讓我們直接開始訓(xùn)練模型。首先,讓我們將數(shù)據(jù)集分成兩個(gè)樣本:訓(xùn)練和驗(yàn)證。這用于減少模型過擬合。當(dāng)模型繼續(xù)在訓(xùn)練子樣本上訓(xùn)練,試圖最小化分類誤差時(shí),同樣的誤差也在驗(yàn)證子樣本上測量。如果這些誤差的差別很大,則該模型被稱為過擬合。相反,接近值表示模型的訓(xùn)練是正確的。赫茲股票交易量化軟件

#splitting on train and validation subsets X = pr[pr.columns[1:-1]] y = pr[pr.columns[-1]] train_X, test_X, train_y, test_y = train_test_split(X, y, train_size = 0.5, test_size = 0.5, shuffle=True)

在隨機(jī)混合訓(xùn)練示例之后,讓我們將數(shù)據(jù)分成兩個(gè)長度相等的數(shù)據(jù)集。接下來,創(chuàng)建并訓(xùn)練模型:

#learning with train and validation subsets model = CatBoostClassifier(iterations=1000, ? ? ? ? ? ? ? ? ? ? ? ?depth=6, ? ? ? ? ? ? ? ? ? ? ? ?learning_rate=0.01, ? ? ? ? ? ? ? ? ? ? ? ?custom_loss=['Accuracy'], ? ? ? ? ? ? ? ? ? ? ? ?eval_metric='Accuracy', ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?verbose=True, ? ? ? ? ? ? ? ? ? ? ? ?use_best_model=True, ? ? ? ? ? ? ? ? ? ? ? ?task_type='CPU') model.fit(train_X, train_y, eval_set = (test_X, test_y), early_stopping_rounds=50, plot=False)

該模型采用了許多參數(shù),但并非所有參數(shù)都顯示在本例中。如果您想微調(diào)模型,可以參考文檔,這通常不是必需的。CatBoost 在開箱即用的情況下工作得很好,只需最少的調(diào)整。

以下是模型參數(shù)的簡要說明:


  • iterations — 模型中樹的最大數(shù)目。模型在每次迭代后都會(huì)增加弱模型(樹)的數(shù)量,因此請確保設(shè)置足夠大的值。根據(jù)我的實(shí)踐,對于這個(gè)特定的例子,1000次迭代通常已經(jīng)足夠了。赫茲股票交易量化軟件

  • depth ?— 每棵樹的深度。深度越小,模型越粗糙-輸出的交易越少。深度在6到10之間似乎是最佳的。

  • learning_rate ?— 梯度步長值;這與神經(jīng)網(wǎng)絡(luò)中使用的原理相同。合理的參數(shù)范圍為0.01~0.1。值越低,模型訓(xùn)練的時(shí)間就越長。但在這種情況下,它可以找到更好的結(jié)果。赫茲股票交易量化軟件

  • custom_loss, eval_metric ?— 用于評估模型的度量。分類的經(jīng)典標(biāo)準(zhǔn)是“準(zhǔn)確度”

  • use_best_model ?— 在每一步中,模型都會(huì)評估“準(zhǔn)確性”,這可能會(huì)隨著時(shí)間的推移而改變。此標(biāo)志允許以最小的誤差保存模型,否則最后一次迭代得到的模型將被保存。赫茲股票交易量化軟件

  • task_type ?— 允許在GPU上訓(xùn)練模型(默認(rèn)情況下使用CPU)。這只適用于非常大的數(shù)據(jù);在其他情況下,在GPU內(nèi)核上執(zhí)行訓(xùn)練的速度比在處理器上執(zhí)行訓(xùn)練的速度慢。

  • early_stopping_rounds ?— 該模型有一個(gè)內(nèi)置的過擬合檢測器,其工作原理簡單。如果度量在指定的迭代次數(shù)內(nèi)停止減少/增加(對于“精確度”,它停止增加),則訓(xùn)練停止。


訓(xùn)練開始后,控制臺將顯示每個(gè)迭代中模型的當(dāng)前狀態(tài):

170: ? ?learn: 1.0000000 ? ? ? ?test: 0.7712509 best: 0.7767795 (165) ? total: 11.2s ? ?remaining: 21.5s 171: ? ?learn: 1.0000000 ? ? ? ?test: 0.7726330 best: 0.7767795 (165) ? total: 11.2s ? ?remaining: 21.4s 172: ? ?learn: 1.0000000 ? ? ? ?test: 0.7733241 best: 0.7767795 (165) ? total: 11.3s ? ?remaining: 21.3s 173: ? ?learn: 1.0000000 ? ? ? ?test: 0.7740152 best: 0.7767795 (165) ? total: 11.3s ? ?remaining: 21.3s 174: ? ?learn: 1.0000000 ? ? ? ?test: 0.7712509 best: 0.7767795 (165) ? total: 11.4s ? ?remaining: 21.2s 175: ? ?learn: 1.0000000 ? ? ? ?test: 0.7726330 best: 0.7767795 (165) ? total: 11.5s ? ?remaining: 21.1s 176: ? ?learn: 1.0000000 ? ? ? ?test: 0.7712509 best: 0.7767795 (165) ? total: 11.5s ? ?remaining: 21s 177: ? ?learn: 1.0000000 ? ? ? ?test: 0.7740152 best: 0.7767795 (165) ? total: 11.6s ? ?remaining: 21s 178: ? ?learn: 1.0000000 ? ? ? ?test: 0.7719419 best: 0.7767795 (165) ? total: 11.7s ? ?remaining: 20.9s 179: ? ?learn: 1.0000000 ? ? ? ?test: 0.7747063 best: 0.7767795 (165) ? total: 11.7s ? ?remaining: 20.8s 180: ? ?learn: 1.0000000 ? ? ? ?test: 0.7705598 best: 0.7767795 (165) ? total: 11.8s ? ?remaining: 20.7s Stopped by overfitting detector ?(15 iterations wait) bestTest = 0.7767795439 bestIteration = 165

在上面的例子中,過擬合檢測器在第180次迭代時(shí)觸發(fā)并停止訓(xùn)練。此外,控制臺還顯示訓(xùn)練子樣本(learn)和驗(yàn)證子樣本(test)的統(tǒng)計(jì)信息,以及總的模型訓(xùn)練時(shí)間(僅20秒)。在輸出時(shí),訓(xùn)練子樣本的準(zhǔn)確度最好為1.0(與理想結(jié)果相對應(yīng)),驗(yàn)證子樣本的準(zhǔn)確度為0.78,雖然更差,但仍高于0.5(被認(rèn)為是隨機(jī)的)。最佳迭代是165 - 模型已經(jīng)保存了?,F(xiàn)在,我們可以在測試器中測試:

#test the learned model p = model.predict_proba(X) p2 = [x[0]<0.5 for x in p] pr2 = pr.iloc[:len(p2)].copy() pr2['labels'] = p2 rep = tester(pr2, MARKUP) plt.plot(rep) plt.show()

X - 是包含特征但沒有標(biāo)簽的源數(shù)據(jù)集。為了得到標(biāo)簽,有必要從訓(xùn)練模型中獲得標(biāo)簽,并預(yù)測分配到0類或1類的“p”概率。由于該模型生成兩個(gè)類的概率,而我們只需要0或1,因此“p2”變量只接收第一維(0)中的概率。此外,原始數(shù)據(jù)集中的標(biāo)簽將替換為模型預(yù)測的標(biāo)簽。以下是測試器中的結(jié)果:赫茲股票交易量化軟件


編輯切換為居中


抽樣交易后的理想結(jié)果


編輯切換為居中


在模型輸出時(shí)得到的結(jié)果

如您所見,模型學(xué)習(xí)得很好,這意味著它記住了訓(xùn)練示例,并且在驗(yàn)證集上顯示了比隨機(jī)結(jié)果更好的結(jié)果。讓我們進(jìn)入最后一個(gè)階段:導(dǎo)出模型并創(chuàng)建一個(gè)交易機(jī)器人。

將模型移植到 赫茲股票交易量化軟件

赫茲股票交易量化軟件允許直接從 Python 程序進(jìn)行交易,因此不需要移植模型。但是,我想檢查我的自定義測試器,并將其與標(biāo)準(zhǔn)策略測試器進(jìn)行比較。此外,編譯好的機(jī)器人的可用性在許多情況下都很方便,包括在VPS上的使用(在這種情況下,您不必安裝Python)。因此,我編寫了一個(gè)輔助函數(shù),它將準(zhǔn)備好的模型保存到 MQH 文件中。函數(shù)如下:

def export_model_to_MQL_code(model): ? ?model.save_model('catmodel.h', ? ? ? ? ? format="cpp", ? ? ? ? ? export_parameters=None, ? ? ? ? ? pool=None) ? ?code = 'double catboost_model' + '(const double &features[]) { \n' ? ?code += ' ? ?' ? ?with open('catmodel.h', 'r') as file: ? ? ? ?data = file.read() ? ? ? ?code += data[data.find("unsigned int TreeDepth"):data.find("double Scale = 1;")] ? ?code +='\n\n' ? ?code+= 'return ' + 'ApplyCatboostModel(features, TreeDepth, TreeSplits , BorderCounts, Borders, LeafValues); } \n\n' ? ?code += 'double ApplyCatboostModel(const double &features[],uint &TreeDepth_[],uint &TreeSplits_[],uint &BorderCounts_[],float &Borders_[],double &LeafValues_[]) {\n\ ? ?uint FloatFeatureCount=ArrayRange(BorderCounts_,0);\n\ ? ?uint BinaryFeatureCount=ArrayRange(Borders_,0);\n\ ? ?uint TreeCount=ArrayRange(TreeDepth_,0);\n\ ? ?bool ? ? binaryFeatures[];\n\ ? ?ArrayResize(binaryFeatures,BinaryFeatureCount);\n\ ? ?uint binFeatureIndex=0;\n\ ? ?for(uint i=0; i<FloatFeatureCount; i++) {\n\ ? ? ? for(uint j=0; j<BorderCounts_[i]; j++) {\n\ ? ? ? ? ?binaryFeatures[binFeatureIndex]=features[i]>Borders_[binFeatureIndex];\n\ ? ? ? ? ?binFeatureIndex++;\n\ ? ? ? }\n\ ? ?}\n\ ? ?double result=0.0;\n\ ? ?uint treeSplitsPtr=0;\n\ ? ?uint leafValuesForCurrentTreePtr=0;\n\ ? ?for(uint treeId=0; treeId<TreeCount; treeId++) {\n\ ? ? ? uint currentTreeDepth=TreeDepth_[treeId];\n\ ? ? ? uint index=0;\n\ ? ? ? for(uint depth=0; depth<currentTreeDepth; depth++) {\n\ ? ? ? ? ?index|=(binaryFeatures[TreeSplits_[treeSplitsPtr+depth]]<<depth);\n\ ? ? ? }\n\ ? ? ? result+=LeafValues_[leafValuesForCurrentTreePtr+index];\n\ ? ? ? treeSplitsPtr+=currentTreeDepth;\n\ ? ? ? leafValuesForCurrentTreePtr+=(1<<currentTreeDepth);\n\ ? ?}\n\ ? ?return 1.0/(1.0+MathPow(M_E,-result));\n\ ? ?}' ? ?file = open('C:/Users/dmitrievsky/AppData/Roaming/MetaQuotes/Terminal/D0E8209F77C8CF37AD8BF550E51FF075/MQL5/Include/' + 'cat_model' + '.mqh', "w") ? ?file.write(code) ? ?file.close() ? ?print('The file ' + 'cat_model' + '.mqh ' + 'has been written to disc')

函數(shù)代碼看起來既奇怪又笨拙,經(jīng)過訓(xùn)練的模型對象被輸入到函數(shù)中,然后以C++格式保存對象:

model.save_model('catmodel.h', ? ? ? ? ? format="cpp", ? ? ? ? ? export_parameters=None, ? ? ? ? ? pool=None)

然后創(chuàng)建一個(gè)字符串,并使用標(biāo)準(zhǔn) Python 函數(shù)將 C++ 代碼解析為MQL5:

code = 'double catboost_model' + '(const double &features[]) { \n' ? ?code += ' ? ?' ? ?with open('catmodel.h', 'r') as file: ? ? ? ?data = file.read() ? ? ? ?code += data[data.find("unsigned int TreeDepth"):data.find("double Scale = 1;")] ? ?code +='\n\n' ? ?code+= 'return ' + 'ApplyCatboostModel(features, TreeDepth, TreeSplits , BorderCounts, Borders, LeafValues); } \n\n'

在上述操作之后,將插入此庫中的“ApplyCatboostModel”函數(shù)。它根據(jù)保存的模型和傳遞的特征向量,返回(0;1)范圍內(nèi)的計(jì)算結(jié)果。

之后,我們需要指定赫茲股票交易量化軟件 終端的 \\Include 文件夾的路徑,模型將保存到該文件夾中。因此,在設(shè)置所有參數(shù)后,只需單擊一下即可對模型進(jìn)行訓(xùn)練,并立即保存為MQH文件,這非常方便。這個(gè)選項(xiàng)也很好,因?yàn)檫@是用 Python 教授模型的常見和流行的實(shí)踐。

在 MetaTrader 5 中編寫一個(gè) EA 交易

在訓(xùn)練和保存 CatBoost 模型之后,我們需要編寫一個(gè)簡單的 EA 進(jìn)行測試:

#include <MT4Orders.mqh> #include <Trade\AccountInfo.mqh> #include <cat_model.mqh> sinput int look_back = 50; sinput int MA_period = 15; sinput int ? ? ?OrderMagic = 666; ? ? ? //Orders magic sinput double ? MaximumRisk=0.01; ? ? ? //Maximum risk sinput double ? CustomLot=0; ? ? ? ? ? ?//Custom lot input int stoploss = 500; static datetime last_time=0; #define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK) #define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID) int hnd;

現(xiàn)在,連接保存的 cat_model.mqh 和由fxsaber提供的赫茲股票交易量化軟件

look_back 和 MA_period 參數(shù)的設(shè)置必須與在 Python 程序中訓(xùn)練時(shí)指定的完全一致,否則將引發(fā)錯(cuò)誤。

此外,在每一個(gè)柱上,我們檢查模型的信號,其中輸入增量向量(價(jià)格和移動(dòng)平均值之間的差異):

if(!isNewBar()) return; ? double ma[]; ? double pr[]; ? double ret[]; ? ArrayResize(ret, look_back); ? CopyBuffer(hnd, 0, 1, look_back, ma); ? CopyClose(NULL,PERIOD_CURRENT,1,look_back,pr); ? for(int i=0; i<look_back; i++) ? ? ?ret[i] = pr[i] - ma[i]; ? ArraySetAsSeries(ret, true); ? double sig = catboost_model(ret);


股票量化交易軟件:梯度提升在交易系統(tǒng)開發(fā)中的應(yīng)用. 初級的方法的評論 (共 條)

分享到微博請遵守國家法律
五原县| 龙井市| 巢湖市| 福贡县| 宝坻区| 涟水县| 阜平县| 启东市| 南和县| 苏州市| 克拉玛依市| 富源县| 北川| 海丰县| 新化县| 文山县| 米林县| 博乐市| 利川市| 惠来县| 普格县| 中山市| 三穗县| 马龙县| 太保市| 濮阳县| 界首市| 正安县| 石门县| 芦溪县| 定结县| 吉首市| 安化县| 灵宝市| 盐城市| 韶关市| 青冈县| 鄄城县| 故城县| 炉霍县| 江都市|