diff --git a/zipline/finance/performance.py b/zipline/finance/performance.py index cf761c55..8f3d9aa1 100644 --- a/zipline/finance/performance.py +++ b/zipline/finance/performance.py @@ -55,7 +55,7 @@ class PortfolioClient(qmsg.Component): if(event.dt >= self.market_close): self.handle_market_close() - if event.TRANSACTION != None: + if event.TRANSACTION: self.cumulative_performance.execute_transaction(event.TRANSACTION) self.todays_performance.execute_transaction(event.TRANSACTION) @@ -85,14 +85,22 @@ class PortfolioClient(qmsg.Component): self.market_close = self.market_open + self.trading_day self.day_count += 1.0 self.progress = self.day_count / self.total_days - self.returns.append(risk.daily_return(self.todays_performance.period_end.replace(hour=0, minute=0, second=0), self.todays_performance.returns)) - self.cur_period_metrics = risk.periodmetrics(start_date=self.period_start, - end_date=self.todays_performance.period_end.replace(hour=0, minute=0, second=0), + #add the return results from today to the list of daily return objects. + todays_date = self.todays_performance.period_end.replace(hour=0, minute=0, second=0) + todays_return_obj = risk.daily_return(todays_date, self.todays_performance.returns) + self.returns.append(todays_return_obj) + + #calculate risk metrics for cumulative performance + self.cur_period_metrics = risk.RiskMetrics(start_date=self.cumulative_performance.period_start, + end_date=self.cumulative_performance.period_end.replace(hour=0, minute=0, second=0), returns=self.returns, trading_environment=self.trading_environment) - ############################################### - #######TODO: report/relay metrics here######### - ############################################### + + ###################################################################################################### + #######TODO: report/relay metrics out to qexec -- values come from self.cur_period_metrics ########### + #######TODO: report/relay position data out to qexec -- values come from self.cumulative_performance # + ###################################################################################################### + #roll over positions to current day. self.todays_performance = PerformancePeriod(self.market_open, self.market_close, @@ -101,7 +109,10 @@ class PortfolioClient(qmsg.Component): self.capital_base) def handle_simulation_end(self): - self.risk_report = risk.riskmetrics(self.returns, self.trading_environment) + self.risk_report = risk.RiskReport(self.returns, self.trading_environment) + ###################################################################################################### + #######TODO: report/relay metrics out to qexec -- values come from self.risk_report ########### + ###################################################################################################### def round_to_nearest(self, x, base=5): return int(base * round(float(x)/base)) @@ -156,7 +167,7 @@ class PerformancePeriod(): self.ending_value = self.calculate_positions_value() self.pnl = (self.ending_value - self.starting_value) - self.period_capital_used if(self.capital_base != 0): - self.returns = self.pnl / self.capital_base + self.returns = self.pnl / self.starting_value else: self.returns = 0.0 diff --git a/zipline/finance/risk.py b/zipline/finance/risk.py index 56aceaf0..2d6195c0 100644 --- a/zipline/finance/risk.py +++ b/zipline/finance/risk.py @@ -16,16 +16,18 @@ class daily_return(): def __repr__(self): return str(self.date) + " - " + str(self.returns) -class periodmetrics(): - def __init__(self, start_date, end_date, returns, trading_environment): +class RiskMetrics(): + def __init__(self, start_date, end_date, returns, benchmark_returns, treasury_curves, trading_calendar): + """ + :param treasury_curves: {datetime in utc -> {duration label -> interest rate}} + """ - - self.trading_environment = trading_environment - bm_returns = [x for x in self.trading_environment.benchmark_returns if x.date >= returns[0].date and x.date <= returns[-1].date] + self.treasury_curves = treasury_curves self.start_date = start_date self.end_date = end_date + self.trading_calendar = trading_calendar self.algorithm_period_returns, self.algorithm_returns = self.calculate_period_returns(returns) - self.benchmark_period_returns, self.benchmark_returns = self.calculate_period_returns(bm_returns) + self.benchmark_period_returns, self.benchmark_returns = self.calculate_period_returns(benchmark_returns) if(len(self.benchmark_returns) != len(self.algorithm_returns)): raise Exception("Mismatch between benchmark_returns ({bm_count}) and algorithm_returns ({algo_count}) in range {start} : {end}".format( bm_count=len(self.benchmark_returns), @@ -51,7 +53,7 @@ class periodmetrics(): return '\n'.join(statements) def calculate_period_returns(self, daily_returns): - returns = [x.returns for x in daily_returns if x.date >= self.start_date and x.date <= self.end_date and self.trading_environment.is_trading_day(x.date)] + returns = [x.returns for x in daily_returns if x.date >= self.start_date and x.date <= self.end_date and self.trading_calendar.is_trading_day(x.date)] #qutil.LOGGER.debug("using {count} daily returns out of {total}".format(count=len(returns),total=len(daily_returns))) period_returns = 1.0 for r in returns: @@ -144,8 +146,9 @@ class periodmetrics(): curve = None #in case end date is not a trading day, search for the next market day for an interest rate for i in range(7): - if(self.trading_environment.treasury_curves.has_key(self.end_date + i * one_day)): - curve = self.trading_environment.treasury_curves[self.end_date + i * one_day] + if(self.treasury_curves.has_key(self.end_date + i * one_day)): + #qutil.LOGGER.info(self.treasury_curves[self.end_date + i * one_day]) + curve = self.treasury_curves[self.end_date + i * one_day] break if curve: @@ -160,29 +163,36 @@ class periodmetrics(): raise Exception("no rate for end date = {dt} and term = {term}. Using zero.".format(dt=self.end_date, term=self.treasury_duration)) -class riskmetrics(): +class RiskReport(): - def __init__(self, algorithm_returns, trading_environment): + def __init__(self, algorithm_returns, benchmark_returns, treasury_curves, trading_calendar): """algorithm_returns needs to be a list of daily_return objects sorted in date ascending order""" self.algorithm_returns = algorithm_returns - self.trading_environment = trading_environment + self.bm_returns = [x for x in benchmark_returns if x.date >= self.algorithm_returns[0].date and x.date <= self.algorithm_returns[-1].date] + self.treasury_curves = treasury_curves + self.trading_calendar = trading_calendar + + qutil.LOGGER.debug("#### {start} thru {end} with {count} trading_days of {total} possible".format(start=self.algorithm_returns[0].date, + end=self.algorithm_returns[-1].date, + count=len(self.bm_returns), + total=len(benchmark_returns))) #calculate month ends - self.month_periods = self.periods_in_range(1, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) + self.month_periods = self.periodsInRange(1, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) #calculate 3 month ends - self.three_month_periods = self.periods_in_range(3, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) + self.three_month_periods = self.periodsInRange(3, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) #calculate 6 month ends - self.six_month_periods = self.periods_in_range(6, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) + self.six_month_periods = self.periodsInRange(6, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) #calculate 1 year ends - self.year_periods = self.periods_in_range(12, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) + self.year_periods = self.periodsInRange(12, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) #calculate 3 year ends - self.three_year_periods = self.periods_in_range(36, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) + self.three_year_periods = self.periodsInRange(36, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) #calculate 5 year ends - self.five_year_periods = self.periods_in_range(60, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) + self.five_year_periods = self.periodsInRange(60, self.algorithm_returns[0].date, self.algorithm_returns[-1].date) - def periods_in_range(self, months_per, start, end): + def periodsInRange(self, months_per, start, end): one_day = datetime.timedelta(days = 1) ends = [] cur_start = start.replace(day=1) @@ -193,10 +203,12 @@ class riskmetrics(): if(cur_end > the_end): break #qutil.LOGGER.debug("start: {start}, end: {end}".format(start=cur_start, end=cur_end)) - cur_period_metrics = periodmetrics(start_date=cur_start, + cur_period_metrics = RiskMetrics(start_date=cur_start, end_date=cur_end, returns=self.algorithm_returns, - trading_environment=self.trading_environment) + benchmark_returns=self.bm_returns, + treasury_curves=self.treasury_curves, + trading_calendar=self.trading_calendar) ends.append(cur_period_metrics) cur_start = advance_by_months(cur_start, 1) @@ -230,7 +242,6 @@ class TradingEnvironment(object): self.trading_days = [] self.trading_day_map = {} self.treasury_curves = treasury_curves - self.benchmark_returns = benchmark_returns for bm in benchmark_returns: self.trading_days.append(bm.date) self.trading_day_map[bm.date] = bm diff --git a/zipline/test/test_finance.py b/zipline/test/test_finance.py index 96196a7f..829f5fa2 100644 --- a/zipline/test/test_finance.py +++ b/zipline/test/test_finance.py @@ -21,8 +21,13 @@ class FinanceTestCase(TestCase): def setUp(self): qutil.configure_logging() - self.benchmark_returns, self.treasury_curves = factory.load_market_data() - self.trading_environment = risk.TradingEnvironment(self.benchmark_returns, self.treasury_curves) + self.benchmark_returns, self.treasury_curves = \ + factory.load_market_data() + + self.trading_environment = risk.TradingEnvironment( + self.benchmark_returns, + self.treasury_curves + ) def test_trade_feed_protocol(self): @@ -35,7 +40,14 @@ class FinanceTestCase(TestCase): start_date = datetime.strptime("02/15/2012","%m/%d/%Y") one_day_td = timedelta(days=1) - trades = factory.create_trade_history(sid, price, volume, start_date, one_day_td, self.trading_environment) + trades = factory.create_trade_history( + sid, + price, + volume, + start_date, + one_day_td, + self.trading_environment + ) for trade in trades: #simulate data source sending frame @@ -150,7 +162,14 @@ class FinanceTestCase(TestCase): start_date = datetime.strptime("02/1/2012","%m/%d/%Y") trade_time_increment = timedelta(days=1) - trade_history = factory.create_trade_history( sid, price, volume, start_date, trade_time_increment, self.trading_environment ) + trade_history = factory.create_trade_history( + sid, + price, + volume, + start_date, + trade_time_increment, + self.trading_environment + ) set1 = SpecificEquityTrades("flat-133", trade_history) @@ -212,19 +231,36 @@ class FinanceTestCase(TestCase): start_date = datetime.strptime("02/1/2012","%m/%d/%Y") trade_time_increment = timedelta(days=1) - trade_history = factory.create_trade_history( sid, price, volume, start_date, trade_time_increment, self.trading_environment ) + trade_history = factory.create_trade_history( + sid, + price, + volume, + start_date, + trade_time_increment, + self.trading_environment ) set1 = SpecificEquityTrades("flat-133", trade_history) #client sill send 10 orders for 100 shares of 133 client = TestTradingClient(133, 100, 10) - ts = datetime.strptime("02/1/2012","%m/%d/%Y").replace(tzinfo=pytz.utc) + ts = datetime.strptime("02/1/2012","%m/%d/%Y") + ts = ts.replace(tzinfo=pytz.utc) order_source = OrderDataSource(ts) transaction_sim = TransactionSimulator() - portfolio_client = perf.PortfolioClient(trade_history[0]['dt'], trade_history[-1]['dt'], 1000000.0, self.trading_environment) - - sim.register_components([client, order_source, transaction_sim, set1, portfolio_client]) + portfolio_client = perf.PortfolioClient( + trade_history[0]['dt'], + trade_history[-1]['dt'], + 1000000.0, + self.trading_environment) + + sim.register_components([ + client, + order_source, + transaction_sim, + set1, + portfolio_client, + ]) sim.register_controller( con ) # Simulation diff --git a/zipline/test/test_risk.py b/zipline/test/test_risk.py index de7dad11..81aa0de9 100644 --- a/zipline/test/test_risk.py +++ b/zipline/test/test_risk.py @@ -11,18 +11,22 @@ class Risk(unittest.TestCase): def setUp(self): qutil.configure_logging() - self.benchmark_returns, self.treasury_curves = factory.load_market_data() - self.trading_calendar = risk.TradingEnvironment(self.benchmark_returns, self.treasury_curves) + self.benchmark_returns, self.treasury_curves = \ + factory.load_market_data() + + self.trading_calendar = risk.TradingEnvironment( + self.benchmark_returns, + self.treasury_curves + ) self.onesec = datetime.timedelta(seconds=1) self.oneday = datetime.timedelta(days=1) self.tradingday = datetime.timedelta(hours=6, minutes=30) self.dt = datetime.datetime.utcnow() - returns = [0.0093,-0.0193,0.0351,0.0396,0.0338,-0.0211,0.0389,0.0326,-0.0137,-0.0411,-0.0032,0.0149,0.0133,0.0348,0.042,-0.0455,0.0262,-0.0461,0.0021,-0.0273,-0.0429,0.0427,-0.0104,0.0346,-0.0311,0.0003,0.0211,0.0248,-0.0215,0.004,0.0267,0.0029,-0.0369,0.0057,0.0298,-0.0179,-0.0361,-0.0401,-0.0123,-0.005,0.0203,-0.041,0.0011,0.0118,0.0103,-0.0184,-0.0437,0.0411,-0.0242,-0.0054,-0.0039,-0.0273,-0.0075,0.0064,-0.0376,0.0424,0.0399,0.019,0.0236,-0.0284,-0.0341,0.0266,0.05,0.0069,-0.0442,-0.016,0.0173,0.0348,-0.0404,-0.0068,-0.0376,0.0356,0.0043,-0.0481,-0.0134,0.0257,0.0442,0.0234,0.0394,0.0376,-0.0147,-0.0098,0.0474,-0.0102,0.0138,0.0286,0.0347,0.0279,-0.0067,0.0462,-0.0432,0.0247,0.0174,-0.0305,-0.0317,-0.0068,0.0264,-0.0257,-0.0328,0.0092,0.0288,-0.002,0.0288,0.028,-0.0093,0.0178,-0.0365,-0.0086,-0.0133,-0.0309,0.0473,-0.0149,0.0378,-0.0316,-0.0292,-0.0453,-0.0451,0.0093,0.0397,-0.0361,-0.0168,-0.0494,-0.0143,-0.0405,-0.0349,0.0069,0.0378,-0.0233,-0.0492,0.018,-0.0386,0.0339,0.0119,0.0454,0.0118,-0.011,-0.0254,0.0266,-0.0366,-0.0211,0.0399,0.0307,0.035,-0.0402,0.0304,-0.0031,0.0256,0.0134,-0.0019,-0.0235,-0.0058,-0.0117,0.0051,-0.0451,-0.0466,-0.0124,0.0283,-0.0499,0.0318,-0.0028,0.0203,0.005,0.0085,0.0048,0.0277,0.0159,-0.0149,0.035,0.0404,-0.01,0.0377,0.0302,0.0046,-0.0328,-0.0469,0.0071,-0.0382,-0.0214,0.0429,0.0145,-0.0279,-0.0172,0.0423,0.041,-0.0183,0.0137,-0.0412,-0.0348,0.0302,0.0248,0.0051,-0.0298,-0.0103,-0.0333,-0.0399,0.0485,-0.0166,0.0384,0.0259,-0.0163,0.0357,0.0308,-0.0386,0.0481,-0.0446,-0.0282,-0.0037,0.0202,0.0216,0.0113,0.0194,0.0392,0.0016,0.0268,-0.0155,-0.027,0.02,0.0216,-0.0009,0.022,0,0.041,0.0133,-0.0382,0.0495,-0.0221,-0.0329,-0.0033,-0.0089,-0.0129,-0.0252,0.048,-0.0307,-0.0357,0.0033,-0.0412,-0.0407,0.0455,0.0159,-0.0051,-0.0274,-0.0213,0.0361,0.0051,-0.0378,0.0084,0.0066,-0.0103,-0.0037,0.0478,-0.0278] start_date = datetime.datetime(year=2006, month=1, day=1, tzinfo=pytz.utc) - self.algo_returns_06 = factory.create_returns_from_list(returns, start_date, self.trading_calendar) + self.algo_returns_06 = factory.create_returns_from_list(RETURNS, start_date, self.trading_calendar) end_date = datetime.datetime(year=2006, month=12, day=31, tzinfo=pytz.utc) - self.metrics_06 = risk.riskmetrics(self.algo_returns_06, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + self.metrics_06 = risk.RiskReport(self.algo_returns_06, self.benchmark_returns, self.treasury_curves, self.trading_calendar) def tearDown(self): return @@ -37,14 +41,14 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=2006, month=1, day=1) returns = factory.create_returns_from_list([1.0,-0.5,0.8,.17,1.0,-0.1,-0.45], start_date, self.trading_calendar) #200, 100, 180, 210.6, 421.2, 379.8, 208.494 - metrics = risk.periodmetrics(returns[0].date, returns[-1].date, returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskMetrics(returns[0].date, returns[-1].date, returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual(metrics.max_drawdown, 0.505) def test_benchmark_returns_06(self): start_date = datetime.datetime(year=2006, month=1, day=1) end_date = datetime.datetime(year=2006, month=12, day=31) returns = factory.create_returns_from_range(start_date, end_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual([round(x.benchmark_period_returns, 4) for x in metrics.month_periods], [0.0255,0.0005,0.0111,0.0122,-0.0309,0.0001,0.0051,0.0213,0.0246,0.0315,0.0165,0.0126]) self.assertEqual([round(x.benchmark_period_returns, 4) for x in metrics.three_month_periods], @@ -57,7 +61,7 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=2006, month=1, day=1) end_date = datetime.datetime(year=2006, month=12, day=31) returns = factory.create_returns_from_range(start_date, end_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual([x.trading_days for x in metrics.year_periods],[251]) self.assertEqual([x.trading_days for x in metrics.month_periods],[20,19,23,19,22,22,20,23,20,22,21,20]) @@ -65,7 +69,7 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=2006, month=1, day=1) end_date = datetime.datetime(year=2006, month=12, day=31) returns = factory.create_returns_from_range(start_date, end_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual([round(x.benchmark_volatility, 3) for x in metrics.month_periods], [0.031,0.026,0.024,0.025,0.037,0.047,0.039,0.022,0.023,0.021,0.025,0.019]) self.assertEqual([round(x.benchmark_volatility, 3) for x in metrics.three_month_periods], @@ -127,7 +131,7 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=2008, month=1, day=1) end_date = datetime.datetime(year=2008, month=12, day=31) returns = factory.create_returns_from_range(start_date, end_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual([round(x.benchmark_period_returns, 3) for x in metrics.month_periods], [-0.061,-0.035,-0.006,0.048,0.011,-0.086,-0.01,0.012,-0.091,-0.169,-0.075,0.008]) self.assertEqual([round(x.benchmark_period_returns, 3) for x in metrics.three_month_periods], @@ -140,7 +144,7 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=2008, month=1, day=1) end_date = datetime.datetime(year=2008, month=12, day=31) returns = factory.create_returns_from_range(start_date, end_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual([x.trading_days for x in metrics.year_periods],[253]) self.assertEqual([x.trading_days for x in metrics.month_periods],[21,20,20,22,21,21,22,21,21,23,19,22]) @@ -148,7 +152,7 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=2008, month=1, day=1) end_date = datetime.datetime(year=2008, month=12, day=31) returns = factory.create_returns_from_range(start_date, end_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual([round(x.benchmark_volatility, 3) for x in metrics.month_periods], [0.07,0.058,0.082,0.054,0.041,0.057,0.068,0.06,0.157,0.244,0.195,0.145]) self.assertEqual([round(x.benchmark_volatility, 3) for x in metrics.three_month_periods], @@ -162,7 +166,7 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=2006, month=1, day=1) end_date = datetime.datetime(year=2006, month=12, day=31) returns = factory.create_returns_from_range(start_date, end_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) self.assertEqual([round(x.treasury_period_return, 4) for x in metrics.month_periods], [0.0037,0.0034,0.0039,0.0038,0.0040,0.0037,0.0043,0.0043,0.0038,0.0044,0.0043,0.0041]) self.assertEqual([round(x.treasury_period_return, 4) for x in metrics.three_month_periods], @@ -179,7 +183,7 @@ class Risk(unittest.TestCase): start_date = datetime.datetime(year=1991, month=1, day=1) returns = factory.create_returns(365 * 5 + 2, start_date, self.trading_calendar) #1992 and 1996 were leap years returns = returns[:-10] #truncate the returns series to end mid-month - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) total_months = 60 self.check_metrics(metrics, total_months, start_date) @@ -190,7 +194,7 @@ class Risk(unittest.TestCase): #because we may catch the leap of the last year, and i think this func is [start,end) ld = calendar.leapdays(start_date.year, start_date.year + years + 1) returns = factory.create_returns(365 * years + ld, start_date, self.trading_calendar) - metrics = risk.riskmetrics(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) + metrics = risk.RiskReport(returns, self.benchmark_returns, self.treasury_curves, self.trading_calendar) total_months = years * 12 self.check_metrics(metrics, total_months, start_date) @@ -235,4 +239,44 @@ class Risk(unittest.TestCase): actual=len(col) )) self.assert_month(start_date.month, col[-1].end_date.month) - self.assert_last_day(col[-1].end_date) \ No newline at end of file + self.assert_last_day(col[-1].end_date) + + +RETURNS = [ + 0.0093, -0.0193, 0.0351, 0.0396, 0.0338, -0.0211, 0.0389, + 0.0326, -0.0137, -0.0411, -0.0032, 0.0149, 0.0133, 0.0348, + 0.042 , -0.0455, 0.0262, -0.0461, 0.0021, -0.0273, -0.0429, + 0.0427, -0.0104, 0.0346, -0.0311, 0.0003, 0.0211, 0.0248, + -0.0215, 0.004 , 0.0267, 0.0029, -0.0369, 0.0057, 0.0298, + -0.0179, -0.0361, -0.0401, -0.0123, -0.005 , 0.0203, -0.041 , + 0.0011, 0.0118, 0.0103, -0.0184, -0.0437, 0.0411, -0.0242, + -0.0054, -0.0039, -0.0273, -0.0075, 0.0064, -0.0376, 0.0424, + 0.0399, 0.019 , 0.0236, -0.0284, -0.0341, 0.0266, 0.05 , + 0.0069, -0.0442, -0.016 , 0.0173, 0.0348, -0.0404, -0.0068, + -0.0376, 0.0356, 0.0043, -0.0481, -0.0134, 0.0257, 0.0442, + 0.0234, 0.0394, 0.0376, -0.0147, -0.0098, 0.0474, -0.0102, + 0.0138, 0.0286, 0.0347, 0.0279, -0.0067, 0.0462, -0.0432, + 0.0247, 0.0174, -0.0305, -0.0317, -0.0068, 0.0264, -0.0257, + -0.0328, 0.0092, 0.0288, -0.002 , 0.0288, 0.028 , -0.0093, + 0.0178, -0.0365, -0.0086, -0.0133, -0.0309, 0.0473, -0.0149, + 0.0378, -0.0316, -0.0292, -0.0453, -0.0451, 0.0093, 0.0397, + -0.0361, -0.0168, -0.0494, -0.0143, -0.0405, -0.0349, 0.0069, + 0.0378, -0.0233, -0.0492, 0.018 , -0.0386, 0.0339, 0.0119, + 0.0454, 0.0118, -0.011 , -0.0254, 0.0266, -0.0366, -0.0211, + 0.0399, 0.0307, 0.035 , -0.0402, 0.0304, -0.0031, 0.0256, + 0.0134, -0.0019, -0.0235, -0.0058, -0.0117, 0.0051, -0.0451, + -0.0466, -0.0124, 0.0283, -0.0499, 0.0318, -0.0028, 0.0203, + 0.005 , 0.0085, 0.0048, 0.0277, 0.0159, -0.0149, 0.035 , + 0.0404, -0.01 , 0.0377, 0.0302, 0.0046, -0.0328, -0.0469, + 0.0071, -0.0382, -0.0214, 0.0429, 0.0145, -0.0279, -0.0172, + 0.0423, 0.041 , -0.0183, 0.0137, -0.0412, -0.0348, 0.0302, + 0.0248, 0.0051, -0.0298, -0.0103, -0.0333, -0.0399, 0.0485, + -0.0166, 0.0384, 0.0259, -0.0163, 0.0357, 0.0308, -0.0386, + 0.0481, -0.0446, -0.0282, -0.0037, 0.0202, 0.0216, 0.0113, + 0.0194, 0.0392, 0.0016, 0.0268, -0.0155, -0.027 , 0.02 , + 0.0216, -0.0009, 0.022 , 0. , 0.041 , 0.0133, -0.0382, + 0.0495, -0.0221, -0.0329, -0.0033, -0.0089, -0.0129, -0.0252, + 0.048 , -0.0307, -0.0357, 0.0033, -0.0412, -0.0407, 0.0455, + 0.0159, -0.0051, -0.0274, -0.0213, 0.0361, 0.0051, -0.0378, + 0.0084, 0.0066, -0.0103, -0.0037, 0.0478, -0.0278 +] \ No newline at end of file