PyAlgoEngine 0.5.2__tar.gz → 0.5.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/PKG-INFO +1 -1
  2. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/PyAlgoEngine.egg-info/PKG-INFO +1 -1
  3. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/PyAlgoEngine.egg-info/SOURCES.txt +5 -5
  4. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/__init__.py +3 -3
  5. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/backtest/tester.py +2 -2
  6. {pyalgoengine-0.5.2/algo_engine/back_test → pyalgoengine-0.5.4/algo_engine/backtest}/__main__.py +2 -2
  7. {pyalgoengine-0.5.2/algo_engine/back_test → pyalgoengine-0.5.4/algo_engine/backtest}/metrics.py +29 -29
  8. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/strategy/strategy_engine.py +3 -3
  9. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/LICENSE +0 -0
  10. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/PyAlgoEngine.egg-info/dependency_links.txt +0 -0
  11. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/PyAlgoEngine.egg-info/requires.txt +0 -0
  12. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/PyAlgoEngine.egg-info/top_level.txt +0 -0
  13. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/README.md +0 -0
  14. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/__init__.py +0 -0
  15. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/backtest/__init__.py +0 -0
  16. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/backtest/doc_server.py +0 -0
  17. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/backtest/web_app.py +0 -0
  18. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/bokeh_server.py +0 -0
  19. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/demo/__init__.py +0 -0
  20. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/apps/demo/test.py +0 -0
  21. {pyalgoengine-0.5.2/algo_engine/back_test → pyalgoengine-0.5.4/algo_engine/backtest}/__init__.py +0 -0
  22. {pyalgoengine-0.5.2/algo_engine/back_test → pyalgoengine-0.5.4/algo_engine/backtest}/replay.py +0 -0
  23. {pyalgoengine-0.5.2/algo_engine/back_test → pyalgoengine-0.5.4/algo_engine/backtest}/sim_match.py +0 -0
  24. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/base/__init__.py +0 -0
  25. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/base/console_utils.py +0 -0
  26. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/base/finance_decimal.py +0 -0
  27. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/base/market_utils.py +0 -0
  28. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/base/technical_analysis.py +0 -0
  29. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/base/telemetrics.py +0 -0
  30. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/base/trade_utils.py +0 -0
  31. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/engine/__init__.py +0 -0
  32. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/engine/algo_engine.py +0 -0
  33. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/engine/event_engine.py +0 -0
  34. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/engine/market_engine.py +0 -0
  35. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/engine/trade_engine.py +0 -0
  36. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/monitor/__init__.py +0 -0
  37. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/monitor/advanced_data_interface.py +0 -0
  38. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/profile/__init__.py +0 -0
  39. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/profile/cn.py +0 -0
  40. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/strategy/__init__.py +0 -0
  41. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/utils/__init__.py +0 -0
  42. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/utils/commit_regularizer.py +0 -0
  43. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/algo_engine/utils/data_utils.py +0 -0
  44. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/setup.cfg +0 -0
  45. {pyalgoengine-0.5.2 → pyalgoengine-0.5.4}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyAlgoEngine
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: Basic algo engine
5
5
  Home-page: https://github.com/BolunHan/PyAlgoEngine
6
6
  Author: Bolun.Han
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: PyAlgoEngine
3
- Version: 0.5.2
3
+ Version: 0.5.4
4
4
  Summary: Basic algo engine
5
5
  Home-page: https://github.com/BolunHan/PyAlgoEngine
6
6
  Author: Bolun.Han
@@ -15,11 +15,11 @@ algo_engine/apps/backtest/tester.py
15
15
  algo_engine/apps/backtest/web_app.py
16
16
  algo_engine/apps/demo/__init__.py
17
17
  algo_engine/apps/demo/test.py
18
- algo_engine/back_test/__init__.py
19
- algo_engine/back_test/__main__.py
20
- algo_engine/back_test/metrics.py
21
- algo_engine/back_test/replay.py
22
- algo_engine/back_test/sim_match.py
18
+ algo_engine/backtest/__init__.py
19
+ algo_engine/backtest/__main__.py
20
+ algo_engine/backtest/metrics.py
21
+ algo_engine/backtest/replay.py
22
+ algo_engine/backtest/sim_match.py
23
23
  algo_engine/base/__init__.py
24
24
  algo_engine/base/console_utils.py
25
25
  algo_engine/base/finance_decimal.py
@@ -1,4 +1,4 @@
1
- __version__ = "0.5.2"
1
+ __version__ = "0.5.4"
2
2
 
3
3
  import logging
4
4
  import os
@@ -16,14 +16,14 @@ else:
16
16
  def set_logger(logger: logging.Logger):
17
17
  base.set_logger(logger=logger)
18
18
  engine.set_logger(logger=logger.getChild('Engine'))
19
- back_test.set_logger(logger=logger.getChild('BackTest'))
19
+ backtest.set_logger(logger=logger.getChild('BackTest'))
20
20
  strategy.set_logger(logger=logger.getChild('Strategy'))
21
21
  apps.set_logger(logger=logger.getChild('Apps'))
22
22
 
23
23
 
24
24
  from . import base
25
25
  from . import engine
26
- from . import back_test
26
+ from . import backtest
27
27
  from . import strategy
28
28
  from . import apps
29
29
 
@@ -5,10 +5,10 @@ from typing import Literal
5
5
 
6
6
  import numpy as np
7
7
 
8
- from algo_engine.back_test.metrics import TradeMetrics
8
+ from algo_engine.backtest.metrics import TradeMetrics
9
9
  from . import LOGGER
10
10
  from .web_app import WebApp
11
- from ...back_test import SimMatch, ProgressiveReplay
11
+ from ...backtest import SimMatch, ProgressiveReplay
12
12
  from ...base import MarketData, TradeReport, TradeInstruction
13
13
  from ...profile import Profile, PROFILE
14
14
 
@@ -1,7 +1,7 @@
1
- __package__ = 'algo_engine.back_test'
1
+ __package__ = 'algo_engine.backtest'
2
2
 
3
3
  import datetime
4
- from typing import Callable
4
+ from collections.abc import Callable
5
5
 
6
6
  import event_engine
7
7
 
@@ -13,16 +13,16 @@ class TradeMetrics(object):
13
13
  self.total_pnl = 0.
14
14
  self.total_cash_flow = 0.
15
15
 
16
- self._current_pnl = 0.
17
- self._current_cash_flow = 0.
18
- self._current_trade_batch = {'cash_flow': 0., 'pnl': 0., 'turnover': 0., 'trades': []}
19
- self._market_price = None
16
+ self.current_pnl = 0.
17
+ self.current_cash_flow = 0.
18
+ self.current_trade_batch = {'cash_flow': 0., 'pnl': 0., 'turnover': 0., 'trades': []}
19
+ self.market_price = None
20
20
 
21
21
  def update(self, market_price: float):
22
- self._market_price = market_price
22
+ self.market_price = market_price
23
23
  self.total_pnl = self.exposure * market_price + self.total_cash_flow
24
- self._current_pnl = self.exposure * market_price + self._current_cash_flow
25
- self._current_trade_batch['pnl'] = self.exposure * market_price + self._current_trade_batch['cash_flow']
24
+ self.current_pnl = self.exposure * market_price + self.current_cash_flow
25
+ self.current_trade_batch['pnl'] = self.exposure * market_price + self.current_trade_batch['cash_flow']
26
26
 
27
27
  def add_trades(self, side: int, price: float, timestamp: float, volume: float = None, trade_id: int | str = None):
28
28
  assert side in {1, -1}, f"trade side must in {1, -1}, got {side}."
@@ -50,9 +50,9 @@ class TradeMetrics(object):
50
50
  self.exposure += volume * side
51
51
  self.total_cash_flow -= volume * side * price
52
52
  self.total_pnl = self.exposure * price + self.total_cash_flow
53
- self._current_cash_flow -= volume * side * price
54
- self._current_pnl = self.exposure * price + self._current_cash_flow
55
- self._market_price = price
53
+ self.current_cash_flow -= volume * side * price
54
+ self.current_pnl = self.exposure * price + self.current_cash_flow
55
+ self.market_price = price
56
56
 
57
57
  self.trades[trade_id] = trade_log = dict(
58
58
  side=side,
@@ -60,22 +60,22 @@ class TradeMetrics(object):
60
60
  timestamp=timestamp,
61
61
  price=price,
62
62
  exposure=self.exposure,
63
- cash_flow=self._current_cash_flow,
64
- pnl=self._current_pnl
63
+ cash_flow=self.current_cash_flow,
64
+ pnl=self.current_pnl
65
65
  )
66
66
 
67
- if 'init_side' not in self._current_trade_batch:
68
- self._current_trade_batch['init_side'] = side
67
+ if 'init_side' not in self.current_trade_batch:
68
+ self.current_trade_batch['init_side'] = side
69
69
 
70
- self._current_trade_batch['cash_flow'] -= volume * side * price
71
- self._current_trade_batch['pnl'] = self.exposure * price + self._current_trade_batch['cash_flow']
72
- self._current_trade_batch['turnover'] += abs(volume) * price
73
- self._current_trade_batch['trades'].append(trade_log)
70
+ self.current_trade_batch['cash_flow'] -= volume * side * price
71
+ self.current_trade_batch['pnl'] = self.exposure * price + self.current_trade_batch['cash_flow']
72
+ self.current_trade_batch['turnover'] += abs(volume) * price
73
+ self.current_trade_batch['trades'].append(trade_log)
74
74
 
75
75
  if not self.exposure:
76
- self.trade_batch.append(self._current_trade_batch)
77
- self._current_trade_batch = {'cash_flow': 0., 'pnl': 0., 'turnover': 0., 'trades': []}
78
- self._current_pnl = self._current_cash_flow = 0.
76
+ self.trade_batch.append(self.current_trade_batch)
77
+ self.current_trade_batch = {'cash_flow': 0., 'pnl': 0., 'turnover': 0., 'trades': []}
78
+ self.current_pnl = self.current_cash_flow = 0.
79
79
 
80
80
  def add_trades_batch(self, trade_logs: pd.DataFrame):
81
81
  for timestamp, row in trade_logs.iterrows(): # type: float, dict
@@ -92,10 +92,10 @@ class TradeMetrics(object):
92
92
  self.total_pnl = 0.
93
93
  self.total_cash_flow = 0.
94
94
 
95
- self._current_pnl = 0.
96
- self._current_cash_flow = 0.
97
- self._current_trade_batch = {'cash_flow': 0., 'pnl': 0., 'turnover': 0., 'trades': []}
98
- self._market_price = None
95
+ self.current_pnl = 0.
96
+ self.current_cash_flow = 0.
97
+ self.current_trade_batch = {'cash_flow': 0., 'pnl': 0., 'turnover': 0., 'trades': []}
98
+ self.market_price = None
99
99
 
100
100
  @property
101
101
  def summary(self):
@@ -121,11 +121,11 @@ class TradeMetrics(object):
121
121
  info_dict['turnover'] += trade_batch['turnover']
122
122
 
123
123
  info_dict['win_rate'] = info_dict['win_count'] / info_dict['trade_count'] if info_dict['trade_count'] else 0.
124
- info_dict['average_gain'] = info_dict['total_gain'] / info_dict['win_count'] / self._market_price if info_dict['win_count'] else 0.
125
- info_dict['average_loss'] = info_dict['total_loss'] / info_dict['lose_count'] / self._market_price if info_dict['lose_count'] else 0.
124
+ info_dict['average_gain'] = info_dict['total_gain'] / info_dict['win_count'] / self.market_price if info_dict['win_count'] else 0.
125
+ info_dict['average_loss'] = info_dict['total_loss'] / info_dict['lose_count'] / self.market_price if info_dict['lose_count'] else 0.
126
126
  info_dict['gain_loss_ratio'] = -info_dict['average_gain'] / info_dict['average_loss'] if info_dict['average_loss'] else 1.
127
- info_dict['long_avg_pnl'] = np.average([_['pnl'] for _ in long_trades]) / self._market_price if (long_trades := [_ for _ in self.trade_batch if _['init_side'] == 1]) else np.nan
128
- info_dict['short_avg_pnl'] = np.average([_['pnl'] for _ in short_trades]) / self._market_price if (short_trades := [_ for _ in self.trade_batch if _['init_side'] == -1]) else np.nan
127
+ info_dict['long_avg_pnl'] = np.average([_['pnl'] for _ in long_trades]) / self.market_price if (long_trades := [_ for _ in self.trade_batch if _['init_side'] == 1]) else np.nan
128
+ info_dict['short_avg_pnl'] = np.average([_['pnl'] for _ in short_trades]) / self.market_price if (short_trades := [_ for _ in self.trade_batch if _['init_side'] == -1]) else np.nan
129
129
  info_dict['ttl_pnl.no_leverage'] = np.sum([trade_batch['pnl'] for trade_batch in self.trade_batch])
130
130
  info_dict['net_pnl.optimistic'] = info_dict['ttl_pnl.no_leverage'] - (0.00034 + 0.000023) / 2 * info_dict['turnover']
131
131
 
@@ -1,11 +1,11 @@
1
1
  import abc
2
2
  import datetime
3
3
  import time
4
+ from collections.abc import Callable
4
5
  from functools import cached_property
5
- from typing import Callable
6
6
 
7
7
  from . import LOGGER
8
- from ..back_test import SimMatch, ProgressiveReplay
8
+ from ..backtest import SimMatch, ProgressiveReplay
9
9
  from ..base import MarketData, TradeReport, TradeInstruction, TransactionSide
10
10
  from ..engine import PositionManagementService, TOPIC, EVENT_ENGINE
11
11
 
@@ -35,7 +35,7 @@ class StrategyEngineTemplate(object, metaclass=abc.ABCMeta):
35
35
 
36
36
  @property
37
37
  def dma(self):
38
- return self.position_tracker.dma.mds
38
+ return self.position_tracker.dma
39
39
 
40
40
  @property
41
41
  def risk_profile(self):
File without changes
File without changes
File without changes
File without changes