diff --git a/zipline/algorithm.py b/zipline/algorithm.py index bc13270c..cddf0356 100644 --- a/zipline/algorithm.py +++ b/zipline/algorithm.py @@ -38,7 +38,7 @@ from zipline.finance.slippage import ( SlippageModel, transact_partial ) -from zipline.finance.commission import PerShare, PerTrade +from zipline.finance.commission import PerShare, PerTrade, PerDollar from zipline.finance.blotter import Blotter from zipline.finance.constants import ANNUALIZER from zipline.finance import trading @@ -419,7 +419,7 @@ class TradingAlgorithm(object): self.slippage = slippage def set_commission(self, commission): - if not isinstance(commission, (PerShare, PerTrade)): + if not isinstance(commission, (PerShare, PerTrade, PerDollar)): raise UnsupportedCommissionModel() if self.initialized: diff --git a/zipline/errors.py b/zipline/errors.py index 0f75bd6b..68e271c8 100644 --- a/zipline/errors.py +++ b/zipline/errors.py @@ -63,8 +63,8 @@ method. class UnsupportedCommissionModel(ZiplineError): """ Raised if a user script calls the override_commission magic - with a commission object that isn't a PerShare or - PerTrade commission + with a commission object that isn't a PerShare, PerTrade or + PerDollar commission """ msg = """ You attempted to override commission with an unsupported class. \ diff --git a/zipline/finance/commission.py b/zipline/finance/commission.py index 057e84f4..f86b8b02 100644 --- a/zipline/finance/commission.py +++ b/zipline/finance/commission.py @@ -66,3 +66,30 @@ class PerTrade(object): return 0.0, 0.0 return abs(self.cost / transaction.amount), self.cost + + +class PerDollar(object): + """ + Calculates a commission for a transaction based on a per + dollar cost. + """ + + def __init__(self, cost=0.0015): + """ + Cost parameter is the cost of a trade per-dollar. 0.0015 + on $1 million means $1,500 commission (=1,000,000 x 0.0015) + """ + self.cost = float(cost) + + def __repr__(self): + return "{class_name}(cost={cost})".format( + class_name=self.__class__.__name__, + cost=self.cost) + + def calculate(self, transaction): + """ + returns a tuple of: + (per share commission, total transaction commission) + """ + cost_per_share = transaction.price * self.cost + return cost_per_share, abs(transaction.amount) * cost_per_share