Ken, Thanks for the code.
I have a use for StDev of noncontinuous data as part of "inline metrics" so I was following your thread and I also diverted to see what I could come up with. It turns out your restatement of the StDev equation was just what I needed: > A = (GainUpSq) / UpDays; > B = (GainUpSum / UpDays)^2; > SdUp = sqrt(A - B); I was using StDev == SqRt (Sum variance^2/N) and having some challenges with it so you saved the day. If you came up with that by yourself you must be quite handy a math - I doubt if I could have figured that one. Thanks - nice work. brian_z --- In [email protected], "Ken Close" <[EMAIL PROTECTED]> wrote: > > Someone asked me to share the code I got running to calculate non- continuous > standard deviations. You may recall that my application was to find the > StDev of any month in which the total gain for the month was positive. > > I made an extract of the code for your use and education, although I must > warn that while it calculates the numbers correctly for the symbols and > ranges I have tested it on, it exhibits some behavior that I am unable to > explain. I am nervous about code with unexplained results, even if the > calculations I am interested in are produced accurately. I will describe > this problem in a moment. > > The code, copied below, will produce the correct calculations for daily > symbols and will determine the StDev for days where the one day ROC is > positive and the same for when it is negative. I have left all of the > intermediate calculation columns visible in the AA window for your > inspection. You can obviously delete these or hide them and only display the > data you want to see. You can obviously change the non-continuous variable > from the one day ROC. > > The interesting and unexplained happening requires a look into the code. > For those interested, if you look under the loop section for the negative > ROC calculation, you will see a variable line like this: > NumDn[FirstBar -1] = 0; > > This (obviously) initializes the array NumDn. However, NumDn is not used > anywhere in any subsequent line of calculation. But!! If I delete this > line or comment it out, then the calculation for GainDnSq (initialized in > the very next line) disappears and its array becomes {Empty}. Reinstate the > NumDn variable and the calculation for GainDnSq completes as it should. I > have not discovered the answer to this puzzle and those of you who see it, > let me know if you figure it out. It may have to do with cached values and > variables in memory. > > Anyway, here is the code: It is a standalone code and should run (watch out > for line breaks in your email window). Do a symtax check before trying to > run it. > Ken > > > // NonContinuousStDev.afl KSC > // Purpose: to calculate the StDev of non-continuous data such as all of the > // positive daily ROC values > // Establish a testing period > StartDate = ParamDate("StartDate","12/31/2007"); > EndDate = ParamDate("EndDate","06/30/2008"); > BIR = IIf(Status("BarInRange") > 0, 1, 0); > FirstBar = LastValue(ValueWhen(Status("FirstBarInRange") > 0, Cum (1))); > LastBar = LastValue(ValueWhen(Status("LastBarInRange") > 0, Cum (1))); > AllDates = DateNum(); > Per1 = BarsSince(AllDates == StartDate)+1; > // Calculate the non-continuous data > Gain = ROC(C,1); > UpDays = Sum(IIf(Gain > 0, 1, 0),Per1); > DnDays = Sum(IIf(Gain < 0, 1, 0),Per1); > PCUp = UpDays / (UpDays + DnDays); > // Routine to calculate StdDev of Positive Monthly Gains > GainUpSq[FirstBar-1] = 0; > GainUpSum[FirstBar-1] = 0; > for (k=FirstBar-1; k < LastBar ; k++ ) > { > if (Gain[k] > 0) > { > GainUpSum[k] = GainUpSum[k-1] + Gain[k]; > GainUpSq[k] = GainUpSq[k-1] + (Gain[k])^2; > } > else > { > GainUpSum[k] = GainUpSum[k-1]; > GainUpSq[k] = GainUpSq[k-1]; > } > } > A = (GainUpSq) / UpDays; > B = (GainUpSum / UpDays)^2; > SdUp = sqrt(A - B); > // Routine to calculate StdDev of Negative Monthly Gains > // k = BarNo; > NumDn[FirstBar-1] = 0; > GainDnSq[FirstBar-1] = 0; > GainDnSum[FirstBar-1] = 0; > for (k=FirstBar-1; k < LastBar ; k++ ) > { > if (Gain[k] < 0) > { > GainDnSum[k] = GainDnSum[k-1] - Gain[k]; > GainDnSq[k] = GainDnSq[k-1] + (Gain[k])^2; > } > else > { > GainDnSum[k] = GainDnSum[k-1]; > GainDnSq[k] = GainDnSq[k-1]; > } > } > > > > AD = Nz((GainDnSq) / DnDays); > BD = Nz((GainDnSum / DnDays))^2; > SdDn = sqrt(Nz(AD - BD)); > > PercentUpDays = 100 * (UpDays / (UpDays + DnDays)); > > Filter = Status("lastBarinRange"); > Filter = 1; > Cd = colorDefault; > AddColumn(C,"Price",1.2,Cd,Cd,80); > AddColumn(Gain,"Gain",1.2,Cd,Cd,80); > AddColumn(Per1,"TotalDays",1.0,Cd,Cd,90); > AddColumn(UpDays,"UpDays",1.0,Cd,Cd,90); > AddColumn(100 * PCUp,"PCentUpDays",1.2); > AddColumn(GainUpSum,"GainUpSum",1.2,Cd,Cd,110); > AddColumn(GainUpSq,"GainUpSq",1.2,Cd,Cd,110); > AddColumn(A,"A",1.2,Cd,Cd,110); > AddColumn(B,"B",1.2,Cd,Cd,110); > AddColumn(SdUp,"Stndev Up Gains",1.2,Cd,Cd,120); > AddColumn(DnDays,"DnDays",1.0,Cd,Cd,90); > AddColumn(GainDnSum,"GainDnSum",1.2,Cd,Cd,110); > AddColumn(GainDnSq,"GainDnSq",1.2,Cd,Cd,110); > AddColumn(AD,"AD",1.2,Cd,Cd,110); > AddColumn(BD,"BD",1.2,Cd,Cd,110); > AddColumn(SdDn,"Stndev Down Gains",1.2,Cd,Cd,120); >
