revised protocol to maintain original structure.

This commit is contained in:
fawce
2012-04-16 16:33:53 -04:00
parent 2fcb68f59e
commit 5fd30216e5
3 changed files with 44 additions and 77 deletions
+4 -15
View File
@@ -61,8 +61,6 @@ Performance Tracking
| | For details look at the comments for |
| | :py:meth:`zipline.finance.risk.RiskMetrics.to_dict`|
+-----------------+----------------------------------------------------+
| timestamp | System time evevent occurs in zipilne |
+-----------------+----------------------------------------------------+
Position Tracking
@@ -78,14 +76,10 @@ Position Tracking
+-----------------+----------------------------------------------------+
| last_sale_price | price at last sale of the security on the exchange |
+-----------------+----------------------------------------------------+
| last_sale_date | datetime of the last trade of the position's |
| | security on the exchange |
+-----------------+----------------------------------------------------+
| transactions | all the transactions that were acrued into this |
| | position. |
+-----------------+----------------------------------------------------+
| timestamp | System time event occurs in zipilne |
+-----------------+----------------------------------------------------+
Performance Period
==================
@@ -116,8 +110,7 @@ Performance Period
| returns | percentage returns for the entire portfolio over the |
| | period |
+---------------+------------------------------------------------------+
| timestamp | System time evevent occurs in zipilne |
+---------------+------------------------------------------------------+
"""
import datetime
@@ -227,7 +220,6 @@ class PerformanceTracker():
'cumulative_perf' : self.cumulative_performance.to_dict(),
'todays_perf' : self.todays_performance.to_dict(),
'cumulative_risk_metrics' : self.cumulative_risk_metrics.to_dict(),
'timestamp' : datetime.datetime.now(),
}
def log_order(self, order):
@@ -376,9 +368,7 @@ class Position():
'sid' : self.sid,
'amount' : self.amount,
'cost_basis' : self.cost_basis,
'last_sale_price' : self.last_sale_price,
'last_sale_date' : self.last_sale_date,
'timestamp' : datetime.datetime.now()
'last_sale_price' : self.last_sale_price
}
@@ -444,7 +434,7 @@ class PerformancePeriod():
self.max_leverage = 1.1 * self.max_capital_used / self.starting_cash
# add transaction to the list of processed transactions
self.processed_transactions.append(txn)
self.processed_transactions.append(txn.as_dict())
def round_to_nearest(self, x, base=5):
return int(base * round(float(x)/base))
@@ -476,7 +466,6 @@ class PerformancePeriod():
'ending_cash' : self.ending_cash,
'portfolio_value': self.ending_cash + self.ending_value,
'positions' : positions,
'timestamp' : datetime.datetime.now(),
'pnl' : self.pnl,
'returns' : self.returns,
'transactions' : self.processed_transactions,
+2 -2
View File
@@ -38,7 +38,7 @@ class TradeSimulationClient(qmsg.Component):
self.current_dt = trading_environment.period_start
self.last_iteration_dur = datetime.timedelta(seconds=0)
self.algorithm = None
self.max_wait = datetime.timedelta(seconds=10)
self.max_wait = datetime.timedelta(seconds=3)
self.last_msg_dt = datetime.datetime.utcnow()
assert self.trading_environment.frame_index != None
@@ -106,7 +106,7 @@ class TradeSimulationClient(qmsg.Component):
# drained. Signal the order_source that we're done, and
# the done will cascade through the whole zipline.
# shutdown the feedback loop to the OrderDataSource
wait_time = self.last_msg_dt - datetime.datetime.utcnow()
wait_time = datetime.datetime.utcnow() - self.last_msg_dt
if wait_time > self.max_wait:
self.signal_order_done()
+38 -60
View File
@@ -626,71 +626,43 @@ def PERF_FRAME(perf):
#TODO: add asserts...
#pull some special fields from the perf for easy access
date = perf['last_close']
# DATE fields:
# started_at, period_start, period_end, last_close, last_open
# pos.last_sale_date
# txn.dt
assert isinstance(perf['started_at'], datetime.datetime)
assert isinstance(perf['period_start'], datetime.datetime)
assert isinstance(perf['period_end'], datetime.datetime)
assert isinstance(perf['last_close'], datetime.datetime)
assert isinstance(perf['last_open'], datetime.datetime)
assert isinstance(perf['todays_perf'], dict)
assert isinstance(perf['cumulative_perf'], dict)
tp = perf['todays_perf']
cp = perf['cumulative_perf']
risk = perf['cumulative_risk_metrics']
# aggregate the day's transactions, which are nested in their
# respsective positions.
transactions = []
assert isinstance(tp['transactions'], list)
assert isinstance(cp['transactions'], list)
perf['started_at'] = EPOCH(perf['started_at'])
perf['period_start'] = EPOCH(perf['period_start'])
perf['period_end'] = EPOCH(perf['period_end'])
perf['last_close'] = EPOCH(perf['last_close'])
perf['last_open'] = EPOCH(perf['last_open'])
for txn in tp['transactions']:
cur = {
'date':EPOCH(txn.dt),
'amount': txn.amount,
'price': txn.price,
'sid':txn.sid
}
transactions.append(cur)
positions = []
for sid, pos in tp['positions'].iteritems():
cur = {
'cost_basis':pos['cost_basis'],
'sid' :pos['sid'],
'last_sale' :pos['last_sale_price'],
'amount' :pos['amount']
}
positions.append(cur)
daily_perf = {
'date' : EPOCH(date),
'returns' : tp['returns'],
'pnl' : tp['pnl'],
'market_value' : tp['ending_value'],
'portfolio_value' : tp['portfolio_value'],
'starting_cash' : tp['starting_cash'],
'ending_cash' : tp['ending_cash'],
'capital_used' : tp['capital_used'],
'transactions' : transactions,
'positions' : positions
}
cumulative_perf = {
'alpha' : risk['alpha'],
'beta' : risk['beta'],
'sharpe' : risk['sharpe'],
'volatility' : risk['algo_volatility'],
'benchmark_volatility' : risk['benchmark_volatility'],
'benchmark_returns' : risk['benchmark_period_return'],
'max_drawdown' : risk['max_drawdown'],
'total_returns' : cp['returns'],
'pnl' : cp['pnl'],
'capital_used' : cp['capital_used']
}
txn['dt'] = EPOCH(txn['dt'])
# nest the cumulative performance data in the daily.
daily_perf['cumulative'] = cumulative_perf
result = {
'started_at' : EPOCH(perf['started_at']),
'daily' : [daily_perf],
'percent_complete' : perf['progress'],
}
for txn in cp['transactions']:
txn['dt'] = EPOCH(txn['dt'])
return msgpack.dumps(tuple(['PERF', result]))
for dr in perf['returns']:
dr['dt'] = EPOCH(dr['dt'])
return msgpack.dumps(tuple(['PERF', perf]))
def RISK_FRAME(risk):
@@ -698,7 +670,7 @@ def RISK_FRAME(risk):
def PERF_UNFRAME(msg):
prefix, payload = msgpack.loads(msg)
prefix, payload = msgpack.loads(msg, use_list=True)
return dict(prefix=prefix, payload=payload)
# -----------------------
@@ -730,6 +702,12 @@ def EPOCH(utc_datetime):
ms = seconds * 1000
return ms
def UN_EPOCH(ms_since_epoch):
seconds_since_epoch = ms_since_epoch / 1000
delta = datetime.timedelta(seconds = seconds_since_epoch)
dt = UNIX_EPOCH + delta
return dt
def PACK_DATE(event):
"""
Packs the datetime property of event into msgpack'able longs.