def negative_parser_main(): usage = """ Usage: ./negative_parser.py <negative XES LOG filename> [--verbose][--debug] """ if not check_argv(sys.argv, minimum=1, maximum=4): print usage ret = -1 else: ret = 0 try: filename = sys.argv[1] if not filename.endswith('.xes'): print filename, ' does not end in .xes. It should...' raise Exception('Filename has wrong extension') if not isfile(filename): raise Exception("El archivo especificado no existe") if '--debug' in sys.argv: pdb.set_trace() obj = NegativeParser(filename, verbose='--verbose' in sys.argv) obj.parse() if '--verbose' in sys.argv: print 'Parse done. Calcuting Parikhs vector' obj.parikhs_vector() print 'Se encontraron {0} puntos en un espacio de dimensión {1}'.format( len(obj.pv_set), obj.dim) if '--verbose' in sys.argv: print "#"*15 except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err raise err return ret
def main(*args, **kwargs): usage = """ Usage: ./xes_comparator_script.py <.ini config filename> Config file options: %s\n NOTE: Do you have the needed environment variables? - XES : Path to .xes file with traces (for running PacH) - PNML : Path to .pnml file with Petri net model (for simplifying PROM models) - NXES : Path to .xes file with negative traces - PETRI : Path where simplified .pnml files should be moved to after script ends - STATS : Path where statistic files should be moved to after script ends IMPORTANT: NO PATH MUST END IN '/' (it is added automatically) """%(config_options) if not check_argv(sys.argv, minimum=1, maximum=4): print usage ret = -1 else: ret = 0 try: config_file = sys.argv[1] if not config_file.endswith('.ini'): print config_file, ' does not end in .ini. It should...' raise Exception('Filename has wrong extension') if not isfile(config_file): raise Exception("No such file") if '--debug' in sys.argv: pdb.set_trace() for filename, arguments in parse_config(config_file): comparator = ComparatorXes(filename, **arguments) #comparator.comparator.check_hull(log_file=filename,event_dictionary=comparator.pach.event_dictionary) complexity = comparator.compare(log_file=filename,event_dictionary=comparator.pach.event_dictionary) comparator.generate_pnml() comparator.generate_outputs() if '--verbose' in sys.argv: print complexity pnml_folder,out_folder = parse_config_output(config_file) pwd = os.getcwd() for basename in os.listdir(pwd): if basename.endswith('.pnml'): pnml_file = os.path.join(pwd, basename) if os.path.isfile(pnml_file): shutil.copy2(pnml_file, pnml_folder) os.remove(pnml_file) elif basename.endswith('.out'): out_file = os.path.join(pwd, basename) if os.path.isfile(out_file): shutil.copy2(out_file, out_folder) os.remove(out_file) except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err logger.error('Error: %s' % err, exc_info=True) raise return ret
def get_ticker_risk_analysis(**kwargs): ''' function: This function 1. Uses `get_ticker_statistics` to calculate both RETURN & RISK descriptive statistics 2. Applies 'Capital Asset Pricing Model' to calculate α (alpha),β (beta) , correlation ρ For all this to succeed we define: - risk-free rate : the 3month Tbill - Market Index : S&P 500 ''' # 1 - check arguments if kwargs == {}: if not utils.check_argv( 5, "WARNING! Correct Usage: ./agora.py ticker-risk-analysis <ticker> <from> <to>" ): return ticker = sys.argv[2] start = sys.argv[3] end = sys.argv[4] printing = True else: ticker = kwargs['ticker'] start = kwargs['start'] end = kwargs['end'] printing = False # 2 # 2.1 - Get the data & descriptive statistics instrument = get_ticker_statistics(ticker=ticker, start=start, end=end) # 2.2 - Calculate [*] alpha α # [*] beta β # [*] correlation of instrument & market ρ instrument.risk_analysis() risk_analysis_statistics = instrument.risk_analysis_statistics # 3 - print result # RISK messages = [] messages.append( " Let's apply CAPM modelling for Risk Analysis [ Market : S&P500 , Instrument : {}] " .format(ticker)) messages.append(" Correlation [ρ] = {} ".format( round(risk_analysis_statistics['correlation'], 3))) messages.append(" Alpha [α] = {} ".format( round(risk_analysis_statistics['alpha'], 3))) messages.append(" Beta [β] = {} ".format( round(risk_analysis_statistics['beta'], 3))) messages.append(" Sharpe Ratio [SR] = {} ".format( round(risk_analysis_statistics['sharpe_ratio'], 3))) messages.append(" R Squared [R^2] = {} % ".format( round(risk_analysis_statistics['r_squared'] * 100, 3))) if printing: utils.pprint(messages) return instrument
def pnml_main(): usage = """ Usage: ./pnml.py <PNML filename> [--verbose][--debug][--check <XES Log filename>] """ if not check_argv(sys.argv, minimum=1, maximum=5): print usage ret = -1 else: ret = 0 try: filename = sys.argv[1] if not (filename.endswith('.pnml')): print filename, ' does not end in .pnml. It should...' raise Exception('Filename has wrong extension') if not isfile(filename): raise Exception("No such file") if '--debug' in sys.argv: pdb.set_trace() obj = PnmlParser(filename) obj.parse() if '--verbose' in sys.argv: print 'Parse done.' print obj.petrinet qhull = obj.petrinet.get_qhull() if '--check' in sys.argv or '-c' in sys.argv: lidx = '-c' in sys.argv and sys.argv.index('-c') or\ sys.argv.index('--check') log_file = sys.argv[lidx+1] if not (log_file.endswith('.xes')): print log_file, ' does not end in .xes. It should...' raise Exception('Filename does not end in .xes') if not isfile(log_file): raise Exception("No such file") qhull.all_in_file(log_file, event_dictionary=obj.event_dictionary) if '--verbose' in sys.argv: print 'Got qhull representation whith %s facets.'%(len(qhull.facets)) print 'This are them:\n' for facet in qhull.facets:print facet except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err logger.error('Error: %s' % err, exc_info=True) raise err return ret
def main(*args, **kwargs): usage = """ Usage: ./pnml_comparator_script.py <.ini config filename> """ if not check_argv(sys.argv, minimum=1, maximum=4): print usage ret = -1 else: ret = 0 try: config_file = sys.argv[1] if not config_file.endswith('.ini'): print config_file, ' does not end in .ini. It should...' raise Exception('Filename has wrong extension') if not isfile(config_file): raise Exception("El archivo especificado no existe") if '--debug' in sys.argv: pdb.set_trace() for filename, arguments in parse_config(config_file): comparator = ComparatorPnml(filename, **arguments) comparator.check_hull() complexity = comparator.compare() logger.info('%s complexity -> %s',filename,complexity) comparator.generate_pnml() comparator.generate_outputs() comparator.check_hull() pnml_folder,out_folder = parse_config_output(config_file) pwd = os.getcwd() for basename in os.listdir(pwd): if basename.endswith('.pnml'): pnml_file = os.path.join(pwd, basename) if os.path.isfile(pnml_file): shutil.copy2(pnml_file, pnml_folder) os.remove(pnml_file) elif basename.endswith('.out'): out_file = os.path.join(pwd, basename) if os.path.isfile(out_file): shutil.copy2(out_file, out_folder) os.remove(out_file) except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err raise err return ret
def main(*args, **kwargs): usage = """ Usage: ./pach_script.py <.ini config filename> """ if not check_argv(sys.argv, minimum=1, maximum=4): print usage ret = -1 else: ret = 0 try: config_file = sys.argv[1] if not config_file.endswith('.ini'): print config_file, ' does not end in .ini. It should...' raise Exception('Filename has wrong extension') if not isfile(config_file): raise Exception("No such file") if '--debug' in sys.argv: pdb.set_trace() for filename, arguments in parse_config(config_file): pach = PacH(filename, **arguments) complexity = pach.pach() pach.generate_pnml() if '--verbose' in sys.argv: print complexity pnml_folder,out_folder = parse_config_output(config_file) pwd= os.getcwd() for basename in os.listdir(pwd): if basename.endswith('.pnml'): pnml_file = os.path.join(pwd, basename) if os.path.isfile(pnml_file): shutil.copy2(pnml_file, pnml_folder) os.remove(pnml_file) elif basename.endswith('.out'): out_file = os.path.join(pwd, basename) if os.path.isfile(out_file): shutil.copy2(out_file, out_folder) os.remove(out_file) except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err logger.error('Error: %s' % err, exc_info=True) raise err return ret
def qhull_main(): usage = 'Usage: ./qhull.py <points> [--debug][--verbose]' if not check_argv(sys.argv, minimum=1, maximum=5): print usage ret = -1 else: ret = 0 try: import ast try: if isfile(sys.argv[1]): print sys.argv[1], 'assumed to be a file' with open(sys.argv[1], 'r') as ffile: points = ffile.readline() else: points = sys.argv[1] points = ast.literal_eval(points) if '--verbose' in sys.argv: print "Se colectaron ", len(points), " puntos" points = set(map(lambda x: tuple(x),points)) if '--verbose' in sys.argv: print "Se colectaron ", len(points), " puntos DIFERENTES" except: ret = -1 print "We are sorry. We weren't able to read the points" else: if '--debug' in sys.argv: pdb.set_trace() qhull = Qhull(points) point_qty = qhull.compute() print "Computed MCH with ", point_qty," points" if '--verbose' in sys.argv: print 'This are the points:' print(qhull.vertices) except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err logger.error('Error: %s' % err, exc_info=True) raise err
def get_tickers(): ''' function: This function displays all the available ticker symbols that start with `letter` arguments: [*] letter : the letter from which symbols start. Available Options : -> a - z, A - Z, all (everything) ''' # 1 - check arguments if not utils.check_argv(3, "WARNING! Correct Usage: ./agora.py tickers <L>"): return letter = sys.argv[2] # 2 - check parameter validity try: letter.isalpha() or letter == 'all' except ValueError: raise ValueError( "ERR#0012: There is no ticker starting with this letter.") # 3 - function if letter == 'all': tickers_to_display = tickers else: tickers_to_display = tickers.loc[tickers['Symbol'].str.startswith( letter)] utils.display(tickers_to_display) if letter == 'all': print("Total no. of tickers : {} / {}".format(len(tickers_to_display), len(tickers))) else: print("Total no. of tickers starting with '{}' : {} / {}".format( letter, len(tickers_to_display), len(tickers))) return
def parser_main(): usage = """ Usage: ./parser.py <LOG filename> [--verbose][--debug] """ if not check_argv(sys.argv, minimum=1, maximum=4): print usage ret = -1 else: ret = 0 try: if '--debug' in sys.argv: pdb.set_trace() filename = sys.argv[1] if not (filename.endswith('.xes') or filename.endswith('.txt')): print filename, ' does not end in .xes nor .txt. It should...' raise Exception('Filename has wrong extension') if not isfile(filename): raise Exception("No such file") if filename.endswith('.xes'): obj = XesParser(filename) elif filename.endswith('.txt'): obj = AdHocParser(filename) obj.parse() if '--verbose' in sys.argv: print 'Parse done. Calcuting Parikhs vector' obj.parikhs_vector() print 'Se encontraron {0} puntos en un espacio de dimensión {1}'.format( len(obj.pv_set), obj.dim) if '--verbose' in sys.argv: print "#"*15 except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err logger.error('Error: %s' % err, exc_info=True) raise err return ret
def portfolio_construction(**kwargs): ''' function: This function : 1. Uses `get_tickers_statistics` N times, 1 for each ticker instrument to calculate the descriptive metrics 2. Capital Allocation : Randomly. In other words . One decision we have to make is how we should allocate our budget to each of instrument in our portfolio. If our total budget is 1, then we can decide the weights for each stock, so that the sum of weights will be 1. And the value for weights will be the portion of budget we allocate to a specific stock. For example, if weight is 0.5 for Amazon, it means that we allocate 50% of our budget to Amazon. args: [*] N : Number of tickers [*] ticker_list : The ticker list of which portfolio will be constructed [*] start : Date formatted as `dd/mm/yyyy`, since when data is going to be retrieved. [*] end : Date formatted as `dd/mm/yyyy`, until when data is going to be retrieved. ''' # 1 - check arguments if kwargs == {}: num_tickers = int(sys.argv[2]) if not utils.check_argv( 5 + num_tickers, "WARNING! Correct Usage: ./agora.py portfolio-construction <N> <ticker1> <ticker2> .. <tickerN> <from> <to>" ): return ticker_list = [] for i in range(3, num_tickers + 3): ticker_list.append(sys.argv[i]) start = sys.argv[num_tickers + 3] end = sys.argv[num_tickers + 4] printing = True else: ticker_list = kwargs['ticker_list'] start = kwargs['start'] end = kwargs['end'] printing = False # [2.0] - Get the risk-free & returns merged # [2.1] - Get the descriptive statistics for the N tickers/instruments # [2.2] - Create a portfolio object. # [2.3] - Initialize weights # [2.4] - Calculate portfolio descriptice statistics instrument_list, descriptive_df = get_tickers_statistics( ticker_list=ticker_list, start=start, end=end) risk_free = utils.risk_free_return( date_range=instrument_list[0].date_range) returns_merged = utils.merge_instrument_returns( instrument_list=instrument_list, ticker_list=ticker_list) portfolio = Portfolio(instrument_list=instrument_list, ticker_list=ticker_list, returns_merged=returns_merged, risk_free=risk_free) #-------------------------------------------------------------------------------------------------------------------------# # [3] - show the capital allocation (weights) & the statistics message = " * Random Portfolio * " portfolio.initialize_weights() portfolio.calculate_statistics() portfolio.track_progress(printing, message, True) message = " * Unoptimized Risky Portfolio (stocks = 0.45, bonds = 0.35, commodities = 0.1) * " portfolio.weights = np.array([0.45 / 7] * 7 + [0.35 / 2] * 2 + [0.1 / 2] * 2).flatten() portfolio.calculate_statistics() portfolio.track_progress(printing, message, True) message = " * Unoptimized Total Portfolio (stocks = 0.45, bonds = 0.35, commodities = 0.1, risk-free = 0.1) * " portfolio.track_progress(printing, message, False) #-------------------------------------------------------------------------------------------------------------------------# # [3] - Plot the data points for these 3 portfolios (random, risky, total portfolio) title = "initial_portfolios" portfolio_arr = ["Random", "Unoptimized Risky", "Unoptimized Total"] portfolio.plot_initial_portfolios(title, portfolio_arr, descriptive_df) return portfolio
def get_tickers_risk_analysis(**kwargs): ''' function: This function 1. Uses `get_ticker_risk_analysis` N times, 1 for each ticker instrument. For each instrument 1.1. Uses `get_ticker_statistics` to calculate both RETURN & RISK descriptive statistics 1.2. Applies 'Capital Asset Pricing Model' to calculate α (alpha),β (beta) , correlation ρ For all this to succeed we define: - risk-free rate : the 3month Tbill - Market Index : S&P 500 args: [*] N : Number of tickers [*] ticker_list : The ticker list for which historical data are retrieved [*] start : Date formatted as `dd/mm/yyyy`, since when data is going to be retrieved. [*] end : Date formatted as `dd/mm/yyyy`, until when data is going to be retrieved. ''' # 1 - check arguments if kwargs == {}: num_tickers = int(sys.argv[2]) if not utils.check_argv( 5 + num_tickers, "WARNING! Correct Usage: ./agora.py ticker-risk-analysis <N> <ticker1> <ticker2> .. <tickerN> <from> <to>" ): return ticker_list = [] for i in range(3, num_tickers + 3): ticker_list.append(sys.argv[i]) start = sys.argv[num_tickers + 3] end = sys.argv[num_tickers + 4] printing = True else: ticker_list = kwargs['ticker_list'] start = kwargs['start'] end = kwargs['end'] printing = False # 2 - Retrieve Data & Calculate Descriptive statistics for each ticker: get_tickers_statistics(ticker_list=ticker_list, start=start, end=end) instrument_list = [] alpha_list, beta_list, correlation_list = [], [], [] sharpe_ratio_list, r_squared_list = [], [] for ticker in ticker_list: instrument = get_ticker_risk_analysis(ticker=ticker, start=start, end=end) alpha_list.append(instrument.risk_analysis_statistics['alpha']) beta_list.append(instrument.risk_analysis_statistics['beta']) correlation_list.append( instrument.risk_analysis_statistics['correlation']) sharpe_ratio_list.append( instrument.risk_analysis_statistics['sharpe_ratio']) r_squared_list.append( instrument.risk_analysis_statistics['r_squared'] * 100) # 3 - Convert Descriptive statistics from list to dataframes risk_analysis_dict = { "Alpha": alpha_list, "Beta": beta_list, "Correlation with S&P500": correlation_list, "Sharpe Ratio": sharpe_ratio_list, "R^2": r_squared_list } risk_analysis_df = pd.DataFrame(risk_analysis_dict) risk_analysis_df.index = ticker_list # 4 - Display results utils.display(risk_analysis_df) return instrument_list, risk_analysis_df
def get_tickers_statistics(**kwargs): ''' function: This function 1. Uses `get_ticker_statistics` N times, 1 for each ticker instrument. For each instrument 1.1 Uses `ticker_historical_data` to retrieve all the price data for a ticker in the following format : Date || Open | High | Low | Close | Adj Close | -----||------|------|-----|-------|-----------| xxxx || xxxx | xxxx | xxx | xxxxx | xxxxxxxxx | 1.2. Calculate both RETURN & RISK descriptive statistics args: [*] N : Number of tickers [*] ticker_list : The ticker list for which historical data are retrieved [*] start : Date formatted as `dd/mm/yyyy`, since when data is going to be retrieved. [*] end : Date formatted as `dd/mm/yyyy`, until when data is going to be retrieved. ''' # 1 - check arguments if kwargs == {}: num_tickers = int(sys.argv[2]) if not utils.check_argv( 5 + num_tickers, "WARNING! Correct Usage: ./agora.py ticker-statistics <N> <ticker1> <ticker2> .. <tickerN> <from> <to>" ): return ticker_list = [] for i in range(3, num_tickers + 3): ticker_list.append(sys.argv[i]) start = sys.argv[num_tickers + 3] end = sys.argv[num_tickers + 4] printing = True else: ticker_list = kwargs['ticker_list'] start = kwargs['start'] end = kwargs['end'] printing = False # 2 - Retrieve Data & Calculate Descriptive statistics for each ticker: instrument_list = [] expected_annual_return_list = [] annual_std_list = [] for ticker in ticker_list: instrument = get_ticker_statistics(ticker=ticker, start=start, end=end) instrument_list.append(instrument) expected_annual_return_list.append( instrument.return_statistics['expected_annual_return'] * 100) annual_std_list.append(instrument.risk_statistics['annual_std']) # 3 - Convert Descriptive statistics from list to dataframes descriptive_dict = { "Expected Annual Return": expected_annual_return_list, "Annual Standard Deviation": annual_std_list } descriptive_df = pd.DataFrame(descriptive_dict) descriptive_df.index = ticker_list # 4 - Display results utils.display(descriptive_df) return instrument_list, descriptive_df
def get_ticker_statistics(**kwargs): ''' function: This function 1. Uses `ticker_historical_data` to retrieve all the price data for a ticker in the following format : Date || Open | High | Low | Close | Adj Close | -----||------|------|-----|-------|-----------| xxxx || xxxx | xxxx | xxx | xxxxx | xxxxxxxxx | 2. Calculate both RETURN & RISK descriptive statistics args: [*] ticker : The ticker for which historical data are retrieved [*] start. : Date formatted as `dd/mm/yyyy`, since when data is going to be retrieved. [*] end : Date formatted as `dd/mm/yyyy`, until when data is going to be retrieved. ''' # 1 - check arguments if kwargs == {}: if not utils.check_argv( 5, "WARNING! Correct Usage: ./agora.py ticker-statistics <ticker> <from> <to>" ): return ticker = sys.argv[2] start = sys.argv[3] end = sys.argv[4] printing = True else: ticker = kwargs['ticker'] start = kwargs['start'] end = kwargs['end'] printing = False # 2 # 2.1 - Get the data instrument = get_ticker_historical_data(ticker=ticker, start=start, end=end) # 2.2 - Calculate [*] return # [*] log return # [*] expected daily return # [*] expected return instrument.calculate_statistics() return_statistics = instrument.return_statistics risk_statistics = instrument.risk_statistics # 4 - print result # RETURN messages = [] messages.append(" Expected Total Return ({} days) = {} %".format( len(instrument.data), round(return_statistics['expected_total_return'] * 100, 3))) messages.append(" Expected Annual Return (252 days) = {} % ".format( round(return_statistics['expected_annual_return'] * 100, 3))) messages.append(" APR = {} % ".format( round(return_statistics['APR'] * 100, 3))) messages.append(" APY = {} % ".format( round(return_statistics['APY'] * 100, 3))) if printing: utils.pprint(messages) # RISK messages = [] messages.append(" Total Standard Deviation ({} days) = {} ".format( len(instrument.data), round(risk_statistics['total_std'], 3))) messages.append(" Annual Standard Deviation (252 days) = {} ".format( round(risk_statistics['annual_std'], 3))) messages.append(" Total Variance ({} days) = {} ".format( len(instrument.data), round(risk_statistics['total_var'], 3))) messages.append(" Annual Variance (252 days) = {} ".format( round(risk_statistics['annual_var'], 3))) if printing: utils.pprint(messages) return instrument
def xes_comparator_main(): usage = 'Usage: ./comparator.py <LOG filename> [--debug]'\ '\n\t[--negative <Negative XES points filename>] [max_coeficient]]'\ '\n\t[--sampling [<number of samplings>] [<sampling size>]]'\ '\n\t[--projection [<max group size>] [<connected model>]]'\ '\n\t[--smt-matrix [<timeout>]]'\ '\n\t[--smt-iter [<timeout>]]' if not check_argv(sys.argv, minimum=1, maximum=16): print usage ret = -1 else: ret = 0 args = {} try: filename = sys.argv[1] if not (filename.endswith('.xes') or filename.endswith('.txt')): print filename, ' does not end in .xes not .txt. It should...' raise Exception('Filename does not end in .xes') if not isfile(filename): raise Exception("El archivo especificado no existe") if '--sampling' in sys.argv or '-s' in sys.argv: samp_idx = '-s' in sys.argv and sys.argv.index('-s') or\ sys.argv.index('--sampling') try: args['samp_num'] = int(sys.argv[samp_idx+1]) except: pass try: args['samp_size'] = int(sys.argv[samp_idx+2]) except: pass if '--projection' in sys.argv or '-p' in sys.argv: # None indicates not to do projection. # False indicates no limit args['proj_size'] = False proj_idx = '-p' in sys.argv and sys.argv.index('-p') or\ sys.argv.index('--projection') try: args['proj_size'] = int(sys.argv[proj_idx+1]) except: pass try: args['proj_connected'] = int(sys.argv[proj_idx+2]) except: pass if '--negative' in sys.argv or '-n' in sys.argv: nidx = '-n' in sys.argv and sys.argv.index('-n') or\ sys.argv.index('--negative') nfilename = sys.argv[nidx+1] if not (nfilename.endswith('.xes') or nfilename.endswith('.txt')): print nfilename, ' does not end in .xes. It should...' raise Exception('Filename does not end in .xes') if not isfile(nfilename): raise Exception("El archivo especificado no existe") args['nfilename'] = nfilename try: args['max_coef'] = int(sys.argv[nidx+2]) except: pass if '--smt-matrix' in sys.argv or '-smt-m' in sys.argv: smt_idx = '-smt-m' in sys.argv and sys.argv.index('-smt-m') or\ sys.argv.index('--smt-matrix') try: args['smt_timeout_matrix'] = int(sys.argv[smt_idx+1]) except: pass elif '--smt-iter' in sys.argv or '-smt-i' in sys.argv: smt_idx = '-smt-i' in sys.argv and sys.argv.index('-smt-i') or\ sys.argv.index('--smt-iter') args['smt_iter'] = True try: args['smt_timeout_iter'] = int(sys.argv[smt_idx+1]) except: pass if '--debug' in sys.argv: pdb.set_trace() comparator = ComparatorXes(filename, **args) complexity = comparator.compare() comparator.generate_pnml() comparator.generate_outputs() if '--verbose' in sys.argv: print complexity except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err raise err return ret
def pach_main(): usage = 'Usage: ./pach.py <LOG filename> [--debug][--verbose]'\ '\n\t[--negative <Negative points filename>] [max_coeficient]]'\ '\n\t[--sampling [<number of samplings>] [<sampling size>]]'\ '\n\t[--projection [<max group size>] [<connected model>]]'\ '\n\t[--smt-matrix [<timeout>]]'\ '\n\t[--smt-iter [<timeout>]]'\ '\n\t[--sanity-check]'\ '\nIf using config file, this are the options: \n%s'%config_options if not check_argv(sys.argv, minimum=1, maximum=17): print usage ret = -1 else: ret = 0 args = {} try: filename = sys.argv[1] if not (filename.endswith('.xes') or filename.endswith('.txt')): print filename, ' does not end in .xes not .txt. It should...' raise Exception('Filename does not end in .xes') if not isfile(filename): raise Exception("No such file") if '--sampling' in sys.argv or '-s' in sys.argv: samp_idx = '-s' in sys.argv and sys.argv.index('-s') or\ sys.argv.index('--sampling') try: args['samp_num'] = int(sys.argv[samp_idx+1]) except: pass try: args['samp_size'] = int(sys.argv[samp_idx+2]) except: pass if '--projection' in sys.argv or '-p' in sys.argv: # None indicates not to do projection. # False indicates no limit args['proj_size'] = False proj_idx = '-p' in sys.argv and sys.argv.index('-p') or\ sys.argv.index('--projection') try: args['proj_size'] = int(sys.argv[proj_idx+1]) except: pass try: args['proj_connected'] = int(sys.argv[proj_idx+2]) except: pass if '--negative' in sys.argv or '-n' in sys.argv: nidx = '-n' in sys.argv and sys.argv.index('-n') or\ sys.argv.index('--negative') nfilename = sys.argv[nidx+1] if not (nfilename.endswith('.xes') or nfilename.endswith('.txt')): print nfilename, ' does not end in .xes not .txt. It should...' raise Exception('Filename does not end in .xes') if not isfile(nfilename): raise Exception("No such file") args['nfilename'] = nfilename try: args['max_coef'] = int(sys.argv[nidx+2]) except: pass if '--smt-matrix' in sys.argv or '-smt-m' in sys.argv: smt_idx = '-smt-m' in sys.argv and sys.argv.index('-smt-m') or\ sys.argv.index('--smt-matrix') args['smt_matrix'] = True try: args['smt_timeout'] = int(sys.argv[smt_idx+1]) except: pass elif '--smt-iter' in sys.argv or '-smt-i' in sys.argv: smt_idx = '-smt-i' in sys.argv and sys.argv.index('-smt-i') or\ sys.argv.index('--smt-iter') args['smt_iter'] = True try: args['smt_timeout'] = int(sys.argv[smt_idx+1]) except: pass if '--sanity-check' in sys.argv: args['sanity_check'] = True if '--verbose' in sys.argv: args['verbose'] = True if '--debug' in sys.argv: pdb.set_trace() pach = PacH(filename, **args) complexity = pach.pach() filename = None if '--output' in sys.argv or '-o' in sys.argv: file_idx = '-o' in sys.argv and sys.argv.index('-o') or\ sys.argv.index('--output') try: filename = sys.argv[file_idx+1] except: pass pach.generate_pnml(filename=filename) except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err logger.error('Error: %s' % err, exc_info=True) raise err return ret
def portfolio_optimization(**kwargs): ''' function: This function : 1. Uses `get_tickers_statistics` N times, 1 for each ticker instrument to calculate the descriptive metrics 2. Calls `portfolio_construction` for `num_port` times to construct `num_port` random portfolios 2.1 Initialize random weights for the corresponding porftolio. 3. Then by locating the one with the highest Sharpe ratio portfolio, it displays [*] Maximum Sharpe ratio portfolio as red star sign. [*] Minimum volatility portfolio as green start sign All the randomly generated portfolios will be also plotted with colour map applied to them based on the Sharpe ratio. The bluer, the higher Sharpe ratio. 4. For these two optimal portfolios, it will also show how it allocates the budget within the portfolio. args: [*] P : Number of portfolios [*] N : Number of tickers [*] ticker_list : The ticker list of which portfolio will be constructed [*] start : Date formatted as `dd/mm/yyyy`, since when data is going to be retrieved. [*] end : Date formatted as `dd/mm/yyyy`, until when data is going to be retrieved. ''' # 1 - check arguments if kwargs == {}: num_portfolios = int(sys.argv[2]) num_tickers = int(sys.argv[3]) if not utils.check_argv( 6 + num_tickers, "WARNING! Correct Usage: ./agora.py portfolio-construction <N> <ticker1> <ticker2> .. <tickerN> <from> <to>" ): return ticker_list = [] for i in range(4, num_tickers + 4): ticker_list.append(sys.argv[i]) start = sys.argv[num_tickers + 4] end = sys.argv[num_tickers + 5] printing = True else: num_portfolios = kwargs['num_portfolios'] ticker_list = kwargs['ticker_list'] start = kwargs['start'] end = kwargs['end'] printing = False # 2 - Get the instrument list along with their calculated descriptive statistics instrument_list, descriptive_df = get_tickers_statistics( ticker_list=ticker_list, start=start, end=end) stocks_idx = [ idx for idx in range(len(ticker_list)) if ticker_list[idx] in stocks_tickers ] risk_free = utils.risk_free_return( date_range=instrument_list[0].date_range) returns_merged = utils.merge_instrument_returns( instrument_list=instrument_list, ticker_list=ticker_list) # 3 - Portfolio simulation all_weights, ret_arr, std_arr, sharpe_arr = [], [], [], [] for i in range(num_portfolios): if i % 100 == 0: print("{} out of {}\n".format(i, num_portfolios), end='') portfolio = Portfolio(instrument_list=instrument_list, returns_merged=returns_merged, ticker_list=ticker_list, risk_free=risk_free) # weights portfolio.initialize_weights() w_stocks = sum([w[i] for i in portfolio.weights if i in stocks_idx]) # return, std, sharpe ratio portfolio.calculate_statistics() portfolio_statistics = portfolio.statistics R_P = portfolio_statistics['portfolio_annual_return'] STP_P = portfolio_statistics['portfolio_annual_std'] SR_P = portfolio_statistics['portfolio_annual_sr'] # append results all_weights.append(portfolio.weights) ret_arr.append(R_P) std_arr.append(STP_P) sharpe_arr.append(SR_P) # 4 - Calculate 2 most efficient portfolios. # [1] Max Sharpe Ratio Portfolio opt_idx = np.argmax(sharpe_arr) opt_sr, opt_ret, opt_std = sharpe_arr[opt_idx], ret_arr[opt_idx], std_arr[ opt_idx] opt_weights = all_weights[opt_idx] messages = [] messages.append( " * Max Sharpe Ratio optimized Portfolio * ") messages.append(" Portfolio Annual Return (252 days) = {} % ".format( round(opt_ret * 100, 3))) messages.append( " Portfolio Annual Standard Deviation (252 days) = {} ".format( round(opt_std, 3))) messages.append( " Portfolio Annual Sharpe Ratio (252 days) = {} ".format( round(opt_sr, 3))) if printing: utils.pprint(messages) # [2] Min Standard Deviation Ratio portfolio min_idx = np.argmin(std_arr) min_sr, min_ret, min_std = sharpe_arr[min_idx], ret_arr[min_idx], std_arr[ min_idx] min_weights = all_weights[min_idx] messages = [] messages.append( " * Min Standard Deviation optimized Portfolio * ") messages.append(" Portfolio Annual Return (252 days) = {} % ".format( round(min_ret * 100, 3))) messages.append( " Portfolio Annual Standard Deviation (252 days) = {} ".format( round(min_std, 3))) messages.append( " Portfolio Annual Sharpe Ratio (252 days) = {} ".format( round(min_sr, 3))) if printing: utils.pprint(messages) # [3] weight allocation for both efficient portfolios weights_dict = { "Max SR Allocation Weights": opt_weights * 100, 'Min σ Allocation Weights': min_weights * 100 } weights_df = pd.DataFrame(weights_dict) weights_df.index = ticker_list if printing: utils.display(weights_df) # 5 - Plot the portfolios along with the 2 efficient portfolios. title = "{}_portfolio_simulation".format(num_portfolios) portfolio.plot_portfolio_simulation(title, instrument_list[0].date_range, std_arr, ret_arr, sharpe_arr, descriptive_df, returns_merged) return
def get_ticker_historical_data(**kwargs): ''' function: This function retrieves all the price data for a ticker in the following format : Date || Open | High | Low | Close | Adj Close | -----||------|------|-----|-------|-----------| xxxx || xxxx | xxxx | xxx | xxxxx | xxxxxxxxx | args: [*] ticker : The ticker for which historical data are retrieved [*] from_date : Date formatted as `dd/mm/yyyy`, since when data is going to be retrieved. [*] to_date : Date formatted as `dd/mm/yyyy`, until when data is going to be retrieved. ''' # 1 - check arguments if kwargs == {}: if not utils.check_argv( 5, "WARNING! Correct Usage: ./agora.py ticker-data <ticker> <start> <end>" ): return ticker = sys.argv[2] start = sys.argv[3] end = sys.argv[4] printing = True else: ticker = kwargs['ticker'] start = kwargs['start'] end = kwargs['end'] printing = False # 2 - check parameter validity # TICKER try: ticker in tickers['Symbol'] except ValueError: raise ValueError( "ERR#0012: There is no ticker with that name. Check available tickers symbols with : `./agora.py tickers *`" ) # DATETIMES try: datetime.strptime(start, '%d/%m/%Y') except ValueError: raise ValueError( "ERR#0001: incorrect start date format, it should be 'dd/mm/yyyy'." ) try: datetime.strptime(end, '%d/%m/%Y') except ValueError: raise ValueError( "ERR#0002: incorrect en dformat, it should be 'dd/mm/yyyy'.") start = datetime.strptime(start, '%d/%m/%Y') end = datetime.strptime(end, '%d/%m/%Y') if start >= end: raise ValueError( "ERR#0003: `end` should be greater than `start`, both formatted as 'dd/mm/yyyy'." ) date_range = {'start': start, 'end': end} # 3 - Retrieve instrument data instrument = Instrument(ticker, date_range) if printing: utils.display(instrument.data.tail(15)) # 4 - print result messages = [" Trading for T = {} days ".format(len(instrument.data))] if printing: utils.pprint(messages) return instrument
def pnml_comparator_main(): usage = """ Usage: ./comparator_pnml.py <PNML filename> [--debug] '\n\t[--negative <Negative XES points filename>] [max_coeficient]]'\ '\n\t[--smt-matrix [<timeout>]]'\ '\n\t[--smt-iter [<timeout>]]' """ if not check_argv(sys.argv, minimum=1, maximum=10): print usage ret = -1 else: ret = 0 try: args = {} filename = sys.argv[1] if not (filename.endswith('.pnml')): print filename, ' does not end in .pnml. It should...' raise Exception('Filename has wrong extension') if not isfile(filename): raise Exception("El archivo especificado no existe") if '--negative' in sys.argv or '-n' in sys.argv: nidx = '-n' in sys.argv and sys.argv.index('-n') or\ sys.argv.index('--negative') nfilename = sys.argv[nidx+1] if not (nfilename.endswith('.xes')): print nfilename, ' does not end in .xes. It should...' raise Exception('Filename does not end in .xes') if not isfile(nfilename): raise Exception("El archivo especificado no existe") args['nfilename'] = nfilename try: args['max_coef'] = int(sys.argv[nidx+2]) except: pass if '--smt-matrix' in sys.argv or '-smt-m' in sys.argv: smt_idx = '-smt-m' in sys.argv and sys.argv.index('-smt-m') or\ sys.argv.index('--smt-matrix') try: args['smt_timeout_matrix'] = int(sys.argv[smt_idx+1]) except: pass elif '--smt-iter' in sys.argv or '-smt-i' in sys.argv: smt_idx = '-smt-i' in sys.argv and sys.argv.index('-smt-i') or\ sys.argv.index('--smt-iter') args['smt_iter'] = True try: args['smt_timeout_iter'] = int(sys.argv[smt_idx+1]) except: pass if '--debug' in sys.argv: pdb.set_trace() if '--check' in sys.argv or '-c' in sys.argv: lidx = '-c' in sys.argv and sys.argv.index('-c') or\ sys.argv.index('--check') log_file = sys.argv[lidx+1] if not (log_file.endswith('.xes')): print log_file, ' does not end in .xes. It should...' raise Exception('Filename does not end in .xes') if not isfile(log_file): raise Exception("El archivo especificado no existe") args['positive_log'] = log_file comparator = ComparatorPnml(filename, **args) complexity = comparator.compare() comparator.generate_pnml() comparator.generate_outputs() comparator.check_hull() if '--verbose' in sys.argv: print complexity except Exception, err: ret = 1 if hasattr(err, 'message'): print 'Error: ', err.message else: print 'Error: ', err raise err return ret