Skip to main content

Anansi

Dependencies

Python, Pip, Poetry.

To install poetry, on osx, linux or bashonwindows terminals, type it:

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

Alternatively, poetry could be installed by pip (supposing you have python and pip already installed):

pip install poetry

Consuming on Jupyter notebook

That is only a suggestion, you could run anansi on any python terminal. Only tested on linux.

Perform the commands:

poetry install
poetry run python -m ipykernel install --user --name=$(basename $(pwd))
poetry run jupyter notebook > jupyterlog 2>&1 &

Straight to the point: Running Default Back Testing Operation

Importing Dependencies

from anansi.tradingbot.models import *
from anansi.tradingbot import traders
from anansi.tradingbot.views import create_user, create_default_operation

Add a new user

my_user_first_name = "John"

create_user(first_name=my_user_first_name,
                   last_name="Doe",
                   email = "{}@email.com".format(my_user_first_name.lower()))

Creating a default operation

my_user = User[1]
create_default_operation(user=my_user)

Instantiating a trader

my_op = Operation.get(id=1)
my_trader = traders.DefaultTrader(operation=my_op)

Run the trader

my_trader.run()

Playing with the database models

Getting all users

users = select(user for user in User)
users.show()
id|first_name|last_name|login_displayed_name|email         
--+----------+---------+--------------------+--------------
1 |John      |Doe      |                    |john@email.com
my_user.first_name
'John'

Some operation attribute

my_op.stop_loss.name
'StopTrailing3T'

Some trader attribute

my_trader.Classifier.parameters.time_frame
'6h'

Updating some attributes

before_update = my_trader.operation.position.side, my_trader.operation.position.exit_reference_price

my_trader.operation.position.update(side="Long", exit_reference_price=1020.94)

after_update = my_trader.operation.position.side, my_trader.operation.position.exit_reference_price

before_update, after_update
(('Zeroed', None), ('Long', 1020.94))

Requesting klines

Klines treated and ready for use, including market indicators methods

The example below uses the 'KlinesFromBroker' class from the 'handlers' module ('marketdata' package), which works as an abstraction over the data brokers, not only serializing requests (in order to respect brokers' limits), but also conforming the klines like a pandas dataframe, extended with market indicator methods.

from anansi.marketdata.handlers import KlinesFromBroker
BinanceKlines = KlinesFromBroker(
  broker_name="binance", ticker_symbol="BTCUSDT", time_frame="1h")
newest_klines = BinanceKlines.newest(2167)
newest_klines
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Open_time Open High Low Close Volume
0 2020-06-17 11:00:00 9483.25 9511.53 9466.00 9478.61 1251.802697
1 2020-06-17 12:00:00 9478.61 9510.88 9477.35 9499.25 1120.426332
2 2020-06-17 13:00:00 9499.24 9565.00 9432.00 9443.48 4401.693008
3 2020-06-17 14:00:00 9442.50 9464.83 9366.09 9410.95 4802.211120
4 2020-06-17 15:00:00 9411.27 9436.54 9388.43 9399.24 2077.135281
... ... ... ... ... ... ...
2162 2020-09-15 13:00:00 10907.94 10917.96 10834.00 10834.71 3326.420940
2163 2020-09-15 14:00:00 10834.71 10879.00 10736.63 10764.19 4382.021477
2164 2020-09-15 15:00:00 10763.37 10815.47 10745.63 10784.46 3531.309654
2165 2020-09-15 16:00:00 10785.23 10827.61 10700.00 10784.23 3348.735166
2166 2020-09-15 17:00:00 10784.23 10812.44 10738.33 10794.84 1931.035921

2167 rows × 6 columns

Applying simple moving average indicators

indicator = newest_klines.apply_indicator.trend.simple_moving_average(number_of_candles=35)
indicator.name, indicator.last(), indicator.serie
('sma_ohlc4_35',
 10669.49407142858,
 0                NaN
 1                NaN
 2                NaN
 3                NaN
 4                NaN
             ...     
 2162    10619.190500
 2163    10632.213571
 2164    10644.682643
 2165    10657.128857
 2166    10669.494071
 Length: 2167, dtype: float64)
newest_klines
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Open_time Open High Low Close Volume
0 2020-06-17 11:00:00 9483.25 9511.53 9466.00 9478.61 1251.802697
1 2020-06-17 12:00:00 9478.61 9510.88 9477.35 9499.25 1120.426332
2 2020-06-17 13:00:00 9499.24 9565.00 9432.00 9443.48 4401.693008
3 2020-06-17 14:00:00 9442.50 9464.83 9366.09 9410.95 4802.211120
4 2020-06-17 15:00:00 9411.27 9436.54 9388.43 9399.24 2077.135281
... ... ... ... ... ... ...
2162 2020-09-15 13:00:00 10907.94 10917.96 10834.00 10834.71 3326.420940
2163 2020-09-15 14:00:00 10834.71 10879.00 10736.63 10764.19 4382.021477
2164 2020-09-15 15:00:00 10763.37 10815.47 10745.63 10784.46 3531.309654
2165 2020-09-15 16:00:00 10785.23 10827.61 10700.00 10784.23 3348.735166
2166 2020-09-15 17:00:00 10784.23 10812.44 10738.33 10794.84 1931.035921

2167 rows × 6 columns

Same as above, but showing indicator column

indicator = newest_klines.apply_indicator.trend.simple_moving_average(
  number_of_candles=35, indicator_column="SMA_OHLC4_n35")
newest_klines
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Open_time Open High Low Close Volume SMA_OHLC4_n35
0 2020-06-17 11:00:00 9483.25 9511.53 9466.00 9478.61 1251.802697 NaN
1 2020-06-17 12:00:00 9478.61 9510.88 9477.35 9499.25 1120.426332 NaN
2 2020-06-17 13:00:00 9499.24 9565.00 9432.00 9443.48 4401.693008 NaN
3 2020-06-17 14:00:00 9442.50 9464.83 9366.09 9410.95 4802.211120 NaN
4 2020-06-17 15:00:00 9411.27 9436.54 9388.43 9399.24 2077.135281 NaN
... ... ... ... ... ... ... ...
2162 2020-09-15 13:00:00 10907.94 10917.96 10834.00 10834.71 3326.420940 10619.190500
2163 2020-09-15 14:00:00 10834.71 10879.00 10736.63 10764.19 4382.021477 10632.213571
2164 2020-09-15 15:00:00 10763.37 10815.47 10745.63 10784.46 3531.309654 10644.682643
2165 2020-09-15 16:00:00 10785.23 10827.61 10700.00 10784.23 3348.735166 10657.128857
2166 2020-09-15 17:00:00 10784.23 10812.44 10738.33 10794.84 1931.035921 10669.494071

2167 rows × 7 columns

Raw klines, using the low level abstraction module "data_brokers"

DISCLAIMER: Requests here are not queued! There is a risk of banning the IP or even blocking API keys if some limits are exceeded. Use with caution.

from anansi.marketdata import data_brokers
BinanceBroker = data_brokers.BinanceDataBroker()
my_klines = BinanceBroker.get_klines(ticker_symbol="BTCUSDT", time_frame="1m")
my_klines
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Open_time Open High Low Close Volume
0 1600165560 10688.12 10691.14 10684.88 10684.88 21.529835
1 1600165620 10684.88 10686.15 10681.84 10685.99 18.487428
2 1600165680 10686.00 10687.65 10684.92 10687.09 22.246376
3 1600165740 10687.09 10689.54 10683.86 10687.26 18.818481
4 1600165800 10687.26 10687.26 10683.71 10685.76 38.281582
... ... ... ... ... ... ...
494 1600195200 10762.43 10763.48 10760.35 10760.75 8.572210
495 1600195260 10760.75 10762.48 10759.30 10759.31 11.089815
496 1600195320 10759.30 10762.22 10755.39 10761.26 27.070820
497 1600195380 10761.26 10761.26 10751.74 10756.02 15.482246
498 1600195440 10755.61 10756.57 10748.03 10748.04 61.153777

499 rows × 6 columns

Same as above, but returning all information get from the data broker

my_klines = BinanceBroker.get_klines(ticker_symbol="BTCUSDT", time_frame="1m", show_only_desired_info=False)
my_klines
<style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; }
.dataframe tbody tr th {
    vertical-align: top;
}

.dataframe thead th {
    text-align: right;
}
</style>
Open_time Open High Low Close Volume Close_time Quote_asset_volume Number_of_trades Taker_buy_base_asset_volume Taker_buy_quote_asset_volume Ignore
0 1600165560 10688.12 10691.14 10684.88 10684.88 21.529835 1600165619 230126.587773 373.0 10.279415 109864.149822 0.0
1 1600165620 10684.88 10686.15 10681.84 10685.99 18.487428 1600165679 197536.180849 336.0 8.256498 88223.566054 0.0
2 1600165680 10686.00 10687.65 10684.92 10687.09 22.246376 1600165739 237738.839831 415.0 13.378805 142975.243246 0.0
3 1600165740 10687.09 10689.54 10683.86 10687.26 18.818481 1600165799 201100.293663 539.0 9.062957 96849.611844 0.0
4 1600165800 10687.26 10687.26 10683.71 10685.76 38.281582 1600165859 409068.511314 534.0 16.799813 179523.708531 0.0
... ... ... ... ... ... ... ... ... ... ... ... ...
494 1600195200 10762.43 10763.48 10760.35 10760.75 8.572210 1600195259 92253.016477 292.0 2.394778 25771.715413 0.0
495 1600195260 10760.75 10762.48 10759.30 10759.31 11.089815 1600195319 119341.014647 277.0 3.064458 32976.256534 0.0
496 1600195320 10759.30 10762.22 10755.39 10761.26 27.070820 1600195379 291245.877535 490.0 14.654896 157679.926758 0.0
497 1600195380 10761.26 10761.26 10751.74 10756.02 15.482246 1600195439 166520.446192 353.0 7.390407 79491.160961 0.0
498 1600195440 10755.61 10756.57 10748.03 10748.04 61.153777 1600195499 657520.935924 585.0 13.436657 144474.084684 0.0

499 rows × 12 columns

Metadata

Release files for anansi-toolkit 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for anansi-toolkit 0.1.0
File Size Uploaded Provenance Actions
anansi_toolkit-0.1.0.tar.gz 35.7 kB Without provenance Details for anansi_toolkit-0.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for anansi-toolkit 0.1.0
File Interpreter ABI Platform Actions
anansi_toolkit-0.1.0-py3-none-any.whl Python 3 none any Details for anansi_toolkit-0.1.0-py3-none-any.whl

Total release size: 72.1 kB

Release files / anansi_toolkit-0.1.0.tar.gz

Download URL anansi_toolkit-0.1.0.tar.gz
Size 35.7 kB
Tags Source
SHA-256 checksum
How to use checksums
40ba930095c7295f7a3a868822d7b4d2e5a58a2073493322f049e981f748349c
BLAKE2b-256 checksum
How to use checksums
6d53aa6d01488b2686c8935c595bc5ca45434a965fd99c2ea77f2cb1dcdd0859
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.0.9 CPython/3.8.5 Linux/5.7.14-1-MANJARO

Release files / anansi_toolkit-0.1.0-py3-none-any.whl

Download URL anansi_toolkit-0.1.0-py3-none-any.whl
Size 36.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8be3307289ca9202966b1a29bee668ec1e5cd24f03cc877a34d383c5c65d2dc9
BLAKE2b-256 checksum
How to use checksums
0c9dc90d1bb08456c9d13a62a3c35d3fe83f073eab4df706ff6248f4c971e7ad
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.0.9 CPython/3.8.5 Linux/5.7.14-1-MANJARO

Security for anansi-toolkit 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page