量化交易员们现在可以在他们的脚本中使用矩阵了!它们被实现为具有专用命名空间的新对象和一套完整的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> | 创建一个新的矩阵对象。矩阵是包含行和列的二维数据结构。矩阵中的所有元素都必须是类型模板(“<type>”)中指定的类型。 |
matrix.row() | 从矩阵行的元素创建一维阵列。 |
matrix.col() | 从矩阵列的元素创建一维阵列。 |
matrix.get() | 返回具有指定矩阵索引的元素。 |
matrix.set() | 将 value 分配给矩阵的 column 和 row 索引处的元素。 |
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(不包括它)定义的矩阵的矩形区域。 |
matrix.copy() | 创建一个新矩阵,它是原始矩阵的副本。 |
matrix.submatrix() | 提取指定索引内的子矩阵。 |
matrix.reverse() | 反转矩阵中行和列的顺序。第一行和第一列成为最后一行/列,最后一行/列成为第一行/列。 |
matrix.reshape() | 将矩阵重建为 rows x cols 维度 |
matrix.concat() | 将一个矩阵附加到另一个矩阵。 |
matrix.sum() | 返回由两个矩阵或一个矩阵和一个标量(数值)之和产生的新矩阵。 |
matrix.diff() | 返回由矩阵或矩阵与标量(数值)相减得到的新矩阵 |
matrix.mult() | 返回由矩阵之间、矩阵和标量(数值)或矩阵和向量(值阵列)之间的乘积产生的新矩阵。 |
matrix.sort() | 按照 column 中值的排序顺序重新排列 id 矩阵中的行。 |
matrix.avg() | 计算矩阵中所有元素的平均值。 |
matrix.max() | 返回矩阵元素的最大值。 |
matrix.min() | 返回矩阵元素的最小值。 |
matrix.median() | 计算矩阵元素的中位数(“中间”值)。 |
matrix.mode() | 计算矩阵的众数,它是矩阵元素中出现频率最高的值。当有多个值同样频繁地出现时,该函数返回这些值中的最小值。 |
matrix.pow() | 计算矩阵本身 power 次的乘积。 |
matrix.det() | 返回方阵的行列式。 |
matrix.transpose() | 通过交换每个元素的行和列索引来创建新的转置版本的矩阵。 |
matrix.pinv() | 返回矩阵的伪逆矩阵。 |
matrix.inv() | 返回方阵的逆矩阵。 |
matrix.rank() | 计算矩阵的秩。 |
matrix.trace() | 计算矩阵的迹(主对角线元素的总和)。 |
matrix.eigenvalues() | 返回一个包含方阵特征值的阵列。 |
matrix.eigenvectors() | 返回特征向量矩阵,其中每一列都是矩阵的特征向量。 |
matrix.kron() | 返回两个矩阵的Kronecker积。 |
matrix.is_zero() | 确定矩阵的所有元素是否为零。 |
matrix.is_identity() | 确定矩阵是否为单位矩阵(主对角线上为 1 且其他位置为 0 的元素)。 |
matrix.is_binary() | 确定矩阵是否为逻辑矩阵(当矩阵的所有元素为 0 或 1 时)。 |
matrix.is_symmetric() | 确定方阵是否为对称矩阵(元素相对于主对角线对称)。 |
matrix.is_antisymmetric() | 确定矩阵是否为反对称矩阵(其转置等于其负数)。 |
matrix.is_diagonal() | 确定矩阵是否为对角矩阵(主对角线以外的所有元素都为零)。 |
matrix.is_antidiagonal() | 确定矩阵是否为反对角矩阵(次对角线之外的所有元素都为零)。 |
matrix.is_triangular() | 确定矩阵是否为三角矩阵(如果主对角线上方或下方的所有元素都为零)。 |
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 Script™ 新功能的PineCoders在TradingView上发布的脚本示例:
RicardoSantos 的“函数多项式拟合 Function Polynomial Fit”脚本库

对数据执行多项式回归拟合。在统计学中,多项式回归是回归分析的一种形式,其中自变量 x 和因变量 y 之间的关系被建模为 x 中的 n 次多项式。
lejmer 的“普通最小二乘法 Ordinary Least Squares”脚本库

估计线性回归系数的最常见方法之一是使用普通最小二乘法 (OLS)。只要 OLS 背后的假设成立,此实现可用于将多自变量的线性回归拟合到一个因变量。
HeWhoMustNotBeNamed 的“折扣价格概率 Discounted Price Probability”

该脚本比较价格和基本面的历史相关性,并定义被低估的概率。
我们希望大家发现这个高度要求的功能很有用。请继续向我们发送您的反馈和改进建议。我们为您构建 TradingView,总是渴望收到您的来信。
要随时了解Pine的新功能,请留意我们的Pine用户手册发行说明。PineCoders帐户还从Telegram上的Squawk Box、Twitter帐户、和TradingView上的Pine脚本公开聊天中广播更新。
还没有关注我们的中文微信公众号?快来扫二维码吧!
