Saturday, September 11, 2010

Running Sum

We've covered Running SMAs and EMAs...let's dig into Running Sums or often called Running Totals. Formula as follows:
\(Sum_{today} = Sum_{yesterday} + (price_{today} - price_{today - period})\)

Where \( price_{today - period} \) represents the price that is dropping off the slice you are summing. For example:

Take a list of numbers = 20, 40, 60, 80, 100, 120.
The formula for the 3-bar running sum would be:
bar 1: 20
bar 2: 20 + 40 = 60
bar 3: 20 + 40 + 60 = 120
bar 4: 40 + 60 + 80 = 180
Or we can apply our formula from above as \( Sum_{today} = 120 + (80 - 20) \)
bar 5: 60 + 80 + 100 = 240
Or use formula of \( Sum_{today} = 180 + (100 - 40) \)
bar 6: 80 + 100 + 120 = 300
Or use formula of \( Sum_{today} = 240 + (120 - 60) \)

Coding in Python we get:
def running_sum(bar, series, period, pval=None):
    """
    Returns the running sum of values in a list of tuple - avoids summing
    entire series on each call.

    Keyword arguments:
    bar     --  current index or location of the value in the series
    series  --  list or tuple of data to sum
    period  -- number of values to include in sum
    pval    --  previous sum (n - 1) of the series.
    """
    if period < 1:
        raise ValueError("period must be 1 or greater")

    if bar <= 0:
        return series[0]

    if bar < period:
        return pval + series[bar]
    
    return pval + (series[bar] - series[bar - period])
Example call and results:
list_of_values = [20, 40, 60, 80, 100, 120]
prevsum = list_of_values[0]   #first sum is the first value in the series.

for bar, price in enumerate(list_of_values):
    newsum = running_sum(bar, list_of_values, 3, pval=prevsum)
    print "bar %i: %i" % (bar, newsum)
    prevsum = newsum

----------------------------------------------------------
bar 0: 20
bar 1: 60
bar 2: 120
bar 3: 180
bar 4: 240
bar 5: 300

Sunday, August 08, 2010

Portfolio Performance for July 2010

One thing I've noticed in trading systems over the years is the observer effect. Typically, when a thoroughly backtested system fails...the trader will dismiss the system as being too optimized.


You never hear about the observer effect with real-time trading of the system. That is probably the most difficult aspect of developing systems. Just the mere fact of participating in the price pattern you've discovered changes the price pattern. Despite how small a fish you may be in the market.

All we can hope for as system traders is finding an edge that is large enough to accommodate the increased order flow. So, when we jump in and reduce the edge...there is still enough leftover for us to be profitable. I guess, that is why I've always traded very long-term systems. And probably why I still lack confidence in this new short-term mean-reversion system.

Moving on...

July was an excellent month for the market. The portfolio was trounced. But, still finished the month with another positive number. This marks the second month trading the new system.

Adding a new chart to the reporting: Investment Levels. This reflects the amount of capital that TaylorTree is invested at the end of the month. As you can see, when the portfolio is less than 100% invested in the market and the market has a month like this one...it is extremely difficult to beat it. Cash drag kills you when the market turns around.
TaylorTree Investment Levels as of 07/2010

The picture above of the alligator is from our stay at The Retreat at Artesian Lakes located just outside Cleveland, TX. They had several cabins overlooking the lakes. Step out on your front porch and this 6ft alligator would come swimming up - day or night.

Later Trades,

MT

Saturday, August 07, 2010

New Books

Received 2 books today:

I first heard about John Allspaw from his excellent slides, Ops Meta-Metrics. When I found out he had a book covering capacity planning...well, had to buy it.

Jeffrey MA was the the basis for the main character in the fun book, Bringing Down the House. I'm a stats junkie...so any book covering stats and business is a must-read for yours truly.

MT

Sunday, August 01, 2010

Exponential Moving Average (EMA)

Now that we've tackled Running Simple Moving Averages (SMA)...let's move on to Exponential Moving Averages (EMA). You may wonder why we're not covering Running Exponential Moving Averages? The default formula for EMA is the running method - so we're already covered.

Check out the posts below to understand the background on Exponential Moving Averages (EMA) and their calculation. Be careful with using EMAs in your backtesting. Or any of these running type of indicators. Since all of them require a starting value. If that starting value changes - your signals change. Which can happen if you switch price quote providers that have different history requirements. Should not be a big deal but something to be aware of.

Let's begin. We need to calculate our smoothing factor for the time series. Typical use in technical analysis is:
\( \alpha = 2.0 / (periods + 1.0) \)

We can use any value between 0 & 1 for the smoothing factor. Closer to one is less smooth and places greater weight on the more recent values. Use a value of 1 and you get the most recent value back. Closer to zero is more smooth and places greater weight on the older values.

Now, the formula for an EMA given our smoothing factor:
\( EMA_{today} = EMA_{yesterday} + \alpha(price_{today} - EMA_{yesterday}) \)

Coding in Python we get:
def ema(bar, series, period, prevma, smoothing=None):
    '''Returns the Exponential Moving Average of a series.

    Keyword arguments:
    bar         -- currrent index or location of the series
    series      -- series of values to be averaged
    period      -- number of values in the series to average
    prevma      -- previous exponential moving average
    smoothing   -- smoothing factor to use in the series.
        valid values: between 0 & 1.
        default: None - which then uses formula = 2.0 / (period + 1.0)
        closer to 1 to gives greater weight to recent values - less smooth
        closer to 0 gives greater weight to older values -- more smooth
    '''
    if period < 1:
        raise ValueError("period must be 1 or greater")

    if smoothing:
        if (smoothing < 0) or (smoothing > 1.0):
            raise ValueError("smoothing must be between 0 and 1")

    else:
        smoothing = 2.0 / (period + 1.0)

    if bar <= 0:
        return series[0]

    elif bar < period:
        return cumulative_sma(bar, series, prevma)

    return prevma + smoothing * (series[bar] - prevma)


def cumulative_sma(bar, series, prevma):
    """
    Returns the cumulative or unweighted simple moving average.
    Avoids averaging the entire series on each call.

    Keyword arguments:
    bar     --  current index or location of the value in the series
    series  --  list or tuple of data to average
    prevma  --  previous average (n - 1) of the series.
    """

    if bar <= 0:
        return series[0]

    else:
        return prevma + ((series[bar] - prevma) / (bar + 1.0))


Example call and results using the typical smoothing factor of 2 / (period + 1):
prices = [32.47, 32.70, 32.77, 33.11, 33.25, 33.23, 33.23, 33.0, 33.04, 33.21]
period = 5   #number of bars to average
prevsma = prevema = prices[0]   #1st day nothing to average

for bar, close in enumerate(prices):
    currentema = ema(bar, prices, period, prevema, smoothing=None)

    #running_sma defined in simple moving average blog post
    currentsma = running_sma(bar, prices, period, prevsma)

    print "Day %02d Value=%.2f %i-bar SMA=%f and EMA=%f" % (bar + 1, close, period, currentsma, currentema)
    prevema = currentema
    prevsma = currentsma

----------------------------------------------------------
Results of call:

Day 01 Value=32.47 5-day SMA=32.470000 and EMA=32.470000
Day 02 Value=32.70 5-day SMA=32.585000 and EMA=32.585000
Day 03 Value=32.77 5-day SMA=32.646667 and EMA=32.646667
Day 04 Value=33.11 5-day SMA=32.762500 and EMA=32.762500
Day 05 Value=33.25 5-day SMA=32.860000 and EMA=32.860000
Day 06 Value=33.23 5-day SMA=33.012000 and EMA=32.983333
Day 07 Value=33.23 5-day SMA=33.118000 and EMA=33.065556
Day 08 Value=33.00 5-day SMA=33.164000 and EMA=33.043704
Day 09 Value=33.04 5-day SMA=33.150000 and EMA=33.042469
Day 10 Value=33.21 5-day SMA=33.142000 and EMA=33.098313

Sunday, July 11, 2010

Portfolio Performance for June 2010

"Time flies like an arrow; fruit flies like a banana" -- Groucho Marx


My how the months have zoomed by. As you can see from the site; I moved from blogger to wordpress. Haven't had the time to do much with the old posts. Most likely I will leave them as is and start from a clean slate. The most important posts anyway are of the portfolio performance and this post will take care of what's happening there.


You can see in the Figure 1 - VAMI; the portfolio is doing well...breaking free from the market. The main reason for this is a new trading system was added on June 1st. This trading system is a short-term mean-reversion system. It is doing as expected but taking some time to get used to. I've spent the better part of 10 years trading a long-term trend-following system. So, moving to a short-term mean-reversion system is going to take some adjustments on my part.



Again, all the charts show the portfolio breaking away from the market. June was a nasty month for the S&P 500...while the portfolio held its own. I feel I still have some work to do on the new system such as the proper risk allocation and determining a better weight for the systems in the portfolio. Also, the new system still has quite a bit of beta that I'd like to scale down. But, overall, a nice start.


On a personal note, I'm back from my yearly pilgrimage to Texas to see family & friends. Trip was good but volatile like the market.

We had to evacuate due to Hurricane Alex in the Gulf - almost lost our car.


Picture above is the day prior to the effects of Hurricane Alex.

And our transmission acted up on our stop at Broken Bow, OK - I'm guessing due to all the hill climbing.


I couldn't get over how clear the water was and the beautiful pine-lined hills surrounding the lake.

We had to cut our losses short in both of the places we would have liked to spend more time. Managing risk vs reward...being a portfolio manager is a 24x7 job.

Later Trades,

MT

Sunday, June 20, 2010

Moving to Wordpress - change your feeds

I've moved to Wordpress away from Blogger. Please change your RSS subscription feeds for this site to the following:

http://taylortree.com/feed/

And please check to see if your bookmark to the main page is working correctly. Should be: http://www.taylortree.com/

I'm not going to migrate all the Blogger posts to Wordpress. I've changed so much over the years...time for a fresh start.

Thanks,

MT

Running Simple Moving Average (SMA)

When building a platform to test trading ideas...one of the big issues to deal with is all the indicators that require a spin through the price series in order to calculate. For example, in order to calculate the 200 day simple moving average (SMA) of closing prices for Google today you would have to loop back 200 - 1 days ago and sum the closing prices and divide by 200.

When you are backtesting an idea you often need to start from day 1 of a stock's trading history and loop forward to the most current day. In essence, pretending each day is the current day at that point in time. Thus, you are looping back 200 - 1 data points for each day in the series. This isn't such a big deal with a stock such as Google whose trading history is rather limited (2004). But, take a stock like IBM with a more extensive trading history and your code is going to bog down with each call to the SMA indicator. Throw 20,000 securities into your backtest and the looping adds up.

Therefore, running calculations are the preferred method in order to spin just once through the data points. So, in order to calculate the running simple moving average for closing prices you apply the following formula:
\(SMA_{today} = SMA_{yesterday} + ((Price_{today} - Price_{today - n}) /n)\)
Where
  • \(n\) = number of values included in your rolling computational window.
Straight-forward and avoids the loop. Here's the sample Python code for the Running SMA:
def cumulative_sma(bar, series, prevma):
    """
    Returns the cumulative or unweighted simple moving average.
    Avoids sum of series per call.

    Keyword arguments:
    bar     --  current index or location of the value in the series
    series  --  list or tuple of data to average
    prevma  --  previous average (n - 1) of the series.
    """
   
    if bar <= 0:
        return series[0]

    return prevma + ((series[bar] - prevma) / (bar + 1.0))
def running_sma(bar, series, period, prevma):
    """
    Returns the running simple moving average - avoids sum of series per call.

    Keyword arguments:
    bar     --  current index or location of the value in the series
    series  --  list or tuple of data to average
    period  --  number of values to include in average
    prevma  --  previous simple moving average (n - 1) of the series
    """

    if period < 1:
        raise ValueError("period must be 1 or greater")

    if bar <= 0:
        return series[0]

    elif bar < period:
        return cumulative_sma(bar, series, prevma)

    return prevma + ((series[bar] - series[bar - period]) / float(period))
And the example call and results:
prices = [10, 15, 25, 18, 13, 16]
prevsma = prices[0]   #1st day nothing to average so return itself.
for bar, close in enumerate(prices):
    currentsma = running_sma(bar, prices, 3, prevsma)
    print "Today's 3-day SMA = %.4f" % currentsma
    prevsma = currentsma

------- Results ----------------
Today's 3-day SMA = 10.0000
Today's 3-day SMA = 12.5000
Today's 3-day SMA = 16.6667
Today's 3-day SMA = 19.3333
Today's 3-day SMA = 18.6667
Today's 3-day SMA = 15.6667

Sunday, May 30, 2010

Russell 3000 Weekly Stats (05/24/10-05/28/10)

Key Figures Russell 3000 IWV
Total Active Components2961 1
Total New Listings this period0 0
Total Inactive this period1 0
# All-time Closing Highs 28 (0.19%) 0 (0.00%)
# All-time Closing Lows 87 (0.59%) 0 (0.00%)

# Higher Closes 6755 (45.63%) 2 (40.00%)
# Lower Closes 7775 (52.52%) 3 (60.00%)

Total Gains/Losses $1059.55 (0.28%) $0.45 (0.14%)
Average True Range (4.59%) (2.51%)

* Results are cumulative for the period.

Price verification found 0 errors

Friday, May 28, 2010

Russell 3000 Daily Stats (05/28/10)

Key Figures Russell 3000 IWV
Total Active Components2961 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 10 (0.34%) 0 (0.00%)
# All-time Closing Lows 6 (0.20%) 0 (0.00%)

# Higher Closes 508 (17.16%) 0 (0.00%)
# Lower Closes 2402 (81.12%) 1 (100.00%)

Total Gains/Losses $-1023.98 (-1.33%) $-0.72 (-1.10%)
Average True Range (3.77%) (1.66%)

* Results are cumulative for the period.

Price verification found 0 errors

Thursday, May 27, 2010

Russell 3000 Daily Stats (05/27/10)

Key Figures Russell 3000 IWV
Total Active Components2961 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 9 (0.30%) 0 (0.00%)
# All-time Closing Lows 4 (0.14%) 0 (0.00%)

# Higher Closes 2876 (97.13%) 1 (100.00%)
# Lower Closes 65 (2.20%) 0 (0.00%)

Total Gains/Losses $2892.48 (3.90%) $2.25 (3.55%)
Average True Range (5.27%) (3.57%)

* Results are cumulative for the period.

Price verification found 0 errors

Wednesday, May 26, 2010

Russell 3000 Daily Stats (05/26/10)

Key Figures Russell 3000 IWV
Total Active Components2961 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 2 (0.07%) 0 (0.00%)
# All-time Closing Lows 22 (0.74%) 0 (0.00%)

# Higher Closes 1549 (52.31%) 0 (0.00%)
# Lower Closes 1341 (45.29%) 1 (100.00%)

Total Gains/Losses $196.08 (0.26%) $-0.29 (-0.46%)
Average True Range (4.70%) (2.40%)

* Results are cumulative for the period.

Price verification found 0 errors

Tuesday, May 25, 2010

Russell 3000 Daily Stats (05/25/10)

Key Figures Russell 3000 IWV
Total Active Components2961 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 5 (0.17%) 0 (0.00%)
# All-time Closing Lows 32 (1.08%) 0 (0.00%)

# Higher Closes 1206 (40.73%) 1 (100.00%)
# Lower Closes 1682 (56.81%) 0 (0.00%)

Total Gains/Losses $-111.54 (-0.15%) $0.04 (0.06%)
Average True Range (5.27%) (3.32%)

* Results are cumulative for the period.

Price verification found 0 errors

Monday, May 24, 2010

Russell 3000 Daily Stats (05/24/10)

Key Figures Russell 3000 IWV
Total Active Components2961 1
Total New Listings this period0 0
Total Inactive this period1 0
# All-time Closing Highs 3 (0.10%) 0 (0.00%)
# All-time Closing Lows 24 (0.81%) 0 (0.00%)

# Higher Closes 615 (20.77%) 0 (0.00%)
# Lower Closes 2285 (77.17%) 1 (100.00%)

Total Gains/Losses $-844.58 (-1.13%) $-0.83 (-1.29%)
Average True Range (3.97%) (1.60%)

* Results are cumulative for the period.

Price verification found 0 errors

Sunday, May 23, 2010

Russell 3000 Weekly Stats (05/17/10-05/21/10)

Key Figures Russell 3000 IWV
Total Active Components2964 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 26 (0.18%) 0 (0.00%)
# All-time Closing Lows 81 (0.55%) 0 (0.00%)

# Higher Closes 4927 (33.25%) 1 (20.00%)
# Lower Closes 9619 (64.91%) 4 (80.00%)

Total Gains/Losses $-4073.13 (-1.05%) $-3.06 (-0.92%)
Average True Range (5.11%) (3.10%)

* Results are cumulative for the period.

Price verification found 0 errors

Friday, May 21, 2010

Russell 3000 Daily Stats (05/21/10)

Key Figures Russell 3000 IWV
Total Active Components2962 1
Total New Listings this period0 0
Total Inactive this period2 0
# All-time Closing Highs 1 (0.03%) 0 (0.00%)
# All-time Closing Lows 18 (0.61%) 0 (0.00%)

# Higher Closes 2218 (74.88%) 1 (100.00%)
# Lower Closes 682 (23.02%) 0 (0.00%)

Total Gains/Losses $1160.92 (1.57%) $0.96 (1.51%)
Average True Range (5.87%) (3.78%)

* Results are cumulative for the period.

Price verification found 0 errors

Thursday, May 20, 2010

Russell 3000 Daily Stats (05/20/10)

Key Figures Russell 3000 IWV
Total Active Components2964 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 1 (0.03%) 0 (0.00%)
# All-time Closing Lows 30 (1.01%) 0 (0.00%)

# Higher Closes 42 (1.42%) 0 (0.00%)
# Lower Closes 2907 (98.08%) 1 (100.00%)

Total Gains/Losses $-3449.92 (-4.45%) $-2.58 (-3.91%)
Average True Range (5.87%) (3.94%)

* Results are cumulative for the period.

Price verification found 0 errors

Wednesday, May 19, 2010

Russell 3000 Daily Stats (05/19/10)

Key Figures Russell 3000 IWV
Total Active Components2964 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 3 (0.10%) 0 (0.00%)
# All-time Closing Lows 16 (0.54%) 0 (0.00%)

# Higher Closes 620 (20.92%) 0 (0.00%)
# Lower Closes 2273 (76.69%) 1 (100.00%)

Total Gains/Losses $-747.23 (-0.96%) $-0.49 (-0.74%)
Average True Range (4.30%) (2.28%)

* Results are cumulative for the period.

Price verification found 0 errors

Tuesday, May 18, 2010

Russell 3000 Daily Stats (05/18/10)

Key Figures Russell 3000 IWV
Total Active Components2964 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 5 (0.17%) 0 (0.00%)
# All-time Closing Lows 8 (0.27%) 0 (0.00%)

# Higher Closes 378 (12.75%) 0 (0.00%)
# Lower Closes 2531 (85.39%) 1 (100.00%)

Total Gains/Losses $-1251.13 (-1.57%) $-0.94 (-1.39%)
Average True Range (4.76%) (2.89%)

* Results are cumulative for the period.

Price verification found 0 errors

Monday, May 17, 2010

Russell 3000 Daily Stats (05/17/10)

Key Figures Russell 3000 IWV
Total Active Components2964 1
Total New Listings this period0 0
Total Inactive this period0 0
# All-time Closing Highs 16 (0.54%) 0 (0.00%)
# All-time Closing Lows 9 (0.30%) 0 (0.00%)

# Higher Closes 1669 (56.31%) 0 (0.00%)
# Lower Closes 1227 (41.40%) 1 (100.00%)

Total Gains/Losses $210.44 (0.27%) $-0.01 (-0.01%)
Average True Range (4.75%) (2.61%)

* Results are cumulative for the period.

Price verification found 0 errors

Sunday, May 16, 2010

Russell 3000 Weekly Stats (05/10/10-05/14/10)

Key Figures Russell 3000 IWV
Total Active Components2965 1
Total New Listings this period0 0
Total Inactive this period3 0
# All-time Closing Highs 110 (0.74%) 0 (0.00%)
# All-time Closing Lows 13 (0.09%) 0 (0.00%)

# Higher Closes 8331 (56.20%) 2 (40.00%)
# Lower Closes 6245 (42.13%) 3 (60.00%)

Total Gains/Losses $3634.27 (0.91%) $1.88 (0.55%)
Average True Range (4.86%) (2.63%)

* Results are cumulative for the period.

Price verification found 0 errors