From b5aef9fb90c64750e61ba30ff1849692562dffa8 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Sun, 14 Nov 2021 15:36:17 +0700 Subject: [PATCH] Work (yes) --- src/naiback/data/bars.py | 54 ++++++++++++----------------- src/naiback/data/feeds/yahoofeed.py | 4 ++- src/naiback/strategy/strategy.py | 15 +++++--- 3 files changed, 36 insertions(+), 37 deletions(-) diff --git a/src/naiback/data/bars.py b/src/naiback/data/bars.py index 2d605b6..c98afae 100644 --- a/src/naiback/data/bars.py +++ b/src/naiback/data/bars.py @@ -144,7 +144,7 @@ class Bars: def synchronize_to(self, other): ix1 = 0 - ix2 = 0 + ix2 = -1 new_open = [] new_high = [] @@ -153,39 +153,29 @@ class Bars: new_volume = [] new_timestamp = [] + prev_open = 0 + prev_high = 0 + prev_low = 0 + prev_close = 0 + for i in range(0, len(other.open)): - if ix1 < len(self.open) - 1: - if other.timestamp[ix2] < self.timestamp[ix1 + 1]: - new_open.append(self.open[ix1 + 1]) - new_high.append(self.high[ix1 + 1]) - new_low.append(self.low[ix1 + 1]) - new_close.append(self.close[ix1 + 1]) - new_volume.append(0) - new_timestamp.append(other.timestamp[ix2]) + if ix2 < len(self.timestamp) - 1 and other.timestamp[i] > self.timestamp[ix2 + 1]: + if ix2 != -1: + prev_open = self.open[ix2] + prev_high = self.high[ix2] + prev_low = self.low[ix2] + prev_close = self.close[ix2] else: - if ix1 < len(self.open) - 2: - ix1 += 1 - new_open.append(self.open[ix1 + 1]) - new_high.append(self.high[ix1 + 1]) - new_low.append(self.low[ix1 + 1]) - new_close.append(self.close[ix1 + 1]) - new_volume.append(0) - new_timestamp.append(other.timestamp[ix2]) - else: - new_open.append(self.open[ix1]) - new_high.append(self.high[ix1]) - new_low.append(self.low[ix1]) - new_close.append(self.close[ix1]) - new_volume.append(0) - new_timestamp.append(other.timestamp[ix2]) - else: - new_open.append(self.open[ix1]) - new_high.append(self.high[ix1]) - new_low.append(self.low[ix1]) - new_close.append(self.close[ix1]) - new_volume.append(0) - new_timestamp.append(other.timestamp[ix2]) - ix2 += 1 + prev_open = 0 + prev_high = 0 + prev_low = 0 + prev_close = 0 + ix2 += 1 + new_open.append(prev_open) + new_high.append(prev_high) + new_low.append(prev_high) + new_close.append(prev_close) + new_timestamp.append(other.timestamp[i]) self.index = range(0, len(new_open)) self.open = new_open diff --git a/src/naiback/data/feeds/yahoofeed.py b/src/naiback/data/feeds/yahoofeed.py index 58cef09..e1a4c5f 100644 --- a/src/naiback/data/feeds/yahoofeed.py +++ b/src/naiback/data/feeds/yahoofeed.py @@ -13,7 +13,6 @@ class YahooCSVFeed(Feed): next(reader) for row in reader: try: - self.ticker_ = row[0] open_ = float(row[1]) high = float(row[2]) low = float(row[3]) @@ -25,6 +24,9 @@ class YahooCSVFeed(Feed): except IndexError: pass + def set_ticker(self, ticker): + self.ticker_ = ticker + def type(self): return 'bars' diff --git a/src/naiback/strategy/strategy.py b/src/naiback/strategy/strategy.py index 05af76b..3f06187 100644 --- a/src/naiback/strategy/strategy.py +++ b/src/naiback/strategy/strategy.py @@ -8,6 +8,7 @@ from naiback.analyzers.equityanalyzer import EquityAnalyzer from naiback.exceptions import NaibackException import math +import time class Strategy: """ @@ -55,9 +56,11 @@ class Strategy: self.bars = self._get_bars(ticker) def _prepare_bars(self, from_time, to_time): + start = time.time() if len(self.feeds) == 0: raise NaibackException('No feeds added to strategy') + v1 = time.time() self.all_bars.clear() for feed in self.feeds: if from_time is None or to_time is None: @@ -65,11 +68,15 @@ class Strategy: else: self.all_bars.append(Bars.from_feed_filter(feed, from_time, to_time)) + v2 = time.time() all_dates = list(sorted(self._combine_dates())) + v3 = time.time() for bars in self.all_bars: self._synchronize_bars(bars, all_dates) bars.index = range(0, len(bars.close)) + v4 = time.time() + print("prepare bars: {} {} {} {}".format(v1 - start, v2 - v1, v3 - v2, v4 - v3)) def get_bars(self, ticker): return self._get_bars(ticker) @@ -99,10 +106,10 @@ class Strategy: volume = bars.volume[bar_pos] for dt in all_dates: if len(bars.timestamp) > bar_pos: - print("new close: {} ({})".format(close, dt)) + #print("new close: {} ({})".format(close, dt)) if bars.timestamp[bar_pos] > dt: - print("Inserting at {}: {}".format(dt, close)) + #print("Inserting at {}: {}".format(dt, close)) bars.insert_bar(bar_pos, open_, high, low, close, volume, dt) else: open_ = bars.open[bar_pos] @@ -112,11 +119,11 @@ class Strategy: volume = bars.volume[bar_pos] if bars.timestamp[bar_pos] > dt: bars.insert_bar(bar_pos, open_, high, low, close, volume, dt) - print("new close: {} ({})".format(close, dt)) + #print("new close: {} ({})".format(close, dt)) else: bars.insert_bar(bar_pos, open_, high, low, close, volume, dt) - print("Inserting[2] at {}: {}".format(dt, close)) + #print("Inserting[2] at {}: {}".format(dt, close)) bar_pos += 1