ステップごとにイベント駆動型Pythonバックテストを行います。 パート4





以前の記事では、イベント指向のバックテストシステムとは何か、その機能に必要なクラス階層を整理し、そのようなシステムが市場データをどのように使用するか、ポジションを追跡して注文を生成する方法について説明しました。



今日は、仲介システムまたはその他の市場アクセスインターフェイスに関連付けられたシミュレートされた注文処理メカニズムを表すクラス階層を作成することにより、注文の実行に焦点を当てます。 また、テストされた戦略のパフォーマンスを評価するためのメトリックを検討します。



注文処理のクラス階層



記事のこの部分で説明するExecutionHandler



コンポーネントは、現在の市場価格でのみ注文を実行するため、非常に単純です。 これは絶対に非現実的なシナリオですが、その後の改善や複雑化の良い出発点として役立ちます。



以前に使用された抽象基本クラスの階層と同様に、abcライブラリから必要なエンティティとデコレータをインポートする必要があります。 また、 FillEvent



をインポートし、
 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








 OrderEvent: 
      



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 2526.5 = 1638 ( ). , 60: 2526.560 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .








OrderEvent:



# execution.py import datetime import Queue from abc import ABCMeta, abstractmethod from event import FillEvent, OrderEvent






ExecutionHandler



execute_order



:



# execution.py class ExecutionHandler(object): """ ExecutionHandler , Portfolio Fill, . . . """ __metaclass__ = ABCMeta @abstractmethod def execute_order(self, event): """ Order , Fill, Events. : event - Event """ raise NotImplementedError("Should implement execute_order()")





. , , . , , , , .



, FillEvent



fill_cost



None



(. execute_order



), NaivePortfolio



( ). “value”, .



ARCA. .



# execution.py class SimulatedExecutionHandler(ExecutionHandler): """ Fill, , .. . """ def __init__(self, events): """ , . : events - Event. """ self.events = events def execute_order(self, event): """ Order Fill, , , / . : event - Event . """ if event.type == 'ORDER': fill_event = FillEvent(datetime.datetime.utcnow(), event.symbol, 'ARCA', event.quantity, event.direction, None) self.events.put(fill_event)





. , .





- . :







R a , R b — , .



— , . , , .



.



Python

performance.py



, . , , NumPy Pandas:



# performance.py import numpy as np import pandas as pd





, — . , .



252 — . , , , . : 252 ∗ 6.5 = 1638 ( ). , 60: 252∗6.5∗60 = 98280.



create_sharpe_ratio



Pandas Series returns



.



# performance.py def create_sharpe_ratio(returns, periods=252): """ , ( ). : returns - Series Pandas - (252), (252*6.5), (252*6.5*60) ... """ return np.sqrt(periods) * (np.mean(returns)) / np.std(returns)





, ( ) , .



create_drawdowns



, , — . — «», .



pandas Series, . HWM (high water mark) — , .



HWM . , , , HWM. :



# performance.py def create_drawdowns(equity_curve): """ PnL . pnl_returns pandas Series. : pnl - pandas Series, . : drawdown, duration - """ # # High Water Mark # hwm = [0] eq_idx = equity_curve.index drawdown = pd.Series(index = eq_idx) duration = pd.Series(index = eq_idx) # for t in range(1, len(eq_idx)): cur_hwm = max(hwm[t-1], equity_curve[t]) hwm.append(cur_hwm) drawdown[t]= hwm[t] - equity_curve[t] duration[t]= 0 if drawdown[t] == 0 else duration[t-1] + 1 return drawdown.max(), duration.max()





, , . . , , Portfolio



, .



portfolio.py



:



# portfolio.py .. # from performance import create_sharpe_ratio, create_drawdowns





Portfolio



— , . NaivePortfolio



. output_summary_stats



— .



. pandas, :



# portfolio.py .. .. class NaivePortfolio(object): .. .. def output_summary_stats(self): """ — . """ total_return = self.equity_curve['equity_curve'][-1] returns = self.equity_curve['returns'] pnl = self.equity_curve['equity_curve'] sharpe_ratio = create_sharpe_ratio(returns) max_dd, dd_duration = create_drawdowns(pnl) stats = [("Total Return", "%0.2f%%" % ((total_return - 1.0) * 100.0)), ("Sharpe Ratio", "%0.2f" % sharpe_ratio), ("Max Drawdown", "%0.2f%%" % (max_dd * 100.0)), ("Drawdown Duration", "%d" % dd_duration)] return stats





. . performance.py



output_summary_stats



.







PS . ITinvest - .











All Articles