如何使用SQL Server根据特定日期的价格变动过滤股票代码?

时间:2018-03-07 23:54:58

标签: sql sql-server ssms

stock price example

[Id] [nvarchar](64) NOT NULL,
[Symbol] [nvarchar](64) NOT NULL,
[Exchange] [nvarchar](50) NOT NULL,
[Date] [date] NOT NULL,
[Open] [decimal](18, 4) NOT NULL,
[High] [decimal](18, 4) NOT NULL,
[Low] [decimal](18, 4) NOT NULL,
[Close] [decimal](18, 4) NOT NULL,
[Volume] [int] NOT NULL,
[Timestamp] [datetime2](7) NOT NULL

我有如上所述存储的库存时间序列数据库(上面还有一个屏幕截图,请点击股票价格示例),8000个符号的时间范围大约是一年。

我正在尝试根据5天的价格下降来过滤符号。

例如:

如果符号A的收盘价比符号" SPY"下跌了15%,请选择符号A. (我在这里选择SPY作为基准)过去5个日历日(包括周末) 如果SPY在过去5个日历日内上涨了7%,那么如果一个符号在同一时期内下降了8%或更多,那么它将被选中。我想为每一行应用这个crieria(这意味着每天在数据库中的每个符号)

伪代码就像:

if (SPY_2018_03_07 - SPY_2018_03_03)/(SPY_2018_03_03) -

(stock_A_2018_03_07 - stock_A_2018_03_03)/(stock_A_2018_03_03) >= 15%

Then Select stock_A

但我仍然坚持如何使用SQL查询来应用此条件。我使用的是SQL Server 2017.有没有人能帮到我?谢谢你们。

1 个答案:

答案 0 :(得分:0)

嗯,这里实际上有两个问题。

  1. 您不具备列中所需的所有值。这意味着计算每行所需的内容会很痛苦。您可以在此处执行的操作是将5天的收盘价值转换为列。你的标题应该是这样的:

    符号,兑换,日期,打开,高,低,关闭,Close_D5,量

  2. 为了更好地理解,我把这部分分为3部分(我没有测试那些查询,他们可能有一些sintax错误):

    SELECT 
        EXCHANGE,SYMBOL,DATE,CLOSE
      ROW_NUMBER() OVER(PARTITION BY EXCHANGE,SYMBOL,DATE ORDER BY EXCHANGE,SYMBOL,DATE ASC) AS ROW_NUM,
      name, recovery_model_desc
      INTO #TEMP
    FROM <TABLE>
    
    
    SELECT 
    EXCHANGE,SYMBOL,DATE,
    CLOSE,
    CLOSE_5 = (SELECT CLOSE FROM #TEMP WHERE ROW_NUM = (t.ROW_NUM - 5))
    INTO #TEMP2
    FROM <TABLE> t
    
    SELECT CLOSE -CLOSE_5 FROM #TEMP3
    
    1. 您需要在多个步骤中创建此过滤器。我建议你制作一个存储过程来传递你需要的参数并返回结果,如果你这样做,你可以更好地调整你的策略。查询应如下所示:

       DECLARE @INCREASED_VALUE DECIMAL(10,2)
       SET @INCREASED_VALUE = (SELECT CLOSE-CLOSE_D5/CLOSE_D5 FROM <TABLE> WHERE SYMBOL = 'BASE_SYMBOL')
      
    2. 现在您需要做的就是按照您想要的方式过滤表格:

          IF(@INCREASED_VALUE > 8)
          BEGIN
              SELECT SYMBOL,DATE,EXCHANGE
              FROM <TABLE>
              WHERE @INCREASED_VALUE -CLOSE-CLOSE_D5/CLOSE <= 15
          END
      

      此查询应该为您提供所有符合条件的日期和符号。