title: Line 系统 description: 时间序列的核心数据结构
Line 系统¶
Line 系统是 Backtrader 中处理时间序列数据的基础数据结构。
概述¶
classDiagram
LineRoot <|-- LineBuffer
LineBuffer <|-- LineSeries
LineSeries <|-- LineIterator
LineIterator <|-- Indicator
LineIterator <|-- Observer
LineIterator <|-- Strategy
```bash
## 层次结构
### LineRoot
提供核心操作的基础接口:
```python
class LineRoot:
def get(self, size=None):
"""以数组形式获取数据。"""
def __len__(self):
"""返回 line 长度。"""
def datetime(self, index=0):
"""获取指定索引的日期时间。"""
```bash
### LineBuffer
循环缓冲区实现,高效使用内存:
```python
class LineBuffer:
def __getitem__(self, key):
"""通过索引访问数据。
[0] = 当前值, [-1] = 前一根, [-2] = 两根前
"""
def __setitem__(self, key, value):
"""在指定索引设置数据。"""
@property
def minperiod(self):
"""所需的最小数据点数。"""
```bash
### LineSeries
时间序列操作:
```python
class LineSeries:
def align(self):
"""对齐到数据时间周期。"""
def date(self, index=0):
"""获取指定索引的日期。"""
def time(self, index=0):
"""获取指定索引的时间。"""
```bash
### LineIterator
执行阶段和迭代逻辑:
```python
class LineIterator:
# Line 类型
IndType = 0 # 指标
ObsType = 2 # 观察器
StrType = 3 # 策略
def prenext(self):
"""在满足 minperiod 之前调用。"""
def nextstart(self):
"""在首次满足 minperiod 时调用。"""
def next(self):
"""在满足 minperiod 后的每根 K 线调用。"""
```bash
## 访问模式
### 当前和历史数据
```python
class MyStrategy(bt.Strategy):
def next(self):
# 当前值
current = self.data.close[0]
# 历史值
prev1 = self.data.close[-1]
prev2 = self.data.close[-2]
# 切片 (返回数组)
recent = self.data.close.get(size=5)
```bash
### 数据长度
```python
# 可用的总 K 线数
total_bars = len(self.data)
# next() 中已处理的 K 线数
processed_bars = len(self.data.close)
```bash
### 日期时间访问
```python
# 当前 K 线的日期时间
dt = self.data.datetime.datetime(0)
date = self.data.datetime.date(0)
time = self.data.datetime.time(0)
```bash
## Line 别名
数据源的常用 line 别名:
| 别名 | Line | 描述 |
|------|------|------|
| `datetime` | datetime | K 线时间戳 |
| `open` | open | 开盘价 |
| `high` | high | 最高价 |
| `low` | low | 最低价 |
| `close` | close | 收盘价 |
| `volume` | volume | 成交量 |
| `openinterest` | openinterest | 持仓量 |
## 创建自定义 Line
### 在策略中
```python
class MyStrategy(bt.Strategy):
def __init__(self):
# 创建自定义 line
self.lines.custom = self.data.close # 别名
```bash
### 在指标中
```python
class MyIndicator(bt.Indicator):
lines = ('signal',) # 定义输出 line
def __init__(self):
super().__init__()
self.lines.signal = self.data.close - self.data.close(-1)
```bash
## 性能考虑
### 循环缓冲区
循环缓冲区设计:
- 固定内存分配
- 高效的追加操作
- 自动滚动
### 内存管理
```python
# 使用 qbuffer 限制长回测的内存使用
data = bt.feeds.CSVGeneric(dataname='data.csv')
data.qbuffer(1000) # 在内存中保留最后 1000 根 K 线
```bash
## 常见模式
### 滞后值
```python
class MyStrategy(bt.Strategy):
def __init__(self):
# 滞后的收盘价
self.close_lag1 = self.data.close(-1)
self.close_lag5 = self.data.close(-5)
```bash
### 价格变化
```python
class MyStrategy(bt.Strategy):
def __init__(self):
# 价格变化
self.change = self.data.close - self.data.close(-1)
# 百分比变化
self.pct_change = (self.data.close / self.data.close(-1)) - 1
```bash
### 滚动操作
```python
class MyStrategy(bt.Strategy):
def __init__(self):
# 滚动求和 (手动)
self.rolling_sum = bt.indicators.SumN(self.data.close, period=20)
# 或使用指标
self.sma = bt.indicators.SMA(self.data.close, period=20)
```bash
## 相关文档
- [阶段系统](phase-system.md)
- [架构概览](overview.md)