您好我有以下查询运行一个函数来获取下表中一组代码的标准偏差...
GO
CREATE TABLE [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
) ON [PRIMARY]
问题:线下表功能返回STDDEV CALC,SPROC反过来使用它来计算布林带...(平均值+ 2 * STDEV等)......
我得到的一些代码的结果有奇怪的数据......这是代码'ATE'的结果集或只是结果集的样本。
dayno ticker stddev
484 11/13/2009 0.544772123613694
485 11/16/2009 0.323959874058724
486 11/17/2009 0.287909129182731
487 11/18/2009 0.225018517756637
488 11/19/2009 4.94974746848848E-02
489 11/20/2009 4.94974746848848E-02
正如您所看到的,某些代码的最后两个值导致“奇怪的数据”,而实际的代码表在非常正常的范围内。
从下面的行表函数可以看出,最后有一些有趣的东西正在进行,因为它使用了20天的时间段,最后一个值总是返回为NULL,所以我请专家调整这个是彼得想出来的......它通常可以找到,但正如你上面所见,有时却没有 - 有没有人对我如何解决这个困境提出建议?
ALTER FUNCTION dbo.GetStdDev3 (@TKR VARCHAR(10))
RETURNS @results TABLE (
dayno SMALLINT IDENTITY(1,1) PRIMARY KEY
, [date] DATETIME
, [stddev] FLOAT
)
AS BEGIN
DECLARE @min_sysdate DATETIME, @min_tkrdate DATETIME, @rowcount SMALLINT
SET @min_sysdate = DATEADD(DAY,-731,GETDATE())
SET @min_tkrdate = DATEADD(DAY,20,(
SELECT MIN(DATE) FROM TICKERS WHERE TICKER = @TKR))
INSERT @results ([date],[stddev])
SELECT x.[date], ISNULL(STDEV(y.[Close]),0) AS stdev
FROM Tickers x
JOIN Tickers y ON x.[DATE] BETWEEN DATEADD(DAY,-20,y.[DATE]) AND y.[DATE]
WHERE x.[DATE] > @min_tkrdate
AND x.[DATE] > @min_sysdate
AND x.TICKER = @TKR
AND y.TICKER = @TKR
GROUP BY x.[DATE]
SET @rowcount = @@ROWCOUNT
UPDATE @results SET [stddev] = (
SELECT [stddev] FROM @results WHERE dayno = @rowcount-1)
WHERE dayno = @rowcount
RETURN
答案 0 :(得分:4)
4.94974746848848E-02
实际上与0.0494974746848848
你确定这是错误的吗?在我看来它可能只是一个低偏差。
答案 1 :(得分:0)
同样的“d。”说过。最后两个日期的标准偏差很低,但无论如何它随着时间的推移而下降。此外,最后一个更新语句所做的就是将集合中的最后一行(最新日期)设置为倒数第二个值。 (也许“adjsut”可能是“删除”?)