我是KDB / Q的新手,并且有一个关于获得两个(不一定是相邻的)行之间差异的问题。
我只有一个表,如下所示:
q)tickers:`ibm`bac`dis`gs`ibm`gs`dis`bac
q)pxs:100 50 30 250 110 240 45 48
q)dates:2013.05.01 2013.01.05 2013.02.03 2013.02.11 2013.06.17 2013.06.21 2013.04.24 2013.01.06
q)trades:([tickers;dates];pxs)
q)trades
tickers dates | pxs
------------------| ---
ibm 2013.05.01| 100
bac 2013.01.05| 50
dis 2013.02.03| 30
gs 2013.02.11| 250
ibm 2013.06.17| 110
gs 2013.06.21| 240
dis 2013.04.24| 45
bac 2013.01.06| 48
我希望能够在表格中设置另一列,用于存储当前和之前价格之间的差异,或者其他结构类似的结构。结果需要回答的关键问题是“与前一次记录价格相比,股票价格变化了多少?”
到目前为止,我已尝试过以下方面:
select tickers, dates, pxs - pxs(dates bin (exec dates from trades where tickers = trades.tickers)) from trades
这根本不起作用(根本没有)。绝对是由于尝试执行类似SQL的查询并具有面向行的思维模式。
请在下面找到所寻求答案的例子:
q)trades: do magic with trades
q)trades
tickers dates | pxs | delta
------------------| --- | -----
ibm 2013.05.01| 100 | 0
bac 2013.01.05| 50 | 0
dis 2013.02.03| 30 | 0
gs 2013.02.11| 250 | 0
ibm 2013.06.17| 110 | 10
gs 2013.06.21| 240 | -10
dis 2013.04.24| 45 | 15
bac 2013.01.06| 48 | -2
感谢您的帮助, 丹
答案 0 :(得分:6)
q)update delta:{0,1_deltas x}pxs by tickers from trades
tickers dates | pxs delta
------------------| ---------
ibm 2013.05.01| 100 0
bac 2013.01.05| 50 0
dis 2013.02.03| 30 0
gs 2013.02.11| 250 0
ibm 2013.06.17| 110 10
gs 2013.06.21| 240 -10
dis 2013.04.24| 45 15
bac 2013.01.06| 48 -2
答案 1 :(得分:1)
如果你这样做:
select pxs by dates,tickers from table
您将拥有一个复杂的列(pxs),它是特定日期和股票代码的价格列表。然后,您可以应用增量:
select deltas pxs by dates,tickers from table
哪个会给你带来差异。第一个值是原始pxs,因此您需要将第一个值更新为0.
修改
只需重新阅读并查看结果,您就需要加入原来的交易表
答案 2 :(得分:1)
通过交易代码更新日期,pxs,delta:(0N,( - 1_ pxs) - 1_ pxs)
请查看其工作原理: 从交易的门票中选择pxs 创建表包含哪些行:ticket和list pxs。 因此,在每一行中我们都有一个列表:
tickers| pxs -------| ------- bac | 50 48 dis | 30 45 gs | 250 240 ibm | 100 110
现在我们必须应用将计算delta的函数。上面提到的最好的功能:增量,但我的版本差不多。
如果我们选择 - 那么我们将有一个带有代码的表| pxs列表|增量列表,但是我们使用update .. by,然后它取消组合分组值。
答案 3 :(得分:0)
使用prev
函数可以获得相同的结果。值得一提的是,prev
自动将空(0N
)添加为第一个元素。这很重要,因为我们没有可用的先前信息,但是,在第一个元素中添加0
表示没有任何更改;尽管这取决于您要如何处理第一条记录。
q)update delta:pxs-prev[pxs] by tickers from trades
tickers dates | pxs delta
------------------| ---------
ibm 2013.05.01| 100
bac 2013.01.05| 50
dis 2013.02.03| 30
gs 2013.02.11| 250
ibm 2013.06.17| 110 10
gs 2013.06.21| 240 -10
dis 2013.04.24| 45 15
bac 2013.01.06| 48 -2
使用deltas
获得相同的结果(0N
而非0
)
q)update delta:{0N,1_deltas x}pxs by tickers from trades