K 线技术分析是股票投资中很常用的一种分析方法,主要通过历史价格图表中的数据来预测未来市场趋势。一根 K 线包括四个价格:开盘价、收盘价、最高价和最低价,通常简称为 OHLC。K 线按照周期一般可以分为日、周、月、年,以及五分钟、30分钟等类型。
本文将介绍如何分别基于历史数据和实时流数据来高效计算 K 线。完整的教程和脚本已发布在官方知乎,可点击查看:使用 DolphinDB 计算K线 - 知乎 (zhihu.com)
用历史数据计算 K 线
在用全量历史数据批量计算 K 线时,通常会需要考虑以下几种场景:
-
指定窗口起始时间
-
重叠窗口
-
使用交易量划分窗口
-
极大数据量的高效读写
下面给大家逐一展示一下如何用 DolphinDB 轻松实现这几类 K 线计算。
不指定 K 线窗口的起始时刻
bar 函数:bar(X,Y) 返回 X 减去 X 除以 Y 的余数 (X-mod(X,Y)),一般用于将数据分组。
计算5分钟 K 线只需2行代码:
barMinutes = 5
OHLC = select first(price) as open, max(price) as high, min(price) as low, last(price) as close, sum(volume) as volume from trade group by symbol, date, bar(time, barMinutes*60*1000) as barStart
指定 K 线窗口的起始时刻
dailyAlignedBar 函数:可处理每日多个交易时段,亦可处理隔夜时段。
中国股票市场每日有两个交易时段,上午时段为9:30至11:30,下午时段为13:00至15:00。计算7分钟 K 线只需3行代码:
barMinutes = 7
sessionsStart=09:30:00.000 13:00:00.000
OHLC = select first(price) as open, max(price) as high, min(price) as low, last(price) as close, sum(volume) as volume from trade group by symbol, dailyAlignedBar(timestamp, sessionsStart, barMinutes*60*1000) as barStart
某些期货每日有多个交易时段,且包括隔夜时段。假设第一个交易时段为上午8:45到下午13:45,另一个时段为隔夜时段,从下午15:00到第二天上午05:00,以此为例计算7分钟 K 线:
barMinutes = 7
sessionsStart = [daySession[0], nightSession[0]]
OHLC = select first(price) as open, max(price) as high, min(price) as low, last(price) as close, sum(volume) as volume from trade group by symbol, dailyAlignedBar(timestamp, sessionsStart, barMinutes*60*1000) as barStart
重叠 K 线窗口
wj 函数:对左表中的每一行,在右表中截取一段窗口,进行计算。
每日两个交易时段,每5分钟计算30分钟K线。
首先生成窗口,并且使用 cj 函数来生成股票和交易窗口的组合。
barWindows = table(symbols as symbol).cj(table((09:30:00.000 + 0..23 * 300000).join(13:00:00.000 + 0..23 * 300000) as time))
然后使用 wj 函数计算重叠窗口的K线数据:
OHLC = wj(barWindows, trade, 0:(30*60*1000),
<[first(price) as open, max(price) as high, min(price) as low, last(price) as close, sum(volume) as volume]>, `symbol`time)
使用交易量划分K线窗口
上面的例子我们均使用时间作为划分 K 线窗口的维度。在实践中,也可以使用其他变量,譬如用累计的交易量作为划分 K 线窗口的依据。以下代码展示了交易量每增加一百万就计算一次 K 线的代码。
n = 1000000
sampleDate = 2019.11.07
symbols = `600519`000001`600000`601766
trade = table(take(sampleDate, n) as date,
(09:30:00.000 + rand(7200000, n/2)).sort!() join (13:00:00.000 + rand(7200000, n/2)).sort!() as time,
rand(symbols, n) as symbol,
100+cumsum(rand(0.02, n)-0.01) as price,
rand(1000, n) as volume)
volThreshold = 1000000
t = select first(time) as barStart, first(price) as open, max(price) as high, min(price) as low, last(price) as close, last(cumvol) as cumvol
from (select symbol, time, price, cumsum(volume) as cumvol from trade context by symbol)
group by symbol, bar(cumvol, volThreshold) as volBar
这里采用了嵌套查询的方法。子查询为每个股票累计的交易量 cumvol,然后在主查询中根据累计的交易量用 bar 函数生成窗口。
使用MapReduce函数加速
若需从数据库中提取较大量级的历史数据,计算 K 线,然后存入数据库,可使用 DolphinDB 内置的 Map-Reduce 函数 mr 进行数据的并行读取与计算。这种方法可以显著提高速度。
实时 K 线计算
实际上,我们看盘的时候,股票的蜡烛图是随时间不断更新变化的。这种动态实时更新的 K 线要怎么算呢?
DolphinDB 提供了强大的流计算引擎,可以通过如下图所示的流程实现实时 K 线计算:
实时数据供应商一般会提供基于Python、Java或其他常用语言的 API 的数据订阅服务。
我们提供的方案中,使用 Python 来模拟接收市场数据,通过 DolphinDB Python API 写入流数据表中。DolphinDB 的流数据时序聚合引擎可按照指定的频率与移动窗口实时计算K线。
完整的教程中,使用的模拟实时数据源包含以下4列(附带一行样本数据):
Symbol | Datetime | Price | Volume |
000001 | 2018.09.03T09:30:06 | 10.13 | 4500 |
实时计算 K 线包含以下三个步骤:
-
使用 Python 接收实时数据,并写入 DolphinDB 流数据表
-
使用移动窗口实时计算指标
-
在 Python/Grafana 中实时展示 K 线数据
完整的脚本可点击查看:使用 DolphinDB 计算K线 - 知乎 (zhihu.com)
当然,K 线分析法只是股票交易技术分析中的一种。有效市场假说对股票技术分析的有效性一直存在一定争议,当下的普遍观点是,股票市场的价格基本上是不可预测的,技术分析得出的结果也不够稳健。那为什么我们还要做技术分析呢?
技术分析看似只是针对量价关系、市场波动这些现象的分析,从而再寻找或预测下一个类似的现象;但真正的核心,是要能通过现象认知到更深处的市场机理,分析资金意图——所谓透过现象看本质。
更多技术问题,欢迎添加小助手(dolphindb1)进入交流群,让我们的思想激情碰撞吧!