hist_qry6.sql

(Based on hist_qry5.sql.) Finds the points (specific days) when the 5-day moving average intersects the 21-day moving average for these stocks.

The Output is sorted by TRADING_SYMBOL and trade date.

Output

The results returned by this query are similar to the following 25 rows:

TRADING_SYMBOL  TRADE_DATE      DAY_5     DAY_21   PREV_DAY5   PREV_DAY21
AAG             2012-06-04    71.6416    71.7977     71.8916      71.8238
ABI             2012-06-04   303.3733   301.6436    300.4533     301.4476
ABX             2012-06-04     1264.2  1260.7418     1258.16    1259.9085
ACD             2012-06-04      171.7   170.2854      169.16     169.8628
ACP             2012-06-04   103.3083   103.0081    102.2816       102.79
AGT             2012-06-04     855.95    889.129      952.56     915.4057
AHS             2012-06-04     1156.5  1157.2772   1158.6666    1157.4333
AIC             2012-06-04    412.875   412.1018      410.85     411.6085
AJE             2012-06-04   140.5466   140.5545    141.2666     140.7352
AKA             2012-06-04      41.64    41.5381       41.44       41.478
AKU             2012-06-04    804.225   801.3395       798.9     800.4385
ALE             2012-06-04   138.6116   137.6359     136.535     137.2133
ALO             2012-06-04     484.44   483.0109    479.6133     481.9047
AML             2012-06-04     272.68   272.4145    271.3333     272.3161
AOC             2012-06-04   519.5166   543.8159     579.775     559.9976
APZ             2012-06-04   272.6916   272.2113    270.4333     271.6261
AQQ             2012-06-04  1034.8333  1031.1181   1026.4333    1030.2333
AQT             2012-06-04     126.89     125.79      125.21     125.4542
ARD             2012-06-04  1074.6266    1072.01   1067.5866    1070.8709
ARU             2012-06-04   1013.475  1063.6445     1136.64    1095.3428
ASA             2012-06-04      406.4   405.4436    405.1466     405.3485
ASH             2012-06-04     310.75    309.499      306.65     308.8228
ATF             2012-06-04   550.7866    550.269      549.92     550.3809
ATK             2012-06-04   136.2716     137.43    137.6833     137.5733
ATQ             2012-06-04    42.1333    42.3045       42.35       42.319
...
Note:

The output displayed in this section is derived by running the query with the large set of sample data provided in the Sybase RAP Samples component.

SQL Statements

The SQL statements for this query are:

--(Based on the previous query) Find the points (specific days) when the
--5-day moving average intersects the 21-day moving average for these stocks.
--The output is to be sorted by INSTRUMENT_ID and date.

truncate table hist_temp;
truncate table hist6_temp;
commit;

insert hist_temp
SELECT number(),B.INSTRUMENT_ID, B.TRADING_SYMBOL, B.TRADE_DATE,B.CLOSE_PRICE,
IFNULL(sum(A.SPLIT_FACTOR),1,sum(A.SPLIT_FACTOR)) 
FROM STOCK_HISTORY AS B
left outer join SPLIT_EVENT as A
on B.INSTRUMENT_ID = A.INSTRUMENT_ID
AND B.TRADE_DATE < A.EFFECTIVE_DATE 
WHERE B.TRADING_SYMBOL BETWEEN 'AAA' AND 'BML'
AND LENGTH(B.TRADING_SYMBOL) = 3
and B.TRADE_DATE >= DATEADD(DAY,-28,'2012-06-01')
and B.TRADE_DATE <= '2012-12-01'
GROUP BY B.INSTRUMENT_ID,TRADING_SYMBOL,
B.TRADE_DATE, B.CLOSE_PRICE
ORDER BY B.INSTRUMENT_ID,
B.TRADE_DATE;

Insert hist6_temp
SELECT number(),x.INSTRUMENT_ID, x.TRADING_SYMBOL, x.TRADE_DATE, avg_5day,
avg_21day
FROM (SELECT B.INSTRUMENT_ID, B.TRADING_SYMBOL, B.TRADE_DATE,
AVG(C.CLOSE_PRICE * B.SPLIT_FACTOR)  avg_5day
FROM hist_temp as B
left outer join hist_temp as C
on B.INSTRUMENT_ID = C.INSTRUMENT_ID
and c.row_nbr BETWEEN b.row_nbr - 5 and b.row_nbr 
Where B.TRADE_DATE >= '2012-06-01'
GROUP BY B.INSTRUMENT_ID, B.TRADING_SYMBOL,
B.TRADE_DATE) x,
(SELECT B.INSTRUMENT_ID, B.TRADING_SYMBOL, B.TRADE_DATE,
AVG(C.CLOSE_PRICE * B.SPLIT_FACTOR) avg_21day
FROM hist_temp as B
left outer join hist_temp as C
on B.INSTRUMENT_ID = C.INSTRUMENT_ID
and c.row_nbr BETWEEN b.row_nbr - 21 and b.row_nbr 
Where B.TRADE_DATE >= '2012-06-01'
GROUP BY B.INSTRUMENT_ID,B.TRADING_SYMBOL,
B.TRADE_DATE) y
where x.INSTRUMENT_ID = y.INSTRUMENT_ID
and x.TRADE_DATE = y.TRADE_DATE
order by x.INSTRUMENT_ID, x.TRADE_DATE;


select z.TRADING_SYMBOL, z.TRADE_DATE, DAY_5, DAY_21, PREV_DAY5, PREV_DAY21
from (SELECT a.INSTRUMENT_ID, a.TRADING_SYMBOL, a.TRADE_DATE,  avg(b.avg_21day) as prev_day21
from hist6_temp a, hist6_temp b
where a.INSTRUMENT_ID = b.INSTRUMENT_ID
and b.row_nbr between a.row_nbr - 2 and a.row_nbr - 1
group by a.INSTRUMENT_ID, a.TRADING_SYMBOL, a.TRADE_DATE) x,
(SELECT a.INSTRUMENT_ID, a.TRADING_SYMBOL, a.TRADE_DATE,  avg(b.avg_5day) as prev_day5
from hist6_temp a, hist6_temp b
where a.INSTRUMENT_ID = b.INSTRUMENT_ID
and b.row_nbr between a.row_nbr - 2 and a.row_nbr - 1
group by a.INSTRUMENT_ID, a.TRADING_SYMBOL, a.TRADE_DATE) y,
(SELECT INSTRUMENT_ID, TRADING_SYMBOL, TRADE_DATE, avg_5day as day_5, avg_21day as day_21
from hist6_temp) z
where z.INSTRUMENT_ID = x.INSTRUMENT_ID
and z.TRADE_DATE = x.TRADE_DATE
and z.INSTRUMENT_ID = y.INSTRUMENT_ID
and z.TRADE_DATE = y.TRADE_DATE
and sign(day_21-day_5) * sign(prev_day21-prev_day5) < 0;


Created March 26, 2009. Send feedback on this help topic to Sybase Technical Publications: pubs@sybase.com