def _pub_account(self, POST_BAR): account = Environment.get_instance().portfolio.accounts['FUTURE'] positions = account.positions _data = { 'datetime': str(POST_BAR.bar_dict.dt), 'total_value': account.total_value, 'margin': account.margin, 'buy_margin': account.buy_margin, 'sell_margin': account.sell_margin, 'daily_pnl': account.daily_pnl, 'holding_pnl': account.holding_pnl, 'realized_pnl': account.realized_pnl, 'frozen_cash': account.frozen_cash, 'cash': account.cash, 'market_value': account.market_value, 'transaction_cost': account.transaction_cost } _data['topic'] = 'account' _data = json.dumps(_data) self._data_queue.put(_data) for p in positions: _pos = properties(positions[p]) # todo:性能优化 _pos['topic'] = 'position' for i, op in enumerate(_pos['open_orders']): op = properties(op) op['trading_datetime'] = str(op['trading_datetime']) op['datetime'] = str(op['datetime']) op['side'] = str(op['side']) op['position_effect'] = str(op['position_effect']) op['status'] = str(op['status']) op['type'] = str(op['type']) _pos['open_orders'][i] = op _pos = json.dumps(_pos) self._data_queue.put(_pos)
def _to_position_record(self, date, order_book_id, position): data = { k: self._safe_convert(v, 3) for k, v in six.iteritems(properties(position)) if not k.startswith('_') and not k.endswith('_') } data['order_book_id'] = order_book_id data['symbol'] = self._symbol(order_book_id) data['date'] = date
def _to_portfolio_record(self, date, portfolio): data = { k: self._safe_convert(v, 3) for k, v in six.iteritems(properties(portfolio)) if not k.startswith('_') and not k.endswith('_') and k not in { "positions", "start_date", "starting_cash" } } data['date'] = date return data
def _to_trade_record(self, trade): data = { k: self._safe_convert(v) for k, v in six.iteritems(properties(trade)) if not k.startswith('_') and not k.endswith('_') and k != 'order' } data['order_book_id'] = trade.order.order_book_id data['symbol'] = self._symbol(trade.order.order_book_id) data['datetime'] = data['datetime'].strftime("%Y-%m-%d %H:%M:%S") data['trading_datetime'] = data['trading_datetime'].strftime("%Y-%m-%d %H:%M:%S") return data
def _save_trade(self, Trade): trade_dict = properties(Trade.trade) trade_dict['datetime'] = trade_dict['datetime'] trade_dict['trading_datetime'] = trade_dict['trading_datetime'] trade_dict['side'] = trade_dict['side'].value trade_dict['position_effect'] = trade_dict['position_effect'].value t = pd.DataFrame([trade_dict]).set_index('datetime', drop=False) if self._trade_df is None: self._trade_df = t else: self._trade_df = self._trade_df.append(t)
def __simple_object__(self): return properties(self)
def __simple_object__(self): return properties(self)
def tear_down(self, code, exception=None): if code != EXIT_CODE.EXIT_SUCCESS or not self._enabled: return strategy_name = os.path.basename(self._env.config.base.strategy_file).split(".")[0] data_proxy = self._env.data_proxy summary = { 'strategy_name': strategy_name, } for k, v in six.iteritems(self._env.config.base.__dict__): if k in ["trading_calendar", "account_list", "timezone", "persist_mode", "resume_mode", "data_bundle_path", "handle_split", "persist"]: continue summary[k] = self._safe_convert(v, 2) risk = Risk(np.array(self._portfolio_daily_returns), np.array(self._benchmark_daily_returns), data_proxy.get_risk_free_rate(self._env.config.base.start_date, self._env.config.base.end_date), (self._env.config.base.end_date - self._env.config.base.start_date).days + 1) summary.update({ 'alpha': self._safe_convert(risk.alpha, 3), 'beta': self._safe_convert(risk.beta, 3), 'sharpe': self._safe_convert(risk.sharpe, 3), 'information_ratio': self._safe_convert(risk.information_ratio, 3), 'downside_risk': self._safe_convert(risk.annual_downside_risk, 3), 'tracking_error': self._safe_convert(risk.annual_tracking_error, 3), 'sortino': self._safe_convert(risk.sortino, 3), 'volatility': self._safe_convert(risk.annual_volatility, 3), 'max_drawdown': self._safe_convert(risk.max_drawdown, 3), }) summary.update({ k: self._safe_convert(v, 3) for k, v in six.iteritems(properties(self._latest_portfolio)) if k not in ["positions", "daily_returns", "daily_pnl"] }) if self._latest_benchmark_portfolio: summary['benchmark_total_returns'] = self._latest_benchmark_portfolio.total_returns summary['benchmark_annualized_returns'] = self._latest_benchmark_portfolio.annualized_returns trades = pd.DataFrame(self._trades) if 'datetime' in trades.columns: trades = trades.set_index('datetime') df = pd.DataFrame(self._total_portfolios) df['date'] = pd.to_datetime(df['date']) total_portfolios = df.set_index('date').sort_index() result_dict = { 'summary': summary, 'trades': trades, 'total_portfolios': total_portfolios, } if ExecutionContext.plots is not None: plots = ExecutionContext.plots.get_plots() plots_items = defaultdict(dict) for series_name, value_dict in six.iteritems(plots): for date, value in six.iteritems(value_dict): plots_items[date][series_name] = value plots_items[date]["date"] = date df = pd.DataFrame([dict_data for date, dict_data in six.iteritems(plots_items)]) df["date"] = pd.to_datetime(df["date"]) df = df.set_index("date").sort_index() result_dict["plots"] = df for account_type, account in six.iteritems(self._env.accounts): account_name = account_type.name.lower() portfolios_list = self._sub_portfolios[account_type] df = pd.DataFrame(portfolios_list) df["date"] = pd.to_datetime(df["date"]) portfolios_df = df.set_index("date").sort_index() result_dict["{}_portfolios".format(account_name)] = portfolios_df positions_list = self._positions[account_type] positions_df = pd.DataFrame(positions_list) if "date" in positions_df.columns: positions_df["date"] = pd.to_datetime(positions_df["date"]) positions_df = positions_df.set_index("date").sort_index() result_dict["{}_positions".format(account_name)] = positions_df self._result = result_dict if self._mod_config.output_file: with open(self._mod_config.output_file, 'wb') as f: pickle.dump(result_dict, f) if self._mod_config.plot: from rqalpha.plot import plot_result plot_result(result_dict) if self._mod_config.plot_save_file: from rqalpha.plot import plot_result plot_result(result_dict, False, self._mod_config.plot_save_file) if self._mod_config.report_save_path: from rqalpha.utils.report import generate_report generate_report(result_dict, self._mod_config.report_save_path)