Browse Source

Work (yes)

master
Denis Tereshkin 4 years ago
parent
commit
b5aef9fb90
  1. 52
      src/naiback/data/bars.py
  2. 4
      src/naiback/data/feeds/yahoofeed.py
  3. 15
      src/naiback/strategy/strategy.py

52
src/naiback/data/bars.py

@ -144,7 +144,7 @@ class Bars:
def synchronize_to(self, other): def synchronize_to(self, other):
ix1 = 0 ix1 = 0
ix2 = 0 ix2 = -1
new_open = [] new_open = []
new_high = [] new_high = []
@ -153,39 +153,29 @@ class Bars:
new_volume = [] new_volume = []
new_timestamp = [] new_timestamp = []
prev_open = 0
prev_high = 0
prev_low = 0
prev_close = 0
for i in range(0, len(other.open)): for i in range(0, len(other.open)):
if ix1 < len(self.open) - 1: if ix2 < len(self.timestamp) - 1 and other.timestamp[i] > self.timestamp[ix2 + 1]:
if other.timestamp[ix2] < self.timestamp[ix1 + 1]: if ix2 != -1:
new_open.append(self.open[ix1 + 1]) prev_open = self.open[ix2]
new_high.append(self.high[ix1 + 1]) prev_high = self.high[ix2]
new_low.append(self.low[ix1 + 1]) prev_low = self.low[ix2]
new_close.append(self.close[ix1 + 1]) prev_close = self.close[ix2]
new_volume.append(0)
new_timestamp.append(other.timestamp[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: else:
new_open.append(self.open[ix1]) prev_open = 0
new_high.append(self.high[ix1]) prev_high = 0
new_low.append(self.low[ix1]) prev_low = 0
new_close.append(self.close[ix1]) prev_close = 0
new_volume.append(0)
new_timestamp.append(other.timestamp[ix2])
ix2 += 1 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.index = range(0, len(new_open))
self.open = new_open self.open = new_open

4
src/naiback/data/feeds/yahoofeed.py

@ -13,7 +13,6 @@ class YahooCSVFeed(Feed):
next(reader) next(reader)
for row in reader: for row in reader:
try: try:
self.ticker_ = row[0]
open_ = float(row[1]) open_ = float(row[1])
high = float(row[2]) high = float(row[2])
low = float(row[3]) low = float(row[3])
@ -25,6 +24,9 @@ class YahooCSVFeed(Feed):
except IndexError: except IndexError:
pass pass
def set_ticker(self, ticker):
self.ticker_ = ticker
def type(self): def type(self):
return 'bars' return 'bars'

15
src/naiback/strategy/strategy.py

@ -8,6 +8,7 @@ from naiback.analyzers.equityanalyzer import EquityAnalyzer
from naiback.exceptions import NaibackException from naiback.exceptions import NaibackException
import math import math
import time
class Strategy: class Strategy:
""" """
@ -55,9 +56,11 @@ class Strategy:
self.bars = self._get_bars(ticker) self.bars = self._get_bars(ticker)
def _prepare_bars(self, from_time, to_time): def _prepare_bars(self, from_time, to_time):
start = time.time()
if len(self.feeds) == 0: if len(self.feeds) == 0:
raise NaibackException('No feeds added to strategy') raise NaibackException('No feeds added to strategy')
v1 = time.time()
self.all_bars.clear() self.all_bars.clear()
for feed in self.feeds: for feed in self.feeds:
if from_time is None or to_time is None: if from_time is None or to_time is None:
@ -65,11 +68,15 @@ class Strategy:
else: else:
self.all_bars.append(Bars.from_feed_filter(feed, from_time, to_time)) self.all_bars.append(Bars.from_feed_filter(feed, from_time, to_time))
v2 = time.time()
all_dates = list(sorted(self._combine_dates())) all_dates = list(sorted(self._combine_dates()))
v3 = time.time()
for bars in self.all_bars: for bars in self.all_bars:
self._synchronize_bars(bars, all_dates) self._synchronize_bars(bars, all_dates)
bars.index = range(0, len(bars.close)) 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): def get_bars(self, ticker):
return self._get_bars(ticker) return self._get_bars(ticker)
@ -99,10 +106,10 @@ class Strategy:
volume = bars.volume[bar_pos] volume = bars.volume[bar_pos]
for dt in all_dates: for dt in all_dates:
if len(bars.timestamp) > bar_pos: if len(bars.timestamp) > bar_pos:
print("new close: {} ({})".format(close, dt)) #print("new close: {} ({})".format(close, dt))
if bars.timestamp[bar_pos] > 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) bars.insert_bar(bar_pos, open_, high, low, close, volume, dt)
else: else:
open_ = bars.open[bar_pos] open_ = bars.open[bar_pos]
@ -112,11 +119,11 @@ class Strategy:
volume = bars.volume[bar_pos] volume = bars.volume[bar_pos]
if bars.timestamp[bar_pos] > dt: if bars.timestamp[bar_pos] > dt:
bars.insert_bar(bar_pos, open_, high, low, close, volume, 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: else:
bars.insert_bar(bar_pos, open_, high, low, close, volume, dt) 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 bar_pos += 1

Loading…
Cancel
Save