首页 文章

KDB / Q中行之间的差异

提问于
浏览
1

我是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

谢谢你的帮助,丹

4 回答

  • 7
    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

    更新日期,pxs,delta:(0N,( - 1_ pxs) - 1_ pxs)来自交易的代码

    请查看它是如何工作的:从交易的票据中选择pxs创建表,其中包含行:票证和列表pxs . 所以在每一行中我们都有一个列表:

    tickers| pxs
    -------| -------
    bac    | 50  48
    dis    | 30  45
    gs     | 250 240
    ibm    | 100 110
    

    现在我们必须应用将计算delta的函数 . 上面提到的最佳功能:增量,但我的版本大致相同 .

    如果我们选择 - 那么我们将有表格与代码| pxs列表|增量列表,但是我们使用更新...,然后它取消组合分组值 .

  • 1

    如果你这样做:

    select pxs by dates,tickers from table
    

    您将拥有一个复杂的列(pxs),它是特定日期和股票代码的价格列表 . 然后您可以应用增量:

    select deltas pxs by dates,tickers from table
    

    哪个会给你带来跑步的差异 . 第一个值是原始pxs,所以你需要将第一个值更新为0 .

    编辑

    只需重新阅读并查看结果,您就需要加入到原来的交易表中

  • 2

    您可以使用 prev 函数获得相同的结果 . 值得强调的一点是 prev 会自动添加null( 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
    

相关问题