changes net of code review with @sdiehl

This commit is contained in:
fawce
2012-03-07 18:22:55 -05:00
parent fe8a470167
commit 2ba7d526a6
4 changed files with 158 additions and 56 deletions
+20 -9
View File
@@ -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
+33 -22
View File
@@ -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
+45 -9
View File
@@ -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
+60 -16
View File
@@ -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)
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
]