diff --git a/.gitignore b/.gitignore index 92dc1e5..e0c3030 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ build/* dist/* src/naiback.egg-info/* .* -__pycache__ \ No newline at end of file +__pycache__ +\#*.*\# \ No newline at end of file diff --git a/src/naiback/analyzers/statsanalyzer.py b/src/naiback/analyzers/statsanalyzer.py index 00e76d7..4bfde57 100644 --- a/src/naiback/analyzers/statsanalyzer.py +++ b/src/naiback/analyzers/statsanalyzer.py @@ -3,6 +3,9 @@ from .analyzer import Analyzer from prettytable import PrettyTable +import numpy as np +import math + def render_float(a): return "{:.3f}".format(a) @@ -98,4 +101,26 @@ class StatsAnalyzer(Analyzer): result['long']['profit_factor'] = render_ratio(result['long']['total_won'], -result['long']['total_lost']) result['short']['profit_factor'] = render_ratio(result['short']['total_won'], -result['short']['total_lost']) + mean = np.mean(list(map(lambda x: x.pnl(), positions))) + stddev = np.std(list(map(lambda x: x.pnl(), positions))) + sharpe = mean / stddev + tstat = sharpe * math.sqrt(len(positions)) + result['all']['sharpe_ratio'] = sharpe + result['all']['t_stat'] = tstat + + mean = np.mean(list(map(lambda x: x.pnl(), longs))) + stddev = np.std(list(map(lambda x: x.pnl(), longs))) + sharpe = mean / stddev + tstat = sharpe * math.sqrt(len(longs)) + result['long']['sharpe_ratio'] = sharpe + result['long']['t_stat'] = tstat + + mean = np.mean(list(map(lambda x: x.pnl(), shorts))) + stddev = np.std(list(map(lambda x: x.pnl(), shorts))) + sharpe = mean / stddev + tstat = sharpe * math.sqrt(len(shorts)) + result['short']['sharpe_ratio'] = sharpe + result['short']['t_stat'] = tstat + + return result diff --git a/src/naiback/analyzers/tradeslistanalyzer.py b/src/naiback/analyzers/tradeslistanalyzer.py index f8eaab2..42caa96 100644 --- a/src/naiback/analyzers/tradeslistanalyzer.py +++ b/src/naiback/analyzers/tradeslistanalyzer.py @@ -16,6 +16,7 @@ class TradesListAnalyzer(Analyzer): 'entry_time' : pos.entry_time(), 'exit_time' : pos.exit_time(), 'pnl' : pos.pnl(), + 'profit_percentage' : pos.profit_percentage(), 'is_long' : pos.is_long(), 'security' : pos.ticker, 'size' : pos.original_size() } diff --git a/src/naiback/indicators/highest.py b/src/naiback/indicators/highest.py index 4ae3ae1..889a23d 100644 --- a/src/naiback/indicators/highest.py +++ b/src/naiback/indicators/highest.py @@ -7,7 +7,7 @@ def Highest(data, period): return result result[0] = data[0] for i in range(1, len(data)): - result[i] = max(data[max(0, i - period):(i+1)]) + result[i] = max(data[max(0, i - period + 1):(i+1)]) return result @@ -16,4 +16,4 @@ def HighestValue(data, index, period): return None if index == 0: return data[0] - return max(data[max(0, index - period):(index+1)]) + return max(data[max(0, index - period + 1):(index+1)]) diff --git a/src/naiback/indicators/lowest.py b/src/naiback/indicators/lowest.py index f387a1c..b85ae0c 100644 --- a/src/naiback/indicators/lowest.py +++ b/src/naiback/indicators/lowest.py @@ -7,7 +7,7 @@ def Lowest(data, period): return result result[0] = data[0] for i in range(1, len(data)): - result[i] = min(data[max(0, i - period):(i+1)]) + result[i] = min(data[max(0, i - period + 1):(i+1)]) return result @@ -16,4 +16,4 @@ def LowestValue(data, index, period): return None if index == 0: return data[0] - return min(data[max(0, index - period):(index+1)]) + return min(data[max(0, index - period + 1):(index+1)]) diff --git a/src/naiback/strategy/strategy.py b/src/naiback/strategy/strategy.py index 81903fd..05af76b 100644 --- a/src/naiback/strategy/strategy.py +++ b/src/naiback/strategy/strategy.py @@ -100,7 +100,7 @@ class Strategy: for dt in all_dates: if len(bars.timestamp) > bar_pos: print("new close: {} ({})".format(close, dt)) - + if bars.timestamp[bar_pos] > dt: print("Inserting at {}: {}".format(dt, close)) bars.insert_bar(bar_pos, open_, high, low, close, volume, dt)