Пример #1
0
    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)
Пример #2
0
 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
Пример #3
0
 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
Пример #4
0
 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
Пример #5
0
    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)
Пример #6
0
 def __simple_object__(self):
     return properties(self)
Пример #7
0
 def __simple_object__(self):
     return properties(self)
Пример #8
0
    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)