簡體   English   中英

余額量的SQL函數(財務查詢)

[英]SQL Function for On Balance Volume (Financial Query)

我想為On Balance Volume創建一個函數(SQL函數)。 這對於計算而言太復雜了,無法解決,但這是用戶定義表功能的概述。 如果有人可以幫助我填補空白,我將不勝感激。 克雷格

   CREATE FUNCTION [dbo].[GetStdDev3] (@TKR VARCHAR(10))
   RETURNS @results TABLE (
    dayno   SMALLINT IDENTITY(1,1) PRIMARY KEY
    , [date]  DATETIME
    , [obv] FLOAT
    )
    AS BEGIN

    DECLARE @rowcount SMALLINT
     INSERT @results ([date], [obv])

// CREATE A FUNCTION FOR ON BALANCE VOLUME
// On Balance Volume is the Summ of Volume for Total Periods
// OBV = 1000 at Period = 0
// OBV = OBV Previous + Previous Volume if Close > Previous Close
// OBV = OBV Previous - Previous Volume if Close < Previous Close
//  OBV = OBV Previous if Close = Previous Close

//  The actual Value of OBV is not important so to keep the ratio low we reduce the 
// Total Value of Tickers by 1/10th or 1/100th
// For Value of Volume = Volume * .01 if Volume < 999
// For Value of Volume = Volume * .001 If Volume >= 999
    FROM Tickers

   RETURN

    END

這是股票報價表

 [dbo].[Tickers](
 [ticker] [varchar](10) NULL,
 [date] [datetime] NULL,
 [high] [float] NULL,
 [low] [float] NULL,
 [open] [float] NULL,
 [close] [float] NULL,
 [volume] [float] NULL,
 [time] [datetime] NULL,
 [change] [float] NULL
 ) 

這是數據的一個例子

   ticker  date  close  volume 
   pzi:  5-10-10  10.94    805 
   pzi;  5-11-10  11.06    444 
   pzi:  5-12-10  11.42    236 
   pzi:  5-13-10  11.3    635 
   pzi:  5-14-10  11    316 

   date  obv 
   5-10  996.38 
   5-11  996.82 
   5-12  997.06 
   5-13  996.42 
   5-14  996.11 

這是一個有效的內聯表值函數(對於優化程序最有效):

CREATE FUNCTION [dbo].[GetStdDev3] (@TKR VARCHAR(10))
    RETURNS TABLE
    AS RETURN (
    WITH    Y AS ( SELECT   *
                   ,OBV_Change = ISNULL(SIGN(currclose - prevclose)
                                        * volume, 1000)
           FROM     ( SELECT    curr.date
                               ,curr.[CLOSE] AS currclose
                               ,prev.[CLOSE] AS prevclose
                               ,curr.volume
                      FROM      Tickers AS curr
                      LEFT JOIN Tickers AS prev
                                ON prev.ticker = @TKR
                                   AND prev.date = ( SELECT MAX(date)
                                                     FROM   Tickers
                                                     WHERE  ticker = @TKR
                                                            AND date < curr.date
                                                   )
                      WHERE     curr.ticker = @TKR
                    ) AS X
         )
SELECT  y1.date
       ,SUM(y2.OBV_Change) AS OBV
       ,ROW_NUMBER() OVER(ORDER BY y1.date) AS dayno
FROM    Y AS y1
LEFT JOIN Y AS y2
        ON y2.date <= y1.date
GROUP BY y1.date
)

我不確定標准化-我省略了-加入它可能需要您將其加入多語句TVF。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM