English Русский 中文 Español Deutsch Português
preview
MQL5のALGLIB数値解析ライブラリ

MQL5のALGLIB数値解析ライブラリ

MetaTrader 5 | 12 2月 2024, 10:17
303 0
MetaQuotes
MetaQuotes

はじめに

金融市場は、膨大な量の複雑な関係を含むデータを生成します。それらを分析するには、応用数学の最新の方法を使用する必要があります。非常に複雑な金融データと、分析のシンプルさと効率をうまく組み合わせるのは、困難な課題です。ALGLIBは、数値手法およびデータ分析アルゴリズムを使用するために特別に設計された高性能ライブラリで、金融市場分析の信頼できるアシスタントです。

ALGLIBの多用途性
現在、ALGLIBは数値手法を使用するための最良のライブラリの1つとして認識されています。いくつかのプログラミング言語(C++、C#、Java、Python、Delphi)とオペレーティングシステム(WindowsおよびPOSIX、Linuxを含む)がサポートされています。

ALGLIBの多くの機能の中で、次のような特徴があります。

  • 線形代数:データ分析にとって重要な直接アルゴリズム、固有値(EVD)および特異値(SVD)メソッドが含まれています。
  • 方程式を解く:線形方程式系と非線形方程式系の両方をサポートしているため、複雑な金融プロセスをモデル化する場合に役立ちます。
  • 補間と近似:データの内挿と近似のさまざまな方法がサポートされており、市場動向の分析と予測に役立ちます。
  • 最適化:ALGLIBは、投資ポートフォリオやその他の金融上の意思決定を最適化するために重要な、最適なソリューションを見つけるためのアルゴリズムを提供します。
  • 数値積分:金融商品の評価に役立つ定積分の計算が可能です。
  • 機械学習:データ分析、分類、回帰、さらにはニューラルネットワークの使用も含まれ、市場トレンドを予測する新たな可能性が開かれます。


ALGLIBの利点

金融データを扱うときにALGLIBを選択する理由は何でしょうか。

このライブラリの主な利点は次のとおりです。

  • 携帯性:ALGLIBは、さまざまなコンパイラを使用してさまざまなプラットフォーム上で簡単にコンパイルできるため、さまざまな背景を持つ開発者が利用できます。
  • 使いやすさ:複数のプログラミング言語をサポートしているため、新しい構文を学習することなく、最も使いやすい言語を選択できます。
  • オープンソース:ALGLIBはオープンソースであり、GPL2+条件に基づいて使用できます。これにより、科学研究と商業プロジェクトの両方でアクセスできるようになります。
  • 商用ユーザーのサポート:商用ユーザーは、ALGLIBの使用時に法的保護を提供するライセンスを購入できます。

さらに、ライブラリには、提案されたメソッドの機能の主要部分をカバーするテストケースの大規模なコレクションが含まれています。これにより、テストを実行し、検出されたエラーをプロジェクトの作成者に報告できるようになります。ライブラリについて詳しくは、プロジェクトWebサイトhttps://www.alglib.net/を参照してください。

ALGLIBは、2012年に初めてMQL5言語での使用に適応されました。この適応は、バージョン3.5からのライブラリの変換でした。あれから10年以上が経ちました。この間、ALGLIBは金融市場の取引分野の開発者やアナリストの間で広く知られるようになりました。長年にわたり、開発チームはライブラリの改善に積極的に取り組み、新しいクラスや関数の追加と改善など、70を超える変更を加えてきました。

既存のライブラリクラスが行列とベクトルを使用するように再設計されており、ALGLIB3.19で導入された新しい機能が追加されていることにも注意してください。Complexデータ型は、複素数を扱うために使用されるようになりました。すべてのソースコードは、統一されたデザインスタイルに従って改訂され、構造化されています。

残念ながら、MQL5のバージョン3.19でALGLIBライブラリに加えられた変更は非常に重要であるため、下位互換性は提供されていません。ALGLIBバージョン3.5をプロジェクトに適用しているユーザーには、プログラムを徹底的に確認し、必要な調整をおこなうことをお勧めします。

ライブラリ自体に加えて、テストスクリプトも更新されました。現在、クラス用に91個、インターフェイス用に152個あります。これにより、ライブラリ機能のより信頼性の高い包括的なテストが容易になります。

ALGLIBの新しいバージョンは、 ALGLIB - 数値分析ライブラリ - MetaTrader 5のためのライブラリ、およびMetaTrader 5プラットフォームの一部(\MQL5\Include\Math\Alglib\、\MQL5\Scripts\UnitTests\Alglib\のテストケースを含む)から入手できます。


1.ALGLIB3.19の新機能(バージョン3.5以降の変更点のリスト)

3.19

  • ALGLIB3.19.0の最も重要な機能は、大規模なデータセットを処理するための新しいRBF (RadialBasisFunction)ソルバーであり、薄板スプライン、二調和スプライン、およびマルチ二次関数をサポートします。このソルバーは、補間とフィッティング(平滑化)問題の両方をサポートします。
  • 新しいRBFアルゴリズムは、領域分解法を使用して線形システムを解決します。その結果、メモリ要件はO(N)で、実行時間はO(N2)になります。これは、他のオープンソース実装で必要なメモリ要件がO(N2)で、実行時間がO(N3)であるのに比べて、大幅に改善されています。100,000ポイントを超えるデータセットに使用できます。

3.18

  • 線形方程式用のスパースGMRESソルバーを追加しました。
  • AMDアルゴリズムのパフォーマンスを向上しました(行が密な行列の処理を最適化する場合)。
  • 新しいコレスキー分解とソルバーコードの広範な最適化により、線形計画法(LP)および二次計画法(QP)の内点ソルバーの速度が向上しました。

3.17

  • スパース超節点コレスキー分解(エキスパート関数とユーザーフレンドリーなラッパー付き)および対応するスパース直接線形ソルバーを追加しました。順列パディングの削減と未定義の因数分解を有効にしました。
  • 大規模な内点線形計画法(LP)問題用のソルバーを追加しました。
  • 大規模な内点半正定二次計画法(QP)問題用のソルバーを追加しました。

3.16

  • 密バージョンと疎バージョンの内点二次計画法(QP)問題のソルバーを実装しました。
  • O(N*logN)実行時間でペナルティ付き3次スプラインを高速フィッティングするための新しいサブルーチンを追加しました。
  • 非線形計画法用の新しいSQPソルバーを追加しました。
  • 大規模なランダムフォレスト用に圧縮バイナリストレージ形式を導入しました(メモリ使用量を3.7~5.7倍削減)。
  • CRSおよびSkyline行列用のsparsegemv()関数を追加しました。
  • CDFおよびPDFの二変量正規関数を実装しました。
  • QPソルバーはラグランジュ乗数を報告するようになりました。
  • QPソルバーは、双方向の線形制約をサポートするようになりました。
  • SLPソルバーの安定性が向上しました。
  • LPソルバーでの参照要素の選択が改善され、より正確なソリューションが得られます。

3.15

  • 時系列に対するSingular Spectrum Analysis(SSA、「キャタピラー」)アルゴリズムを実装しました。実装は最適化されており、傾向抽出、予測、平均化予測、および高速増分モデル更新が含まれます。
  • Skyline (SKS)形式で保存された疎線形システム用のダイレクトソルバーを追加しました。
  • 膨大な数の不等式を含む二次問題に対するQP-DENS-AULソルバーのパフォーマンスが向上しました。
  • BLEICおよびQP-BLEICソルバーの速度が大幅に向上しました(最大4倍)。ソルバーの内部コードが改訂され、制約処理が大幅に改善されました。
  • サブディメンション固有値ソルバーのサーマルトリガーサポートを追加しました。関連する固有値問題のシーケンスを解くとき、以前に見つけた基本的な解を新しい解法セッションの開始点として再利用することができます。
  • SKS形式でのストライプ行列の作成を簡素化しました(sparsecreatesksband()関数)。
  • 実数用のBLASレベル2関数の新しいセットを追加しました(GEMV、SYMV、TRSV)。
  • sparseset()関数はSKS行列をサポートするようになりました。
  • minqpソルバーは、二次項の対角に基づいた変数スケールの自動計算をサポートするようになりました。

3.12:

  • rbfsetpoints()関数は、入力データにNAN/INFが存在するかどうかを確認するようになりました。
  • K平均法クラスタリングと固有値逆反復アルゴリズムでは、初期化に決定論的なシード値が使用されるようになり、さまざまな実行で結果を再現できるようになりました。
  • QQPソルバーの小さなバグ(二次項の不正な自動スケーリング)が修正されました。

3.11

  • 線形制約付き非線形最小二乗法(MinLMおよびLSFit)を実行する機能が追加されました。パラメータに線形制約を設けた非線形近似を実行できるようになりました。
  • データの近似最小外接、最小面積、および最大内接N球のサポートを追加しました(2Dでは外接円、3Dでは内接球面)。
  • MinNLCソルバーの安定性が向上し、「precise stable」前処理モードが追加されました。
  • 新しいオプティマイザを追加しました。「アクティブ」状態の変数のみに制限を設けたMinBCです。これらの制限により、一般的な線形制約では不可能なアクティベーション戦略が可能になります。
  • C#およびC++のALGLIBバージョンにストリーミングシリアル化/逆シリアル化を追加しました。
  • 部分空間法を使用した直接/スパース/アウトオブオーダー固有値ソルバーと、部分空間法を使用した高速切り捨て主成分分析(PCA)を実装しました。
  • 並列処理のサポートにより階層型RBFが改善されました。一部のデータセットでは数桁高速になり、100,000ポイントを超えるポイントを処理できます。
  • 線形制約付き二次計画法(QP)問題ソルバーを追加しました。
  • kdツリーを改善しました(長方形領域に対するクエリおよびクエリ関数のスレッドセーフバージョン)。

3.10

  • CSVインポート機能が追加されました。CSVファイルから2D行列を読み取ることができるようになりました。
  • 非線形、平滑化されていない、一貫性のない制約付き問題を最適化するために、AGS (AdaptiveGradientSampling)アルゴリズムを導入しました。ALGLIBは、平滑化されていない最適化をサポートする数少ない商用パッケージの1つになりました。
  • 階層的クラスタリングのためのWardメソッドを追加しました。
  • 条件数の推定や反復補正をおこなわない軽量の線形ソルバーが実装されており、「機能が豊富な」類似物よりも何倍も高速です。

3.9

  • スパース/デンス線形代数サポートの大幅な改善:SKS疎行列格納形式、SKSベースの行列の線形代数演算、SKSのコレスキー因数分解器、疎行列用の多くの追加関数。
  • ソルバーとオプティマイザの改善:変数に制約がある限定二次計画問題用の新しいソルバー-QuickQP、非線形拡張ラグランジュオプティマイザ、改良されたBLEICオプティマイザ、多項式ソルバー、その他多くのマイナーな改善。
  • 補間/フィッティング関数の追加:4/5パラメータによるロジスティック曲線フィッティング、Ramer-Douglas-Peucker (RDP)アルゴリズム。
  • 線形判別分析(LDA)アルゴリズムの速度が向上しました。

3.8

  • ランキング機能(記述統計)を追加しました。データをランクに置き換える機能です。
  • 新しいソルバーQP-BLEICを導入しました。これは、境界制約と線形制約を持つ疎で一貫性のない2次計画問題を解くことができます。
  • FFTパフォーマンスを向上しました(パフォーマンスは向上しましたが、依然としてシングルスレッド)。
  • 複数のマイナーな改善(BLEICオプティマイザの強化、MLPの重み初期化の改善、5ポイント未満のAkimaスプライン)。

3.7

  • BLEICオプティマイザを大幅に再設計しました。まず、ElviraIllarionovaによって提案された新しい3段階のアクティブセットアルゴリズムを使用します。これは、勾配投影とL-BFGS制約の等価性の反復を組み合わせたものです。第2に、アルゴリズムにはネストされた外側/内側の反復がなくなったため、アルゴリズムに対してより透過的な停止基準を設定できるようになります。第3に、縮退制約を正しく処理する新しい制約アクティブ化/非アクティブ化戦略を使用します。
  • ALGLIBでのニューラルネットワークのサポートが大幅に改善されました。同じ設定とデータを使用した複数のネットワークの訓練を大幅に簡素化する新しい訓練インターフェイスが導入されました。疎行列を使用して訓練セットを指定できるようになりました。
  • クラスタリングサポートの改善:ALGLIBの新しいバージョンには、クラスタリングサブパッケージの階層クラスター分析アルゴリズムが含まれています。このアルゴリズムには、いくつかの距離メトリック(ユークリッド、1ノルム、無限ノルム、ピアソン-スピアマン相関ベースのメトリック、コサイン距離)といくつかのリンクタイプ(単一リンク、フルリンク、平均リンク)が含まれています。K平均法クラスタリング機能(新しいアルゴリズムが登場するずっと前から存在していた)が新しいクラスタリングアルゴリズムと結合されました。
  • スパース線形ソルバー(CGおよびLSQR)は、自動対角プリプロセッサをサポートするようになりました。
  • 線形/非線形最小二乗ソルバー(lsfitサブパッケージ)は、比率のエラーを報告するようになりました。
  • 疎行列機能にハッシュテーブルとCRSビューの間で変換するための新しい関数が含まれるようになったほか、SparseRewriteExisting関数のパフォーマンスも向上しました。

3.6

  • 二次オプティマイザは、境界と線形等式/不等式の任意の組み合わせをサポートするようになりました。新しいバージョンのオプティマイザは、拡張ラグランジュ法とアクティブセット法を組み合わせて使用​​します。
  • Spline1Dモジュールは、単調3次スプラインによる補間をサポートするようになりました。
  • ベクトル双線形スプラインと双三次スプラインのサポートが追加されました。
  • スカラーおよびベクトルのトライリニア(3D)スプラインのサポートが追加されました。
  • 疎行列のサポートの改善:SparseEnumerate()関数を使用した非ゼロ要素の効率的な列挙、CRS形式で保存された行列のSparseGet()の高速化。
  • 最適化および非線形近似アルゴリズム(LSFit、MinLM、MinBLEIC、MinLBFGS、MinCGサブパッケージ)は、ユーザー指定の勾配(数値プログラムで最も一般的なエラー)の有効性を確認できます。

2.科学研究におけるALGLIBライブラリ

オープンソースが入手可能であり、非営利プロジェクトでも無料で使用できるため、ALGLIBは科学研究の世界において重要なツールとなっています。多様で複雑な問題を解決するためにうまく使用されています。

ALGLIBの大きな影響はカスタムソフトウェアの開発において明らかであり、ALGLIBの多くのアルゴリズムが革新的なソリューションを作成するための基礎となります。

さらに、ALGLIBのシングルスレッドアルゴリズムは、約200万の方程式を含む巨大な方程式系を解くように設計された反復アルゴリズムの並列バージョンを開発するためのベンチマークおよび基準点として機能します。これは、ALGLIBライブラリによって提供されるアルゴリズムの信頼性と優れた効率を示しています。

研究者らは、ALGLIBのアルゴリズムの高品質と効率性に注目しており、基礎研究や工学を含むさまざまな分野の複雑な研究​​問題を解決するための好ましい選択肢となっています。


2.1.最適化問題におけるALGLIB

2014年:Hugo J. Kuijf, Susanne J. van Veluw, Mirjam I. Geerlings, Max A. Viergever, Geert Jan Biessels & Koen L. VinckenAutomatic Extraction of the Midsagittal Surface from Brain MR Images using the Kullback–Leibler Measure.Neuroinform 12, 395–403 (2014)

前のセクションで計算された正中矢状面は、正中矢状面の計算を初期化するために使用されました。正中矢状面は、ALGLIBで実装されているように、双三次スプラインとして表されました(BochkanovおよびBystritsky(2012))。スプラインの制御点は、制御点間の距離m で、計算された正中矢状面上の規則的なグリッドに配置されました。

2017年:Vadim Bulavintsev, A GPU-enabled Black-box Optimization in Application to Dispersion-based Geoacoustic Inversion, 2017, in Yu.G. Evtushenko, M. Yu.Khachay, O. V.Khamisov, Yu.A. Kochetov, V.U.Malkova, M.A.Posypkin (eds.):Proceedings of the OPTIMA-2017 Conference, Petrovac, Montenegro, 02-Oct-2017

参考のために、以前の研究[Zaikinetal.、press]で使用したAlgLibライブラリ[Bochkanov&Bystritsky、2016]に基づく倍精度バージョンを提供します。AlgLibライブラリには、最新のCPU浮動小数点ユニット(FPU)で可能な限り最も正確な結果を生成するように徹底的に調整された、二分アルゴリズムの最先端の実装が含まれています。私たちのCPUベースの二分アルゴリズムの実装では、これほどの精度を誇ることはできません。ただし、その単純さにより、AlgLibよりも著しく高速です。そのため、私たちのアルゴリズムとAlgLibベースのアルゴリズムの結果は異なります。CPUとGPU上の同じアルゴリズムの出力(剰余)間の不一致は、これらのプラットフォーム上の浮動小数点ユニットの実装が異なる結果です。

2.2.補間問題におけるALGLIB

2021年:Jasek K., Pasternak M., Miluski W., Bugaj J., Grabka M, Application of Gaussian Radial Basis Functions for Fast Spatial Imaging of Ground Penetration Radar Data Obtained on an Irregular Grid.Electronics 2021, 10, 2965.

ALGLIBパッケージは、グローバルガウス関数とコンパクトにサポートされる両方の種類のRBFを実装します。古典的なガウス関数は、中心から約3R0の距離にある小さな値をすでに取っており、コンパクトにサポートされるように簡単に修正できます。

この論文では、ALGLIBパッケージに実装されているRBF-MLアルゴリズムが使用されました。これには、初期半径R0、層数NL、正則化係数lの3つのパラメータがあります。このアルゴリズムは、半径が減少するモデルの階層を構築します[13]。最初の(オプション)の反復では、アルゴリズムは線形最小二乗モデルを構築します。線形モデルによって予測された値がノードの関数値から減算され、残差ベクトルが次の反復に渡されます。最初の反復では、R0に等しい半径を持つ従来のRBFモデルが構築されます。ただし、高密度ソルバーは使用せず、問題を正確に解決しようとはしません。固定回数(約50)のLSQR[22]反復を実行することにより、最小二乗問題を解決します。通常、最初の反復で十分です。半径がこれほど大きいと線形システムの状態が悪くなるため、追加の反復を行っても状況は改善されません。RBFモデルの最初の層によって予測された値がノードの関数値から減算され、再び残差ベクトルが次の反復に渡されます。連続する反復ごとに、同じ一定回数のLSQR反復を実行することで半径が半分になり、新しいモデルの予測が残差ベクトルから減算されます。

後続のすべての反復では、細かい正則化を適用して、LSQRソルバーの収束を向上させることができます。正則化係数の値を大きくすると、データノイズを減らすことができます。スムージングを制御するもう1つの方法は、適切な数の層を選択することです。図2にB-scanの例と階層モデルによる近似方法を示します。後続の層の半径は2倍小さくなり、前の層の後の残差が説明されます。半径が減少するにつれて、B-scanのより詳細な詳細が再現されます。

階層アルゴリズムには、いくつかの重要な利点があります。

•ガウスCS-RBFは、疎行列を含む線形システムを生成し、ランク落ち行列と連携できるLSQR疎行列ソルバーの使用を可能にします。
•モデル構築の時間は、O(N3)効率の単純なRBF実装とは対照的に、NlogNとして点の数Nに依存します。
•反復アルゴリズム(連続する層が前の層のエラーを修正する)により、初期半径が非常に大きい場合でも、堅牢なモデルが作成されます。後続の層の半径は小さくなり、前の層によって生じた不正確さが修正されます。
•多層モデルでは、正則化係数の変更と異なる層数の両方による制御の平滑化が可能です。

提示された階層RBF近似アルゴリズムは、大規模で分散したデータセットを処理するための最も効率的なアルゴリズムの1つです。ALGLIBライブラリにあるその実装により、GPR画像の分析に使用できる簡単なソフトウェア開発が可能になります。


2022年:Ruiz M., Nieto J., Costa V., Craciunescu T., Peluso E., Vega J, Murari A, JET Contributors, Acceleration of an Algorithm Based on the Maximum Likelihood Bolometric Tomography for the Determination of Uncertainties in the Radiation Emission on JET Using Heterogeneous Platforms.Appl.Sci.2022, 12, 6798.

ALGLIBは、一般的な数値問題の解決に焦点を当てた数値ライブラリで、C++、C#、Delphiなどのさまざまなプログラミング言語で使用できます。さまざまな科学分野に対応するさまざまな機能を提供します。この特定のアプリケーションでは、等間隔(不均一に分散)できるかできない2Dデータ配列を補間する必要があります。グリッドデータと同等のものを実装する関数の開発には、疎/不均一データに対するALGLIB2D補間関数の使用が必要です。フィッティング部分には最小二乗ソルバー関数が使用され、BlockLLSまたはFastDDDMの2つのオプションが使用できます。可能な限り最高のパフォーマンスを達成するために、FastDDDMオプションが選択されました。

ArrayFireは、MATLAB言語で実装される最も一般的な機能を解決する完全なAPIを提供します。したがって、ArrayFireAPIを使用してMATLABをC++に移植することは比較的簡単であり、コードの一部は行ごとに同等であると考えられます。それにもかかわらず、ArrayFireにはMATLABで利用できるいくつかの強力な関数が含まれていません。たとえば、関数「griddata」を使用すると、均一および不均一な入力データ分布を使用してさまざまなタイプの補間が可能になります。MATLABのこの関数には内部コードの一部がユーザーに表示されますが、他の部分は利用できないため、計算を再現することができません。ArrayFireバージョン3.8.0には補間機能が含まれていますが、入力データが均一に編成されることが期待されています。この問題を解決するために、私たちはオープンソースライブラリALGLIBを選択しました。これは、問題を回避するために使用できる2D補間の関数セットを提供します。

MATLABのアルゴリズムのコードと関数のほとんどはC++に変換されて最適化されましたが、その他は直接変換できませんでした。その理由は、MATLABの一部の関数の内部計算に関する情報が存在しないためです。これは、両方の実装で得られる結果がわずかに異なることを意味します。これらの違いは主に、griddata関数の実装で明らかです。このアプリケーションでは、ALGLIBライブラリに属する​​FastDDMソルバーに組み込まれている「双三次スプライン」補間方法が使用されています。

2.3.比較のベンチマークとしてのALGLIBアルゴリズム

2015年:Tarek Ibn Ziad, M. & Alkabani, Yousra & El-Kharashi, M. W. & Salah, Khaled & Abdelsalam, Mohamed.(2015).Accelerating electromagnetic simulations:A hardware emulation approach. 10.1109/ICECS.2015.7440386.

...Ibn Ziad らは、Jacobi反復ソルバーを物理ハードウェアエミュレーションプラットフォームに実装して、EMシミュレーターの有限要素ソルバーを高速化しました[5]。彼らは、FEMを使用してメタマテリアルのマクスウェル方程式を解くための2次元(2D)エッジ要素コードの実装によるソリューションの効率を実証しました。彼らの設計は、MATLABでの同じ純粋なソフトウェア実装と比較して101倍の高速化を達成し、[13] 200万の方程式を解く場合、ALGLIBC++ライブラリ[14]の最高の反復ソフトウェアソルバーの35倍を上回ります

この論文では、EMシミュレータのソルバーコアを効率的に高速化できるスケーラブルなアーキテクチャを紹介します。このアーキテクチャは物理ハードウェアエミュレーションプラットフォーム上に実装されており、最先端のソルバーと比較されます。実験結果は、提案されたソルバーが、200万の方程式を解く歳に、Matlab上の同じ純粋なソフトウェア実装と比較して522倍、ALGLIBC++ライブラリの最高の反復ソフトウェアソルバーと比較して184倍、そして文献からの別のエミュレーションベースのハードウェア実装と比較して5倍のスピードアップが可能であることを示しており、

2016年:Liu, Yongchao & Pan, Tony & Aluru, Srinivas (2016), Parallel Pairwise Correlation Computation On Intel Xeon Phi Clusters.

人工遺伝子発現データセットと実際の遺伝子発現データセットの両方を使用して、LightPCC を 2 つの CPU ベースの対応物 (ALGLIBのシーケンシャルC++実装(http://www.alglib.net)とインテルMath Kernel Library(MKL)の並列GEMMルーチンに基づく実装)と比較しました。私たちの実験結果は、1つの5110PPhiと16Phiを使用することで、LightPCCがALGLIBよりもそれぞれ最大20.6倍と218.2倍シングルスレッドMKLよりも最大6.8倍と71.4倍速く実行できることを示しました。

2.4.特殊なソフトウェアの一部としてのALGLIBアルゴリズム

2015年:Kraff S, Lindauer A, Joerger M, Salamone SJ, Jaehde U. Excel-Based Tool for Pharmacokinetically Guided Dose Adjustment of Paclitaxel.Ther Drug Monit.2015 Dec;37(6):725-32

方法:パクリタキセルの集団PKパラメーターは、公開されているPKモデルから取得されました。パクリタキセルPKモデルの微分方程式を計算するために、AlglibVBAコードがExcel2007に実装されました。PKパラメーターの最大事後ベイズ推定値は、個々の薬物濃度を使用してExcelソルバーで決定されました。パクリタキセル化学療法を1サイクル受けた250人の患者の濃度をシミュレートしました。Excelツールで計算したパクリタキセルTc>0.05μmol/Lの予測をNONMEMと比較し、POSTHOC関数を使用して最大事後ベイズ推定値を取得しました。

2017年:Hogland, John & Anderson, Nathaniel.(2017).Function Modeling Improves the Efficiency of Spatial Modeling Using Big Data from Remote Sensing.Big Data and Cognitive Computing.1.3.

統計変換と機械学習変換を使用して曲面を構築し、表形式フィールド内のレコードを計算することはできますが、それ自体では、予測モデルのように応答変数と説明変数の間の関係を定義しません。これらの関係を定義するために、ALGLIBとAccord.net内にある多くの最適化アルゴリズムと数学的手順を使用して、さまざまな統計テストと予測モデリングを実行するクラススイートを構築しました[15,16]

さらに、Accord.NETとALGLIB数値ライブラリを統合し、遅延評価を使用して関数モデリングと呼ばれる新しいGISモデリングフレームワーク内で幅広い空間学習、統計学習、機械学習の手順を容易にする新しいコーディングライブラリを導入します。シミュレーションの結果では、関数モデリングにより処理時間が64.3%削減され、ストレージ容量が84.4%削減されたことが示されています。適用されたケーススタディでは、これは処理時間が2247時間から488時間に短縮され、ストレージ容量が152テラバイトから913ギガバイトに削減されました。


3.金融市場分析においてのALGLIBライブラリ

MQL5ライブラリの最初のバージョン(ALGLIB 35)は、最新のアルゴリズムを使用してさまざまな問題を解決し、金融データの分析に広く使用されるようになりました。

以下は、ALGLIBライブラリのクラスと関数を積極的に適用している記事のリストです。

このように、ALGLIB数学ライブラリの機能は、金融データを分析するための有用なツールであることがわかりました。


4.ALGLIBでの特異スペクトル解析

既存の手法に加えて、ALGLIBライブラリの新しいバージョンには特異スペクトル解析法(SSA、「キャタピラ」)が含まれています。この手法により、特に予測の問題において、金融時系列の分析機能が大幅に拡張されます。SSAアルゴリズムはバージョン3.15から利用可能であり、その実装は最適化されています。トレンド抽出、時系列予測、予測の平均化の機能を提供し、モデルの高速増分更新を備えています。


この手法が実際にどのように機能するかを理解し、取引戦略を立てる際にこの手法を使用した経験を共有してください。

以下は、SSAメソッドの使用例を含むテストスクリプトです。ALGLIBライブラリでのSSAメソッドの使用例と詳細については、公式ライブラリヘルプのSingular Spectrum Analysisセクションを参照してください。。

//+------------------------------------------------------------------+
//|                                                     SSA_Test.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Math\Alglib\alglib.mqh>

// Examples of SSA usage with ALGLIB
// https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_basic
// https://www.alglib.net/translator/man/manual.cpp.html#example_ssВa_d_realtime
// https://www.alglib.net/translator/man/manual.cpp.html#example_ssa_d_forecast

//+------------------------------------------------------------------+
//| PrintMatrix                                                      |
//+------------------------------------------------------------------+
void PrintMatrix(CMatrixDouble &x)
  {
//--- print matrix
   string str="[";
   for(int i=0; i<x.Rows(); i++)
     {
      str+="[";
      for(int j=0; j<x.Cols(); j++)
        {
         str+=StringFormat("%f",x.Get(i,j));
         if(j<x.Cols()-1)
            str+=",";
        }
      str+="]";
      if(i<x.Rows()-1)
         str+=",";
     }
   str+="]";
   printf("%s",str);
  }
//+------------------------------------------------------------------+
//| PrintVector                                                      |
//+------------------------------------------------------------------+
void PrintVector(CRowDouble &x)
  {
//--- print vector
   string str="[";
   for(int i=0; i<x.Size(); i++)
     {
      str+=StringFormat("%f",x[i]);
      if(i<x.Size()-1)
         str+=",";
     }
   str+="]";
   printf("%s",str);
  }
//+------------------------------------------------------------------+
//| ssa_d_basic                                                      |
//+------------------------------------------------------------------+
//| Here we demonstrate SSA trend/noise separation for some toy      |
//| problem: small monotonically growing series X are analyzed with  |
//| 3-tick window and "top-K" version of SSA, which selects K largest|
//| singular vectors for analysis, with K=1.                         |
//+------------------------------------------------------------------+
int ssa_d_basic(void)
  {
//--- prepare input data
   double input_data[]= {0,0.5,1,1,1.5,2};
   CRowDouble x=input_data;
//--- first, we create SSA model, set its properties and add dataset.
//--- we use window with width=3 and configure model to use direct SSA algorithm which runs exact O(N*W^2) analysis - to extract one top singular vector.
//--- NOTE: SSA model may store and analyze more than one sequence (say, different sequences may correspond to data collected from different devices)
//--- ALGLIB wrapper class
   CAlglib alglib;
//--- SSA model
   CSSAModel ssa_model;
//--- create SSA model
   alglib.SSACreate(ssa_model);
//--- set window width for SSA model
   alglib.SSASetWindow(ssa_model,3);
//--- adds data sequence to SSA model
   alglib.SSAAddSequence(ssa_model,x);
//--- set SSA algorithm to "direct top-K" algorithm
   alglib.SSASetAlgoTopKDirect(ssa_model,1);
//--- now we begin analysis. Internally SSA model stores everything it needs:
//--- data, settings, solvers and so on. Right after first call to analysis-related function it will analyze dataset, build basis and perform analysis.
//--- subsequent calls to analysis functions will reuse previously computed basis, unless you invalidate it by changing model settings (or dataset).
//--- trend and noise
   CRowDouble trend,noise;
//--- build SSA basis using internally stored (entire) dataset and return reconstruction for the sequence being passed to this function
   alglib.SSAAnalyzeSequence(ssa_model,x,x.Size(),trend,noise);
//--- print result
   PrintVector(trend);
//--- output:   [0.381548,0.558290,0.781016,1.079470,1.504191,2.010505]
//--- EXPECTED: [0.3815,0.5582,0.7810,1.0794,1.5041,2.0105]
   return 0;
  }

//+------------------------------------------------------------------+
//| ssa_d_forecast                                                   |
//+------------------------------------------------------------------+
//| Here we demonstrate SSA forecasting on some toy problem with     |
//| clearly visible linear trend and small amount of noise.          |
//+------------------------------------------------------------------+
int ssa_d_forecast(void)
  {
//--- ALGLIB wrapper
   CAlglib alglib;
//--- model
   CSSAModel ssa_model;
//--- prepare input data
   double input_data[] = {0.05,0.96,2.04,3.11,3.97,5.03,5.98,7.02,8.02};
   CRowDouble x=input_data;
//--- first, we create SSA model, set its properties and add dataset.
//--- we use window with width=3 and configure model to use direct SSA algorithm - one which runs exact O(N*W^2) analysis-to extract two top singular vectors
//--- NOTE: SSA model may store and analyze more than one sequence (say, different sequences may correspond to data collected from different devices)
//--- create SSA model
   alglib.SSACreate(ssa_model);
//--- set window width for SSA model
   alglib.SSASetWindow(ssa_model,3);
//--- set window width for SSA model
   alglib.SSAAddSequence(ssa_model,x);
//--- set SSA algorithm to "direct top-K" algorithm
   alglib.SSASetAlgoTopKDirect(ssa_model,2);
//--- now we begin analysis. Internally SSA model stores everything it needs:
//--- data, settings, solvers and so on. Right after first call to analysis-related function it will analyze dataset, build basis and perform analysis.
//--- subsequent calls to analysis functions will reuse previously computed basis, unless you invalidate it by changing model settings (or dataset).
//--- in this example we show how to use ssaforecastlast() function, which predicts changed in the last sequence of the dataset.
//--- if you want to perform prediction for some other sequence, use alglib.SSAForecastSequence().
//--- trend
   CRowDouble trend;
   alglib.SSAForecastLast(ssa_model,3,trend);
//--- print result
   PrintVector(trend);
//--- output:   [9.000587,9.932294,10.805125]
//--- EXPECTED: [9.0005,9.9322,10.8051]
//--- well, we expected it to be [9,10,11]. There exists some difference, which can be explained by the artificial noise in the dataset.
   return 0;
  }
//+------------------------------------------------------------------+
//| ssa_d_realtime                                                   |
//+------------------------------------------------------------------+
//| Suppose that you have a constant stream of incoming data, and    |
//| you want to regularly perform singular spectral analysis         |
//| of this stream.                                                  |
//|                                                                  |
//| One full run of direct algorithm costs O(N*Width^2) operations,  |
//| so the more points you have, the more it costs to rebuild basis  |
//| from scratch.                                                    |
//|                                                                  |
//| Luckily we have incremental SSA algorithm which can perform      |
//| quick updates of already computed basis in O(K*Width^2) ops,     |
//| where K is a number of singular vectors extracted. Usually it    |
//| is orders of magnitude faster than full update of the basis.     |
//|                                                                  |
//| In this example we start from some initial dataset x0. Then we   |
//| start appending elements one by one to the end of the last       |
//| sequence                                                         |
//|                                                                  |
//| NOTE: direct algorithm also supports incremental updates, but    |
//|       with O(Width^3) cost. Typically K<<Width, so specialized   |
//|       incremental algorithm is still faster.                     |
//+------------------------------------------------------------------+
int ssa_d_realtime(void)
  {
//--- ALGLIB wrapper
   CAlglib alglib;
//--- model
   CSSAModel ssa_model1;
//---
   CMatrixDouble a1;
   CRowDouble sv1;
   int w,k;
//--- prepare input data
   double input_data[]= {0.009,0.976,1.999,2.984,3.977,5.002};
   CRowDouble x0=input_data;
//--- create SSA model
   alglib.SSACreate(ssa_model1);
//--- set window width for SSA model
   alglib.SSASetWindow(ssa_model1,3);
//--- adds data sequence to SSA model
   alglib.SSAAddSequence(ssa_model1,x0);
//--- set algorithm to the real-time version of top-K, K=2
   alglib.SSASetAlgoTopKRealtime(ssa_model1,2);
//--- one more interesting feature of the incremental algorithm is "power-up" cycle.
//--- even with incremental algorithm initial basis calculation costs O(N*Width^2) ops.
//--- if such startup cost is too high for your real-time app, then you may divide initial basis calculation
//--- across several model updates. It results in better latency at the price of somewhat lesser precision during first few updates.
   alglib.SSASetPowerUpLength(ssa_model1,3);
//--- now, after we prepared everything, start to add incoming points one by one;
//--- in the real life, of course, we will perform some work between subsequent update (analyze something, predict, and so on).
//--- after each append we perform one iteration of the real-time solver. Usually
//--- one iteration is more than enough to update basis. If you have REALLY tight performance constraints,
//--- you may specify fractional amount of iterations, which means that iteration is performed with required probability.
   double updateits = 1.0;
//--- append single point to last data sequence stored in the SSA model and update model in the incremental manner
   alglib.SSAAppendPointAndUpdate(ssa_model1,5.951,updateits);
//--- execute SSA on internally stored dataset and get basis found by current method
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,7.074,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,7.925,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,8.992,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,9.942,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,11.051,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,11.965,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,13.047,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- append single point to last data sequence
   alglib.SSAAppendPointAndUpdate(ssa_model1,13.970,updateits);
//--- execute SSA
   alglib.SSAGetBasis(ssa_model1,a1,sv1,w,k);
//--- ok, we have our basis in a1[] and singular values at sv1[]. But is it good enough? Let's print it.
   PrintMatrix(a1);
//--- output:   [[0.510607,0.753611],[0.575201,0.058445],[0.639081,-0.654717]]
//--- EXPECTED: [[0.510607,0.753611],[0.575201,0.058445],[0.639081,-0.654717]]
//--- ok, two vectors with 3 components each. but how to understand that is it really good basis? let's compare it with direct SSA algorithm on the entire sequence.
   CSSAModel ssa_model2;
   CMatrixDouble a2;
   CRowDouble sv2;
//--- input data
   double input_data2[]= {0.009,0.976,1.999,2.984,3.977,5.002,5.951,7.074,7.925,8.992,9.942,11.051,11.965,13.047,13.970};
   CRowDouble x2=input_data2;
//--- create SSA model
   alglib.SSACreate(ssa_model2);
//--- set window width for SSA model
   alglib.SSASetWindow(ssa_model2,3);
//--- add data sequence to SSA model
   alglib.SSAAddSequence(ssa_model2,x2);
//--- set SSA algorithm to "direct top-K" algorithm
   alglib.SSASetAlgoTopKDirect(ssa_model2,2);
//--- execute SSA on internally stored dataset and get basis found by current method
   alglib.SSAGetBasis(ssa_model2,a2,sv2,w,k);
//--- it is exactly the same as one calculated with incremental approach!
   PrintMatrix(a2);
//--- output:   [[0.510607,0.753611],[0.575201,0.058445],[0.639081,-0.654717]]
//--- EXPECTED: [[0.510607,0.753611],[0.575201,0.058445],[0.639081,-0.654717]]
   return 0;
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- the very simple example of trend/noise separation
   ssa_d_basic();
//--- forecasting with SSA
   ssa_d_forecast();
//--- real-time analysis of constantly arriving data
   ssa_d_realtime();
  }
//+------------------------------------------------------------------+


結論

ALGLIBは、金融市場のデータを分析するための強力なツールです。多言語性、クロスプラットフォーム性、豊富な機能、オープンソースにより、金融分析とモデリングの分野の研究者や開発者にとって魅力的な選択肢となっています。信頼性の高いデータ分析ツールに対する継続的なニーズがあり、ALGLIBは継続的な開発と改善をサポートすることでこの課題にうまく対処します。

MetaTrader5プラットフォーム開発者は、トレーダーに最適なソリューションを提供します。

  • MQL5言語は、スピードの点ではC++に匹敵する
  • SQLiteデータベースの組み込み処理、OpenCLを使用した計算を実行する機能、DirectXサポート、ONNXモデルの使用、およびPythonとの統合
  • ファジーロジック統計、および更新されたALGLIBバージョンを含む数学ライブラリ。

MetaQuotes Ltdによってロシア語から翻訳されました。
元の記事: https://www.mql5.com/ru/articles/13289

添付されたファイル |
SSA_Test.mq5 (26.56 KB)
ニューラルネットワークが簡単に(第57回):Stochastic Marginal Actor-Critic (SMAC) ニューラルネットワークが簡単に(第57回):Stochastic Marginal Actor-Critic (SMAC)
今回は、かなり新しいStochastic Marginal Actor-Critic (SMAC)アルゴリズムを検討します。このアルゴリズムは、エントロピー最大化の枠組みの中で潜在変数方策を構築することができます。
エキスパートアドバイザー(EA)に指標を追加するための既製のテンプレート(第2部):出来高指標とビルウィリアムズの指標 エキスパートアドバイザー(EA)に指標を追加するための既製のテンプレート(第2部):出来高指標とビルウィリアムズの指標
この記事では、標準的な出来高指標とビルウィリアムズ指標のカテゴリについて見ていきます。パラメータの宣言と設定、指標の初期化と解除、EAの指標バッファからのデータとシグナルの受信など、EAで指標を使用するためのすぐに使えるテンプレートを作成します。
MetaTrader 5用のMQTTクライアントの開発:TDDアプローチ(第2回) MetaTrader 5用のMQTTクライアントの開発:TDDアプローチ(第2回)
この記事は、MQTTプロトコルのネイティブMQL5クライアントの開発ステップを説明する連載の一部です。今回は、コードの構成、最初のヘッダーファイルとクラス、そしてテストの書き方について説明します。この記事には、テスト駆動開発(Test-Driven-Development)の実践と、それをこのプロジェクトにどのように適用しているかについての簡単なメモも含まれています。
時系列マイニング用データラベル(第3回):ラベルデータの利用例 時系列マイニング用データラベル(第3回):ラベルデータの利用例
この連載では、ほとんどの人工知能モデルに適合するデータを作成できる、いくつかの時系列のラベル付け方法を紹介します。ニーズに応じて的を絞ったデータのラベル付けをおこなうことで、訓練済みの人工知能モデルをより期待通りの設計に近づけ、モデルの精度を向上させ、さらにはモデルの質的飛躍を助けることができます。