Skip to content
Permalink
Browse files

REF: Add `Straetgy.data.<array>.to_series()` method

  • Loading branch information...
kernc committed Jan 15, 2019
1 parent 7711732 commit b157c48a3ca5b1bcfa9b8cd18a08afad74f9f4c5
@@ -2,6 +2,7 @@
from numbers import Number

import numpy as np
import pandas as pd


def _as_str(value):
@@ -52,6 +53,9 @@ def __float__(self):
except IndexError:
return super().__float__()

def to_series(self):
return pd.Series(self, index=self._opts['data'].index, name=self.name)


class _Indicator(_Array):
pass
@@ -231,7 +231,9 @@ def data(self) -> _Data:
`backtesting.backtesting.Backtest` internally),
the last array value (e.g. `data.Close[-1]`)
is always the _most recent_ value.
* If you need data arrays (e.g. `data.Close`) to be indexed
Pandas series, you can call their `.to_series()` method
(e.g. `data.Close.to_series()`).
"""
return self._data

@@ -22,7 +22,7 @@

from .backtesting import Strategy
from ._plotting import plot_heatmaps as _plot_heatmaps
from ._util import _Indicator, _as_str
from ._util import _Array, _Indicator, _as_str


OHLCV_AGG = OrderedDict((
@@ -175,9 +175,7 @@ class System(Strategy):
def init(self):
# Strategy exposes `self.data` as raw NumPy arrays.
# Let's convert closing prices back to pandas Series.
close = pd.Series(self.data.Close,
index=self.data.index,
name='Close')
close = self.data.Close.to_series()
# Resample to daily resolution. Aggregate groups
# using their last value (i.e. closing price at the end
@@ -200,9 +198,9 @@ def SMA(series, n):
"""
if not isinstance(series, pd.Series):
series = pd.Series(series,
index=series._opts['data'].index,
name=series.name)
assert isinstance(series, _Array), \
'resample_apply() takes either a `pd.Series` or a `Strategy.data.*` array'
series = series.to_series()

resampled = series.resample(rule, label='right').agg('last').dropna()
resampled.name = _as_str(series) + '[' + rule + ']'
@@ -456,7 +456,7 @@ def test_plot_heatmaps(self):
def test_SignalStrategy(self):
class S(SignalStrategy):
def init(self):
sma = pd.Series(self.data.Close).rolling(10).mean()
sma = self.data.Close.to_series().rolling(10).mean()
self.set_signal(self.data.Close > sma,
self.data.Close < sma)

@@ -469,9 +469,7 @@ def init(self):
super().init()
self.set_atr_periods(40)
self.set_trailing_sl(3)
self.sma = self.I(
lambda: pd.Series(self.data.Close,
index=self.data.index).rolling(10).mean())
self.sma = self.I(lambda: self.data.Close.to_series().rolling(10).mean())

def next(self):
super().next()
@@ -563,7 +563,7 @@
"\n",
"In `init()`, the whole series of points was available, whereas **in `next()`, the length of `self.data` and any declared indicator arrays is adjusted** on each `next()` call so that `array[-1]` (e.g. `self.data.Close[-1]` or `self.sma1[-1]`) always contains the most recent value, `array[-2]` the previous value, etc. (ordinary Python indexing of ascending-sorted 1D arrays).\n",
"\n",
"**Note**: `self.data` and any indicators wrapped with `self.I` (e.g. `self.sma1`) are **NumPy arrays** for performance reasons. If you need `pandas.Series`, use, e.g., `pd.Series(self.data.Close, index=self.data.index)`.\n",
"**Note**: `self.data` and any indicators wrapped with `self.I` (e.g. `self.sma1`) are **NumPy arrays for performance reasons**. If you need `pandas.Series`, use `.to_series()` method (e.g. `self.data.Close.to_series()`) or construct the series manually (e.g. `pd.Series(self.data.Close, index=self.data.index)`).\n",
"\n",
"Let's see how our strategy performs on historical Google data. We begin with 10,000 units of cash and set broker's commission to realistic 0.2%."
]
@@ -127,7 +127,7 @@ def next(self):
#
# In `init()`, the whole series of points was available, whereas **in `next()`, the length of `self.data` and any declared indicator arrays is adjusted** on each `next()` call so that `array[-1]` (e.g. `self.data.Close[-1]` or `self.sma1[-1]`) always contains the most recent value, `array[-2]` the previous value, etc. (ordinary Python indexing of ascending-sorted 1D arrays).
#
# **Note**: `self.data` and any indicators wrapped with `self.I` (e.g. `self.sma1`) are **NumPy arrays** for performance reasons. If you need `pandas.Series`, use, e.g., `pd.Series(self.data.Close, index=self.data.index)`.
# **Note**: `self.data` and any indicators wrapped with `self.I` (e.g. `self.sma1`) are **NumPy arrays for performance reasons**. If you need `pandas.Series`, use `.to_series()` method (e.g. `self.data.Close.to_series()`) or construct the series manually (e.g. `pd.Series(self.data.Close, index=self.data.index)`).
#
# Let's see how our strategy performs on historical Google data. We begin with 10,000 units of cash and set broker's commission to realistic 0.2%.

0 comments on commit b157c48

Please sign in to comment.
You can’t perform that action at this time.