def main(): args = parser.parse_args() if args.draw: # parse arguments and collect data # price history if args.use_generated: gen = args.use_generated[0] src = args.use_generated[1] (data, _) = calc.generate_theoretical_data(gen, src) else: data = db.build_price_lut(args.draw[0]) dates = [date_obj(date) for date in sorted(data.keys())] prices = [data[date_str(date)] for date in dates] # indicators and plot counts if not args.indicators: args.indicators = [] plots = 1 indicators = {} for indicator_code in args.indicators: if indicator_code[0:4] == 'MACD': plots = 2 indicators[indicator_code] = calc.get_indicator(indicator_code, data, True) # plot main price data pyplot.subplot(plots * 100 + 11) pyplot.plot(dates, prices, label='{} price'.format(args.draw[0])) pyplot.legend(loc='upper left') # plot indicators for (indicator_code, series) in indicators.items(): code_parts = indicator_code.split('_') indicator = code_parts[0] if len(code_parts) > 1: period_code = code_parts[1] if indicator == 'MACD': pyplot.subplot(plots * 100 + 12) pyplot.plot(dates, series[0], label=indicator_code) pyplot.plot(dates, series[1], label='Signal_{}'.format(period_code)) pyplot.legend(loc='upper left') else: pyplot.subplot(plots * 100 + 11) pyplot.plot(dates, series, label=indicator_code) pyplot.legend(loc='upper left') pyplot.show() if args.generate: (part, full) = calc.generate_theoretical_data(args.generate[0], args.generate[1]) tgt_lut = db.build_price_lut(args.generate[0]) src_lut = db.build_price_lut(args.generate[1]) tgt_dates = [date_obj(d) for d in sorted(tgt_lut.keys())] src_dates = [date_obj(d) for d in sorted(part.keys())] tgt_gen_part_prices = [part[date_str(d)] for d in src_dates] tgt_gen_full_prices = [full[date_str(d)] for d in src_dates] src_prices = [src_lut[date_str(d)] for d in src_dates] pyplot.subplot(211) pyplot.plot([date_obj(d) for d in tgt_dates], tgt_gen_full_prices[-len(tgt_dates):], label='{}-generated'.format(args.generate[0])) pyplot.plot([date_obj(d) for d in tgt_dates], tgt_gen_part_prices[-len(tgt_dates):], label='{}'.format(args.generate[0])) pyplot.legend(loc='upper left') pyplot.subplot(212) pyplot.plot(src_dates, tgt_gen_part_prices, label='{}-generated'.format(args.generate[0])) pyplot.plot(src_dates, src_prices, label='{}'.format(args.generate[1])) pyplot.legend(loc='upper left') pyplot.show() if args.portfolio: # init main objects my_market = Market() my_portfolio = Portfolio() my_trader = Trader(args.portfolio[0], my_portfolio, my_market) # init simulator my_monitor = Monitor(my_trader, my_market) my_sim = Simulator() my_sim.add_trader(my_trader) my_sim.use_market(my_market) my_sim.use_monitor(my_monitor) (strategy, tickers, indicators) = db.build_strategy(args.strategy[0]) my_trader.add_assets_of_interest(strategy['assets']) my_trader.set_strategy(strategy['positions']) my_sim.use_stocks(tickers) my_sim.use_indicators(indicators) if args.contribute: my_trader.set_contributions(args.contribute[0], args.contribute[1]) if args.rebalance: my_trader.set_rebalancing_period(args.rebalance[0]) if args.use_generated: for i in range(len(args.use_generated) // 2): gen = args.use_generated[i * 2] src = args.use_generated[i * 2 + 1] (data, _) = calc.generate_theoretical_data(gen, src) my_market.inject_stock_data(gen, None, None, data) # run simulation my_sim.simulate() # print some stats print('##################################') print('# PERFORMANCE SUMMARY') print('##################################') print('initial: $' + currency(my_trader.starting_cash)) print('final: $' + currency(my_trader.portfolio.value())) print('trades: {}'.format(my_portfolio.trades)) print('---------------------------') print('Sharpe Ratio: {}'.format( my_monitor.get_statistic('sharpe_ratio'))) print('Sortino Ratio: {}'.format( my_monitor.get_statistic('sortino_ratio'))) print('---------------------------') print('CAGR: {}%'.format( percent(my_monitor.get_statistic('cagr')))) print('Adjusted CAGR: {}%'.format( percent(my_monitor.get_statistic('adjusted_cagr')))) print('---------------------------') print('best year: {}%'.format( percent(max(my_monitor.get_data_series('annual_returns')[1])))) print('worst year: {}%'.format( percent(min(my_monitor.get_data_series('annual_returns')[1])))) print('---------------------------') drawdown = my_monitor.get_statistic('max_drawdown') print('max drawdown: {}%'.format(percent(drawdown['amount']))) print(' between {} and {}, recovered by {}'.format( drawdown['from'], drawdown['to'], drawdown['recovered_by'])) # show plots (x, y) = my_monitor.get_data_series('portfolio_values') pyplot.subplot(411) pyplot.plot(x, y) pyplot.grid(b=False, which='major', color='grey', linestyle='-') (x, y) = my_monitor.get_data_series('asset_allocations') pyplot.subplot(412) pyplot.stackplot(x, y, alpha=0.5) pyplot.grid(b=True, which='major', color='grey', linestyle='-') pyplot.legend(sorted(strategy['assets']), loc='upper left') (x, y) = my_monitor.get_data_series('annual_returns') ax = pyplot.subplot(413) pyplot.bar(list(range(len(x))), y, 0.5, color='blue') ax.set_xticks(list(range(len(x)))) ax.set_xticklabels(x) pyplot.grid(b=True, which='major', color='grey', linestyle='-') (x, y) = my_monitor.get_data_series('contribution_vs_growth') pyplot.subplot(414) pyplot.stackplot(x, y, alpha=0.5) pyplot.grid(b=True, which='major', color='grey', linestyle='-') pyplot.legend(['Contributions', 'Growth'], loc='upper left') pyplot.show() exit()