クォンツがスクリプトで行列(マトリックス)を利用できるようになりました!行列は、新しいオブジェクトとして実装され、専用の名前空間と、行列の作成・変更や一般的な行列代数を実行するための付随する49個の関数の完全なセットが用意されています。
行列関連の関数は、matrix.* の名前空間にあります。シンプルな行列は、matrix.new<type>(rows, columns, initial_value) 関数を呼び出すことで作成できます。例:
// Creates a 2x3 (2 rows x 3 columns) "int" matrix with values zero.
m = matrix.new<int>(2, 3, 0)
行列に値を設定するには、matrix.set() 関数を呼び出して特定の要素の値を設定するか、matrix.fill() 関数で行列全体に特定の値を代入します。行列は、すべてのPineの型をサポートしています。但し行列のすべての要素は、同じ型である必要があり、matrix.new<type>() の呼び出しで新たに(“<>”の括弧で指定した型の)テンプレートを使用して指定します。行列の代数関数は、”int” と “float” の数値型に対してのみ有効です。その他の演算はすべての行列の型に対して可能です。
行列関数
matrix.new<type> | 新しい行列のオブジェクトを作成します。行列(マトリックス)は、行と列の2次元のデータ構造です。行列のすべての要素は、型のテンプレート (“<type>”) で指定した型である必要があります。 |
matrix.row() | 行列の行の要素から1次元配列を作成します。 |
matrix.col() | 行列の列の要素から1次元配列を作成します。 |
matrix.get() | 行列の指定したインデックスの要素を返します。 |
matrix.set() | 行列の列と行のインデックス位置にある要素に値を代入します。 |
matrix.rows() | 行列の行の数を返します。 |
matrix.columns() | 行列の列の数を返します。 |
matrix.elements_count() | 行列の要素の合計数を返します。 |
matrix.add_row() | 行列に行を追加します。行は、na値で構成することもできますし、配列を使って値を指定することもできます。 |
matrix.add_col() | 行列に列を追加します。列は、na値で構成することもできますし、配列を使って値を指定することもできます。 |
matrix.remove_row() | 行列の行を削除し、削除された行の値を含む配列を返します。 |
matrix.remove_col() | 行列の列を削除し、削除された列の値を含む配列を返します。 |
matrix.swap_rows() | 行列の行を入れ替えます。 |
matrix.swap_columns() | 行列の列を入れ替えます。 |
matrix.fill() | from_column から to_column と from_row から to_row のインデックスで定義される行列の短形領域に値を代入します(to_column と to_row のインデックスの位置は含まれません)。 |
matrix.copy() | 元の行列のコピーである新しい行列を作成します。 |
matrix.submatrix() | 指定したインデックス内の部分行列を抽出します。 |
matrix.reverse() | 行列の行と列の順番を逆にします。最初の行と最初の列が最後になり、最後が最初になります。 |
matrix.reshape() | 行列を行 x 列のサイズに再構築します。 |
matrix.concat() | 行列を別の行列に追加します。 |
matrix.sum() | 2つの行列の和、または行列とスカラー(数値)の合計からなる新しい行列を返します。 |
matrix.diff() | 行列同士の差、または行列とスカラー(数値)の減算からなる新しい行列を返します。 |
matrix.mult() | 行列同士の乗法、または行列とスカラー(数値)の乗法、あるいは行列とベクトル(値の配列)の乗法からなる新たな行列を返します。 |
matrix.sort() | 行列idの行を列の値のソート順に従って並び替えます。 |
matrix.avg() | 行列の全要素の平均を計算します。 |
matrix.max() | 行列の要素の最大の値を返します。 |
matrix.min() | 行列の要素の最小の値を返します。 |
matrix.median() | 行列の要素の中央値(「真ん中」の値)を算出します。 |
matrix.mode() | 行列の最頻値を算出します。これは行列の要素の中で最も頻出する値です。同じ頻度で発生する複数の値がある場合には、それらの内で最も小さい値を返します。 |
matrix.pow() | 行列の乗法をそれ自身のべき乗で算出します。 |
matrix.det() | 正方行列の行列式を返します。 |
matrix.transpose() | 各要素の行と列のインデックスを入れ替えることで、行列の転置行列バージョンを新たに作成します。 |
matrix.pinv() | 行列の擬似逆行列を返します。 |
matrix.inv() | 正方行列の逆行列を返します。 |
matrix.rank() | 行列の階数を算出します。 |
matrix.trace() | 行列の跡(主対角成分の総和)を算出します。 |
matrix.eigenvalues() | 正方行列の固有値含む配列を返します。 |
matrix.eigenvectors() | 各列が行列の固有ベクトルである固有ベクトルの行列を返します。 |
matrix.kron() | 2つの行列のクロネッカー積を返します。 |
matrix.is_zero() | 行列のすべての要素が0であるかどうかを判定します。 |
matrix.is_identity() | 行列が単位行列(主対角線上に1、それ以外に0を持つ要素)であるかどうかを判定します。 |
matrix.is_binary() | 行列が論理行列(行列のすべての要素が 0または1)であるかどうかを判定します。 |
matrix.is_symmetric() | 正方行列が対称(要素が主対角線に対して対象)であるかどうかを判定します。 |
matrix.is_antisymmetric() | 行列が反対称(その転置が自身の負に等しいもの)であるかどうかを判定します。 |
matrix.is_diagonal() | 行列が対角(主対角線以外のすべての要素が0)であるかどうかを判定します。 |
matrix.is_antidiagonal() | 行列が反対角(反対角線以外のすべての要素が0)であるかどうかを判定します。 |
matrix.is_triangular() | 行列が三角形(主対角線の上または下にあるすべての要素が0)であるかどうかを判定します。 |
matrix.is_stochastic() | 行列が確率行列であるかどうかを判定します。 |
matrix.is_square() | 行列が正方(行と列の数が同じ)であるかどうかを判定します。 |
既存の関数でも行列をサポートするようになったものがあります: for…in 構造では、行列の行を循環させて配列として使用することができ、str.tostring() は行列を文字列に変換して表示します。
以下の例では、まず行列を作成し、その要素を最初の列の値の昇順にソートします。そして、その行列を表形式で表示します:
//@version=5
indicator("Matrix Example", overlay = true)
// Create a 2x2 matrix with ‘na’ values.
m1 = matrix.new<float>(2, 2, na)
// Set values to the matrix’s elements. First argument is the matrix object we created before, second is a row index (it starts from 0 for the first row), third is a column index (it starts from 0 for the first column). Last argument is the value to set.
matrix.set(m1, 0, 0, 3)
matrix.set(m1, 0, 1, 4)
matrix.set(m1, 1, 0, 1)
matrix.set(m1, 1, 1, 2)
// Copy the matrix to create a new one.
m2 = matrix.copy(m1)
// Sort rows of the `m2` matrix based on the values of the first column, in ascending order.
matrix.sort(m2, 0, order.ascending)
// Display the matrix’s elements in the table.
var t = table.new(position.top_right, 2, 2, color.green)
if barstate.islastconfirmedhistory
table.cell(t, 0, 0, "Original Matrix:")
table.cell(t, 0, 1, str.tostring(m1))
table.cell(t, 1, 0, "Sorted Matrix:")
table.cell(t, 1, 1, str.tostring(m2))

以下の投稿は、Pineスクリプト™の新機能のテストにご協力いただいているPineCodersがTradingViewで公開したスクリプトの例です:
RicardoSantos氏による“Function Polynomial Fit”ライブラリ

データに対して多項式回帰フィッティングを実行します。統計学において、多項式回帰は、独立変数 x と従属変数 y の関係を x のn次多項式としてモデル化する回帰分析の一形態です。
lejmer氏による“Ordinary Least Squares”ライブラリ

線形回帰の係数を推定する最も一般的な方法の一つは、OLS(最小二乗法)を使用することです。この実装は、OLSの背後にある仮定が成立する限り、1つの従属変数に複数の独立変数の線形回帰をフィットさせるために使用することができます。
HeWhoMustNotBeNamed氏による“Discounted Price Probability”

価格とファンダメンタルズの過去の相関を比較し、割安である確率を定義するスクリプトです。
この非常に多くのご要望を頂いた機能がお役に立てば幸いです。引き続き、改善の為のフィードバックやご提案をお寄せください。私たちは皆様のためにTradingViewを構築していますので、常にユーザーの方のご意見をお待ちしております。
Pineの新機能については、Pineのユーザーマニュアルのリリースノートをご覧ください。またPineCodersのアカウントは、TelegramのSquawk Box、Twitterアカウント、TradingViewのPineスクリプトの公開チャットルームでも最新情報を発信しています。