使用时间序列
时间序列 是量化交易分析的重要组成部分。
在基本层面上,时间序列是一个数字数组,与时间戳序列对齐。
- 每个时间序列都有一个 UUID,用于标识时间序列。
- 每个时间序列都有一个名称,用于标记时间序列。
- 每个时间序列都有一个父序列。时间序列的根被推断为时间戳序列。
- 每个时间序列都有一些属性标签,用于其他用途。
时间对齐和时间序列森林
事实上:
- 时间序列的每个项目都有两个概念维度:时间和值。
- 大多数时间序列共享相同的时间维度。
- 有时,我们需要在交叉时间框架中进行分析。(例如,在 1 小时和 1 天时间框架中)
为了解决这个问题,我们引入了时间序列森林1,它是一个包含所有时间序列的树结构。
树的根是时间戳序列。时间戳以毫秒为单位的时间戳纪元表示。
时间戳序列的子节点是与时间戳序列对齐的时间序列。例如,收盘价序列与时间戳序列对齐。因此,收盘价序列的根序列是时间戳序列。
可能有 多个时间序列与相同的时间戳序列对齐。例如,收盘价序列和成交量序列都与时间戳序列对齐。
可能有多个时间戳序列。例如,1 分钟的时间戳序列和 15 分钟的时间戳序列。
时间方向和时间序列索引
时间序列的值可以通过索引随机访问,因为它是一个数组。索引只有在时间对齐的上下文中才有意义。
数组从左到右增长,这意味着最新项目的索引最大。
最新项目的索引称为当前索引,通常是尚未关闭的柱。当前索引的前一个数字称为前一个索引,通常是已关闭的柱。
export default () => {
const { time, open, close } = useOHLC('Y', 'XAUUSD', 'PT1H');
console.info(
formatTime(time.currentValue), // 最新时间,等同于 time[time.length - 1]
time.currentIndex, // 等同于 time.length - 1
time.previousIndex, // 等同于 time.length - 2
close.currentIndex, // 等同于 time.currentIndex
open.currentValue, // 最新开盘价,等同于 open[open.currentIndex]
open.previousValue, // 前一个开盘价,等同于 open[previousIndex]
close.currentValue, // 最新收盘价,等同于 close[currentIndex]
close.previousValue, // 前一个收盘价,等同于 close[previousIndex]
);
};
useSeries
useSeries
用于创建时间序列。
- 第一个参数是序列的名称。
- 第二个参数是父序列。
- 第三个参数是序列的标签。默认为
{}
export default () => {
const { close } = useOHLC('Y', 'XAUUSD', 'PT1H');
const series = useSeries('series-name', close);
useEffect(() => {
series[series.currentIndex] = Math.random();
});
};
您还可以指定标签来初始化序列。
export default () => {
const { close } = useOHLC('Y', 'XAUUSD', 'PT1H');
const series = useSeries('series-name', close, { display: 'line', chart: 'new' });
useEffect(() => {
series[series.currentIndex] = Math.random();
});
};
可视化
您可以指定 useSeries
的第三个参数来控制可视化。
您可以指定序列的显示类型。
- 默认情况下会隐藏序列。
- 您可以通过指定
display: 'line'
来绘制折线图。 - 您可以通过指定
display: 'hist'
来绘制直方图。
您可以指定将序列放置在哪个图表上。
- 默认情况下,序列会跟随父序列放置。
- 您可以通过指定
chart: 'new'
将序列放置在新图表上。 - 您可以通过指定
chart: anotherSeries.id
将序列跟随另一个序列放置。
Footnotes
-
森林是计算机科学术语。它是一种由树集合组成的数据结构。 ↩