Skip to content

Commit 5928524

Browse files
committed
REF: Rename param lib.FractionalBacktest(fractional_unit=)
Fixes #1229 Thanks!
1 parent d673d0a commit 5928524

File tree

3 files changed

+21
-7
lines changed

3 files changed

+21
-7
lines changed

backtesting/backtesting.py

+4
Original file line numberDiff line numberDiff line change
@@ -1153,6 +1153,10 @@ class Backtest:
11531153
[active and ongoing] at the end of the backtest will be closed on
11541154
the last bar and will contribute to the computed backtest statistics.
11551155
1156+
.. tip:: Fractional trading
1157+
See also `backtesting.lib.FractionalBacktest` if you want to trade
1158+
fractional units (of e.g. bitcoin).
1159+
11561160
[FIFO]: https://www.investopedia.com/terms/n/nfa-compliance-rule-2-43b.asp
11571161
[active and ongoing]: https://kernc.github.io/backtesting.py/doc/backtesting/backtesting.html#backtesting.backtesting.Strategy.trades
11581162
""" # noqa: E501

backtesting/lib.py

+16-6
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from __future__ import annotations
1515

1616
import multiprocessing as mp
17+
import warnings
1718
from collections import OrderedDict
1819
from inspect import currentframe
1920
from itertools import chain, compress, count
@@ -511,22 +512,31 @@ class FractionalBacktest(Backtest):
511512
A `backtesting.backtesting.Backtest` that supports fractional share trading
512513
by simple composition. It applies roughly the transformation:
513514
514-
data = (data / satoshi).assign(Volume=data.Volume * satoshi)
515+
data = (data * fractional_unit).assign(Volume=data.Volume / fractional_unit)
515516
516517
as left unchallenged in [this FAQ entry on GitHub](https://github.com/kernc/backtesting.py/issues/134),
517518
then passes `data`, `args*`, and `**kwargs` to its super.
518519
519-
Parameter `satoshi` tells the amount of scaling to do. E.g. for
520-
μBTC trading, pass `satoshi=1e6`.
520+
Parameter `fractional_unit` represents the smallest fraction of currency that can be traded
521+
and defaults to one [satoshi]. For μBTC trading, pass `fractional_unit=1/1e6`.
522+
Thus-transformed backtest does a whole-sized trading of `fractional_unit` units.
523+
524+
[satoshi]: https://en.wikipedia.org/wiki/Bitcoin#Units_and_divisibility
521525
"""
522526
def __init__(self,
523527
data,
524528
*args,
525-
satoshi=int(100e6),
529+
fractional_unit=1 / 100e6,
526530
**kwargs):
531+
if 'satoshi' in kwargs:
532+
warnings.warn(
533+
'Parameter `FractionalBacktest(..., satoshi=)` is deprecated. '
534+
'Use `FractionalBacktest(..., fractional_unit=)`.',
535+
category=DeprecationWarning, stacklevel=2)
536+
fractional_unit = 1 / kwargs.pop('satoshi')
527537
data = data.copy()
528-
data[['Open', 'High', 'Low', 'Close']] /= satoshi
529-
data['Volume'] *= satoshi
538+
data[['Open', 'High', 'Low', 'Close']] *= fractional_unit
539+
data['Volume'] /= fractional_unit
530540
super().__init__(data, *args, **kwargs)
531541

532542

backtesting/test/_test.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,7 @@ def next(self):
939939
self.assertEqual(stats['# Trades'], 56)
940940

941941
def test_FractionalBacktest(self):
942-
ubtc_bt = FractionalBacktest(BTCUSD['2015':], SmaCross, satoshi=1e6, cash=100)
942+
ubtc_bt = FractionalBacktest(BTCUSD['2015':], SmaCross, fractional_unit=1/1e6, cash=100)
943943
stats = ubtc_bt.run(fast=2, slow=3)
944944
self.assertEqual(stats['# Trades'], 41)
945945

0 commit comments

Comments
 (0)