Exemplo n.º 1
0
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
Exemplo n.º 2
0
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
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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
Exemplo n.º 8
0
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
Exemplo n.º 9
0
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
Exemplo n.º 10
0
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
Exemplo n.º 11
0
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
Exemplo n.º 12
0
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
Exemplo n.º 13
0
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
Exemplo n.º 14
0
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
Exemplo n.º 15
0
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
Exemplo n.º 16
0
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
Exemplo n.º 17
0
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
Exemplo n.º 18
0
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