Python Backtesting: SMA Crossover Strategy and Performance Metrics
Summary
The README introduces a Python framework for backtesting strategies on OHLC or OHLCV price data. Its example defines a moving-average crossover system: it buys when the shorter simple moving average crosses above the longer one and sells when the reverse crossover occurs. The backtest applies a commission and exclusive-order setting, then reports summary statistics and plots the simulated results.
The example uses historical Google price data and displays returns, risk measures, drawdowns, trade counts, and other results. Those figures describe this particular sample run; they do not demonstrate that the strategy will generalize or remain profitable with other instruments, periods, costs, or execution assumptions. The README also mentions parameter optimization, reusable strategies, detailed trade outputs, and visualizations, but provides little methodological detail on validation or preventing overfitting.
Key ideas
- The framework runs trading strategies on OHLC or OHLCV data and reports trade-level and aggregate results.
- The example buys on an upward crossover of a shorter and longer simple moving average.
- It sells when the crossover reverses and includes a commission assumption.
- The displayed performance statistics come from one historical Google sample and are not proof of future results.
- The project description includes parameter optimization, strategy utilities, and plotting features.
Tags
Full text
# README
[](https://kernc.github.io/backtesting.py/)
Backtesting.py
==============
[](https://github.com/kernc/backtesting.py/actions)
[](https://codecov.io/gh/kernc/backtesting.py)
[](https://ghloc.vercel.app/kernc/backtesting.py)
[](https://pypi.org/project/backtesting)
[](https://pypistats.org/packages/backtesting)
[](https://pypistats.org/packages/backtesting)
[](https://github.com/kernc/backtesting.py)
[](https://github.com/sponsors/kernc)
Backtest trading strategies with Python.
[**Project website**](https://kernc.github.io/backtesting.py) + [Documentation] | [YouTube]
[Documentation]: https://kernc.github.io/backtesting.py/doc/backtesting/
[YouTube]: https://www.youtube.com/results?q=%22backtesting.py%22
Installation
------------
$ pip install backtesting
Or if you prefer the bleeding edge:
$ pip install git+https://github.com/kernc/backtesting.py
Usage
-----
```python
from backtesting import Backtest, Strategy
from backtesting.lib import crossover
from backtesting.test import SMA, GOOG
class SmaCross(Strategy):
def init(self):
price = self.data.Close
self.ma1 = self.I(SMA, price, 10)
self.ma2 = self.I(SMA, price, 20)
def next(self):
if crossover(self.ma1, self.ma2):
self.buy()
elif crossover(self.ma2, self.ma1):
self.sell()
bt = Backtest(GOOG, SmaCross, commission=.002,
exclusive_orders=True)
stats = bt.run()
bt.plot()
```
Results in:
```text
Start 2004-08-19 00:00:00
End 2013-03-01 00:00:00
Duration 3116 days 00:00:00
Exposure Time [%] 94.27
Equity Final [$] 68935.12
Equity Peak [$] 68991.22
Return [%] 589.35
Buy & Hold Return [%] 703.46
Return (Ann.) [%] 25.42
Volatility (Ann.) [%] 38.43
CAGR [%] 16.80
Sharpe Ratio 0.66
Sortino Ratio 1.30
Calmar Ratio 0.77
Alpha [%] 450.62
Beta 0.02
Max. Drawdown [%] -33.08
Avg. Drawdown [%] -5.58
Max. Drawdown Duration 688 days 00:00:00
Avg. Drawdown Duration 41 days 00:00:00
# Trades 93
Win Rate [%] 53.76
Best Trade [%] 57.12
Worst Trade [%] -16.63
Avg. Trade [%] 1.96
Max. Trade Duration 121 days 00:00:00
Avg. Trade Duration 32 days 00:00:00
Profit Factor 2.13
Expectancy [%] 6.91
SQN 1.78
Kelly Criterion 0.6134
_strategy SmaCross(n1=10, n2=20)
_equity_curve Equ...
_trades Size EntryB...
dtype: object
```
[](https://kernc.github.io/backtesting.py/#example)
Find more usage examples in the [documentation].
Features
--------
* Simple, [well-documented API](https://kernc.github.io/backtesting.py/doc/backtesting/backtesting.html)
* Blazing fast execution
* Built-in [optimizer](https://kernc.github.io/backtesting.py/doc/examples/Quick%20Start%20User%20Guide.html#Optimization)
based on [SAMBO](https://sambo-optimization.github.io)
* [Library of composable base strategies](https://kernc.github.io/backtesting.py/doc/examples/Strategies%20Library.html)
and related utilities
* Indicator-library-agnostic (BYO)
* Supports _any_ financial instrument with OHLC(V) candlestick data
* [Detailed trade results](https://kernc.github.io/backtesting.py/doc/examples/Quick%20Start%20User%20Guide.html#Trade-data)
provided as simple Series/DataFrame objects
* [Interactive visualizations](https://kernc.github.io/backtesting.py/#example)

Bugs
----
Before reporting bugs or posting to the
[discussion board](https://github.com/kernc/backtesting.py/discussions),
please read [contributing guidelines](CONTRIBUTING.md), particularly the section
about crafting useful bug reports and ```` ``` ````-fencing your code.
The maintainers thank you!
Alternatives
------------
See [alternatives.md] for a list of alternative Python
backtesting frameworks and related packages.
[alternatives.md]: https://github.com/kernc/backtesting.py/blob/master/doc/alternatives.mdShown in full with attribution under the source's licence. Licence: AGPL-3.0
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.