查询股票数据时间范围的变化
Posted
技术标签:
【中文标题】查询股票数据时间范围的变化【英文标题】:a query for change of stock data timeframe 【发布时间】:2013-01-07 21:23:24 【问题描述】:我正在寻找一个简单的查询,它可以将较短时间范围内的股票数据更改为较高时间范围内的股票数据。考虑下表
Open High Low Close Volume
Date
1999-01-04 10:22:00 1.1801 1.1819 1.1801 1.1817 4
1999-01-04 10:23:00 1.1817 1.1818 1.1804 1.1814 18
1999-01-04 10:24:00 1.1817 1.1817 1.1802 1.1806 12
1999-01-04 10:25:00 1.1807 1.1815 1.1795 1.1808 26
1999-01-04 10:26:00 1.1803 1.1806 1.1790 1.1806 4
1999-01-04 10:27:00 1.1801 1.1801 1.1779 1.1786 23
1999-01-04 10:28:00 1.1795 1.1801 1.1776 1.1788 28
1999-01-04 10:29:00 1.1793 1.1795 1.1782 1.1789 10
1999-01-04 10:31:00 1.1780 1.1792 1.1776 1.1792 12
1999-01-04 10:32:00 1.1788 1.1792 1.1788 1.1791 4
它每 1 分钟更新一次。如何通过查询将其更改为 2 分钟数据?
【问题讨论】:
update frequency
= 2 分钟,你的 OHLCV 是多少?例如10.22 到 10.23 你希望开盘价是 1.1801,收盘价是 1.1814?高到 1.1819,低 = 1.1801?那么音量是22?
请注意:这只是一个示例。认为它有 10:30:00 的一行。到boncadigo:是的。完全正确
to boncadigo:yes.exactly.consider it as you say as for other time frames like 3 min.in case of 3 min,it will become time:10:24 open:1.1801 high:1.1819低:1.1801 收盘:1.1806 成交量:34
@user1956274 有时,考虑到流动性不足的股票或时间框架,每分钟可能没有可用的刻度线......所以你能确定你是否每分钟都有日期吗?跨度>
【参考方案1】:
你想对事物进行分组:
select floor(time/2) as time,
sum(volume) as volume,
max(case when time = 2*floor(time/2) then open end) as open,
max(high) as high,
max(low) as low),
max(case when time = 2*floor(time/2)+1 then close end) as close
from t
group by floor(time/2)
使用row_number()
可以使打开和关闭的公式更简单、更通用,但您需要指定数据库。
【讨论】:
非常感谢您的快速回复。它是访问 @GordonLinofffloor
is not available in MS Access SQL but MS Excel. However OP could use int
。或者 OP 自己写,但是这个链接也已经提供了..【参考方案2】:
答案在SQL Server
。因此,您可能需要更改一些语法以适应。就partition check this out.而言。
还假设您的资产流动性极强,并且不会错过任何一分钟... ;) 不过,这个查询可以进一步改进。请尝试一下。
SQLFIDDLE DEMO
查询:[已编辑以排除任何作为 null 出现的 ohlcv 值..]
select z.dt, a.opens as o, z.h,
z.l, b.closes as c, z.v
from (
select Dateadd(minute, 1, x.dates) as dt,
max(y.high) as h, min(y.low) as l,
sum(y.volume) as v
from ohlcv x
left join ohlcv y
on y.dates
between x.dates and
Dateadd(minute, 1, x.dates)
where (DATEPART(MINUTE, x.Dates) % 2) = 0
group by Dateadd(minute, 1, x.dates)) z
left join
ohlcv a
on a.dates = Dateadd(minute, -1, z.dt)
left join ohlcv b
on b.dates = z.dt
where not (a.opens is null or z.h is null
or z.l is null or b.closes is null
or z.v is null)
;
结果:
| DT |O |H |L |C | V |
---------------------------------------------------------------------------
| January, 04 1999 10:23:00+0000 | 1.1801 | 1.1819 | 1.1801 | 1.1814 | 22 |
| January, 04 1999 10:25:00+0000 | 1.1817 | 1.1817 | 1.1795 | 1.1808 | 38 |
| January, 04 1999 10:27:00+0000 | 1.1803 | 1.1806 | 1.1779 | 1.1786 | 27 |
| January, 04 1999 10:29:00+0000 | 1.1795 | 1.1801 | 1.1776 | 1.1789 | 38 |
| January, 04 1999 10:31:00+0000 | 1.1781 | 1.1793 | 1.1776 | 1.1792 | 17 |
【讨论】:
非常感谢您的帮助他们? @user1956274 我以为你忘了这个.. ;) althousea., b., x., z.
是 table alias
。因此,在 2 分钟内将 1 minute
添加到 5 分钟内,将 4 minutes
添加到我使用过 DateAdd
的函数中
@user1956274 请试试这个sqlfiddle demo for 5 minutes intervals。但是我很想知道这是否对您有所帮助,如果这是您想要的:) 请发表评论。
非常感谢。它很有帮助,它帮助我学习了 sql 中的一个新概念,我的意思是表别名。上帝保佑你 :)
@user1956274 然后投票 ;) 如果这个答案对您有帮助:D 由于您是新手,您可能不知道该怎么做,请查看 here 和 +1 以了解您的有趣问题。
以上是关于查询股票数据时间范围的变化的主要内容,如果未能解决你的问题,请参考以下文章
使用 T-SQL 将 OHLC-Stockmarket 数据分组到多个时间范围内
pandas基于时序数据计算模型预测推理需要的统计数据(累计时间长度变化变化率方差均值最大最小等):范围内的统计量变化率获得数据集最后的几条数据的统计量变化率获得范围内的统计量