Warming Up Exponential Moving Averages Before Trading
Summary
This educational example shows why an algorithm may need historical data before acting on live or simulated updates. It subscribes to second-resolution SPY data, creates fast and slow exponential moving averages, and requests enough warmup history for the slower indicator. The algorithm waits until warmup ends before logging each indicator's sample count, then holds a long position when the fast average is above the slow average and a short position otherwise.
The example demonstrates indicator initialization and a basic moving-average comparison, rather than evaluating a complete trading strategy. It includes no reported backtest performance, transaction costs, or risk controls, and the short historical date range and fixed indicator periods do not establish that the trading rule is effective. The useful lesson is that indicator-based decisions should be delayed until the required history has populated the indicators; the position rule itself remains a minimal demonstration.
Key ideas
- The algorithm requests historical warmup data before acting on indicator values.
- Warmup length is set to the slow exponential moving average's period.
- After warmup, the fast and slow averages determine whether the algorithm holds long or short.
- The example illustrates initialization mechanics but provides no evidence that its trading rule is profitable.
Tags
Full text
# WarmupAlgorithm
# WarmupAlgorithm
Demonstration algorithm for the Warm Up feature with basic indicators.
## Source (Apache-2.0)
```python
# QUANTCONNECT.COM - Democratizing Finance, Empowering Individuals.
# Lean Algorithmic Trading Engine v2.0. Copyright 2014 QuantConnect Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from AlgorithmImports import *
### <summary>
### Demonstration algorithm for the Warm Up feature with basic indicators.
### </summary>
### <meta name="tag" content="indicators" />
### <meta name="tag" content="warm up" />
### <meta name="tag" content="history and warm up" />
### <meta name="tag" content="using data" />
class WarmupAlgorithm(QCAlgorithm):
def initialize(self):
'''Initialise the data and resolution required, as well as the cash and start-end dates for your algorithm. All algorithms must initialized.'''
self.set_start_date(2013,10,8) #Set Start Date
self.set_end_date(2013,10,11) #Set End Date
self.set_cash(100000) #Set Strategy Cash
# Find more symbols here: http://quantconnect.com/data
self.add_equity("SPY", Resolution.SECOND)
fast_period = 60
slow_period = 3600
self.fast = self.ema("SPY", fast_period)
self.slow = self.ema("SPY", slow_period)
self.set_warmup(slow_period)
self.first = True
def on_data(self, data):
'''OnData event is the primary entry point for your algorithm. Each new data point will be pumped in here.'''
if self.first and not self.is_warming_up:
self.first = False
self.log("Fast: {0}".format(self.fast.samples))
self.log("Slow: {0}".format(self.slow.samples))
if self.fast.current.value > self.slow.current.value:
self.set_holdings("SPY", 1)
else:
self.set_holdings("SPY", -1)
```Shown in full with attribution under the source's licence. Licence: Apache-2.0
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.