示例#1
0
def data() -> pd.DataFrame:
    chosen_stocks = list(params.get("STOCKS_INFO").keys())
    params["chosen_stocks"] = chosen_stocks
    params["stocks_info"] = params.get("STOCKS_INFO")
    params["START_DATE"] = get_start_date()
    params["END_DATE"] = get_end_date()
    params["STOCKS_LIST"] = get_list_stocks()

    data_step0 = get_data(params)
    data_step1 = process_data(data_step0, params)
    covariance_tbl = get_covariance_tbl(data_step1)
    correlation_tbl = get_correlation_tbl(data_step1)
    portfolio_properties = get_portfolio_properties(data_step1, params)
    yearly_returns = get_returns(data_step1)
    volatility_yearly = get_volatility_yearly(data_step1)

    portfolio_info = pd.merge(
        portfolio_properties.share_allocation_df,
        yearly_returns,
        how="left",
        on="stock_name",
    )
    portfolio_info = pd.merge(
        portfolio_info, volatility_yearly, how="left", on="stock_name"
    )

    data_step2 = get_stock_data_returns(data_step1, params)

    data = data_step2
    return data
示例#2
0
 def test_scatter_matrix_plot(self, data: pd.DataFrame):
     crypto_comp = pd.concat(
         [data[stock]["Open"] for stock in params.get("STOCK_CODES")], axis=1
     )
     crypto_comp.columns = [
         f"{stock.capitalize()} Open" for stock in params.get("STOCK_CODES")
     ]
     fig = px.scatter_matrix(crypto_comp)
     fig.show()
示例#3
0
def data() -> pd.DataFrame:
    chosen_stocks = list(params.get("STOCKS_INFO").keys())
    params["chosen_stocks"] = chosen_stocks
    params["stocks_info"] = params.get("STOCKS_INFO")
    params["START_DATE"] = get_start_date()
    params["END_DATE"] = get_end_date()
    params["STOCKS_LIST"] = get_list_stocks()
    data_step0 = get_data(params)
    data_step1 = process_data(data_step0, params)
    return data_step1
示例#4
0
 def test_returns_scatter_matrix_plot(self, stock_data_returns: pd.DataFrame):
     returns_comp = pd.concat(
         [
             stock_data_returns.query(f'stock_name=="{stock}"')["returns"]
             for stock in params.get("STOCK_CODES")
         ], axis=1
     )
     returns_comp.columns = [
         f"{stock.capitalize()} returns" for stock in params.get("STOCK_CODES")
     ]
     fig = px.scatter_matrix(returns_comp)
     fig.show()
示例#5
0
def data_step0() -> pd.DataFrame:
    ### get_data
    chosen_stocks = list(params.get("STOCKS_INFO").keys())
    start_date = params.get("START_DATE")
    end_date = params.get("END_DATE")
    stocks_info = params.get("STOCKS_INFO")
    chosen_stocks = None
    if not chosen_stocks:
        chosen_stocks = [stock_name for stock_name, stock in stocks_info.items()]
    chosen_codes = [stocks_info[stock_name].code for stock_name in chosen_stocks]
    data_step0 = web.DataReader(chosen_codes, "yahoo", start=start_date, end=end_date)
    return data_step0
示例#6
0
 def test_dist_returns_plots(self, stock_data_returns: pd.DataFrame):
     hist_data = [
         stock_data_returns.query(f'stock_name=="{stock}"')["returns"]
         for stock in params.get("STOCK_CODES")
     ]
     group_labels = [stock for stock in params.get("STOCK_CODES")]
     try:
         fig = ff.create_distplot(hist_data, group_labels, bin_size=0.01)
     except ValueError:
         for data in hist_data:
             data.dropna(inplace=True)
         fig = ff.create_distplot(hist_data, group_labels, bin_size=0.01)
     fig.show()
示例#7
0
def scatter_plot(data: pd.DataFrame) -> None:
    variable = "Open"
    title = f"Scatter Matrix for {variable} Prices"
    components = pd.concat(
        [
            data.query(f'stock_name=="{stock_name}"')[variable]
            for stock_name in params.get("STOCKS_INFO")
        ],
        axis=1,
    )
    components.columns = [
        f"{stock.capitalize()} {variable}" for stock in params.get("STOCKS_INFO")
    ]
    fig = px.scatter_matrix(components, title=title)
示例#8
0
def investment_data() -> pd.DataFrame:
    d = defaultdict(list)
    for field in Stock._fields:
        for stock_name, stock_obj in params.get("STOCKS_INFO").items():
            d[field].append(getattr(stock_obj, field))
    df = pd.DataFrame.from_dict(d)
    return df
示例#9
0
def stock_data_tas(stock_data:pd.DataFrame) -> pd.DataFrame:
    datas=[]
    for stock_name in params.get('STOCK_CODES'):
        datas.append(get_technical_analysis(stock_data, stock_name))

    data = pd.concat(datas)
    return data
示例#10
0
def get_total_cum_profits(stock_data: pd.DataFrame,
                          strategy_profit_name: str) -> pd.DataFrame:
    profits = [
        stock_data.query(f'stock_name=="{stock}"')[[
            strategy_profit_name, 'stock_name'
        ]] for stock in params.get('STOCK_CODES')
    ]
    total_cum_profits = deepcopy(profits[0])
    total_cum_profits = total_cum_profits[~total_cum_profits.index.duplicated(
    )]
    indexes = total_cum_profits.index
    for i in range(1, len(profits)):
        profits_stock = profits[i]
        profits_stock = profits_stock[~profits_stock.index.duplicated()]
        total_cum_profits[strategy_profit_name] += profits_stock[
            strategy_profit_name]

    total_cum_profits_df = pd.DataFrame.from_dict({
        strategy_profit_name:
        total_cum_profits[strategy_profit_name],
        'stock_name': [
            'Total Strategy Cumulative Profits'
            for _ in range(len(total_cum_profits))
        ]
    })

    total_cum_profits_df.index = indexes
    return total_cum_profits_df
示例#11
0
    def test_get_investment_data(self) -> None:
        chosen_stocks = list(params.get("STOCKS_INFO").keys())
        investment_data = get_investment_data(params)
        for field in Stock._fields:
            assert field in investment_data.columns

        assert investment_data.shape == (len(chosen_stocks), len(Stock._fields))
示例#12
0
def data_step1(data_step0: pd.DataFrame) -> pd.DataFrame:
    code_name_mapping = params.get("CODE_NAME_MAPPING")
    code_rank_mapping = params.get("CODE_RANK_MAPPING")
    stocks_data = data_step0.stack()
    dates = [idx[0] for idx in stocks_data.index]
    stocks_data = stocks_data.reset_index(drop=False)
    stocks_data.index = dates
    stocks_data.rename(columns={"Symbols": "stock_code"}, inplace=True)
    stocks_data["stock_name"] = stocks_data.stock_code.apply(
        lambda code: code_name_mapping.get(code)
    )
    stocks_data["sector"] = stocks_data.stock_code.apply(
        lambda x: code_rank_mapping.get(x)
    )

    data_step1 = stocks_data.sort_values(["stock_name", "Date"])
    return data_step1
示例#13
0
 def test_get_strategy_profits_all(self, inf_data: tuple):
     information, stock_data = inf_data
     data = pd.concat([
         get_strategy_profits(stock_data, stock, 'orders_ma_nb')
         for stock in params.get('STOCK_CODES')
     ])
     assert 'orders_ma_cum_profits' in data.columns
     assert stock_data.shape[0] == data.shape[0]
示例#14
0
def stock_data(data: dict) -> pd.DataFrame:
    stocks = list(params.get("STOCK_CODES").keys())
    data = get_data(params, stocks=["bitcoin", "ethereum"])
    stock_data = stack_data(data)
    stock_data["Total Traded"] = stock_data["Open"] * stock_data["Volume"]

    stock_data = get_moving_averages(stock_data, params)
    stock_data = get_stock_data_returns(stock_data, params)
    stock_data = get_technical_analysis_all(stock_data, params)
    stock_data = ma_trading(stock_data)
    return stock_data
示例#15
0
def add_layout_components_for_multiple_plots(plot_func: FunctionType,
                                             data: pd.DataFrame,
                                             params: dict) -> list:
    """
    Creates a list with [graph, html.Hr(), graph, html.Hr(), ...]
    to be further unpacked in the layout
    """
    plots_lst = []
    for stock in params.get("chosen_stocks"):
        graph, hr = dcc.Graph(figure=plot_func(data, stock)), html.Hr()
        plots_lst.append(graph), plots_lst.append(hr)
    return plots_lst
示例#16
0
 def test_simulated_stocks_plot(self, data: pd.DataFrame) -> None:
     params['num_simulations_stock'] = 100
     chosen_stocks = list(params.get("STOCKS_INFO").keys())
     params["chosen_stocks"] = chosen_stocks
     simulated_stocks = get_simulated_stocks(data,  params)
     stock_name = "Nestlé"
     df_simulated_stock = get_df_simulated_stock(
         stock_name, simulated_stocks, params
     )
     fig = plot_simulated_stocks(
         df_simulated_stock, "Adj Close Price simulated", "Simulated Stock Prices"
     )
     fig.show()
示例#17
0
def nb_count_orders_all(self, inf_data: pd.DataFrame) -> pd.DataFrame:
    strategy_name = 'orders_ma_signal'
    for i, stock in enumerate(params.get('STOCK_CODES')):
        if i == 0:
            data_basis = get_count_orders(stock_data, stock, strategy_name)
        if i > 0:
            data = get_count_orders(stock_data, stock, strategy_name)
            data_basis = pd.merge(data_basis,
                                  data,
                                  how='left',
                                  on='variable_name')
    nb_count_orders_all = data_basis
    return nb_count_orders_all
示例#18
0
def inf_data() -> tuple:
    stocks = list(params.get("STOCK_CODES").keys())
    data = get_data(params, stocks=["bitcoin", "ethereum"])
    stock_data = stack_data(data)
    stock_data["Total Traded"] = stock_data["Open"] * stock_data["Volume"]

    dates_vol_traded = [
        get_date_max_min_volume_traded(stock_data, stock) for stock in stocks
    ]
    information = pd.merge(*dates_vol_traded, on="variable_name")

    stock_data = get_moving_averages(stock_data, params)
    stock_data = get_stock_data_returns(stock_data, params)
    stock_data = get_technical_analysis_all(stock_data, params)
    stock_data = ma_trading(stock_data)
    stock_data = bollinger_bands_trading(stock_data)
    stock_data = rsi_trading(stock_data)
    inf_data = information, stock_data
    return inf_data
示例#19
0
    def test_simulated_optimal_portfolio(
        self, data: pd.DataFrame, portfolios_simulated: pd.DataFrame
    ) -> None:
        chosen_stocks = list(params.get("STOCKS_INFO").keys())
        params["chosen_stocks"] = chosen_stocks
        params["data_range"] = get_data_range(data, params)
        params['num_simulations_stock'] = 100
        params['lower_quantile_lvl'] = 0.05
        params['upper_quantile_lvl'] = 0.95

        optimal_portfolio = get_portfolio_with(
            portfolios_simulated,
            lowest_volatility=True,
            highest_return=True,
            pretty_print_perc=False,
        )

        sim = get_simulations(data, optimal_portfolio, params)
        fig = plot_simulated_stocks(
            sim.simulations_optimal_portfolio_df,
            y="Adj Close Price simulated",
            title="Optimal Portfolio simulations",
        )
        fig.show()
示例#20
0
            f"Simulated {stock_name} Prices",
        )
        components.append(dcc.Graph(figure=fig)), components.append(html.Hr())
    return components


def add_layout_components_for_multiple_plots(plot_func: FunctionType,
                                             data: pd.DataFrame,
                                             params: dict) -> list:
    """
    Creates a list with [graph, html.Hr(), graph, html.Hr(), ...]
    to be further unpacked in the layout
    """
    plots_lst = []
    for stock in params.get("chosen_stocks"):
        graph, hr = dcc.Graph(figure=plot_func(data, stock)), html.Hr()
        plots_lst.append(graph), plots_lst.append(hr)
    return plots_lst


stock_list_dropdown = dcc.Dropdown(
    id="chosen-stocks",
    options=[{
        "label": stock,
        "value": stock
    } for stock in params.get("STOCKS_INFO")],
    multi=True,
    searchable=True,
    value=list(params.get("STOCKS_INFO").keys()),
)
示例#21
0
def get_strategy_profits_all(stock_data: pd.DataFrame,
                             strategy_order_name: str) -> pd.DataFrame:
    return pd.concat([
        get_strategy_profits(stock_data, stock, strategy_order_name)
        for stock in params.get('STOCK_CODES')
    ])
示例#22
0
def get_layout(params: dict) -> html.Div:
    layout = html.Div(children=[
        html.H1(children="Trading Dashboard"),
        dcc.Tabs([
            dcc.Tab(label="DEBUG"),
            dcc.Tab(
                label="Prices time series",
                children=[
                    dcc.Dropdown(
                        id="chosen-stocks",
                        options=[{
                            "label": stock,
                            "value": stock
                        } for stock in params.get("STOCK_CODES")],
                        multi=True,
                        searchable=True,
                        value=list(params.get("STOCK_CODES").keys()),
                    ),
                    dcc.Graph(figure=params.get("open_prices_plot")),
                    *params.get('high_low_plots_lst'),
                    dcc.Graph(figure=params.get("volume_plot")),
                    dcc.Graph(figure=params.get("total_traded_plot")),
                    *params.get('moving_average_plots_lst'),
                    dcc.Graph(figure=params.get("scatter_matrix_plot")),
                    html.Div('Distribution of Returns'),
                    dcc.Graph(figure=params.get("dist_returns_plots")),
                    dcc.Graph(
                        figure=params.get("returns_scatter_matrix_plot")),
                    dcc.Graph(figure=params.get("cum_return_plot")),
                ],
            ),
            dcc.Tab(label='Trading analysis',
                    children=[
                        *params.get('moving_average_plots_lst'),
                        *params.get('bolliger_bans_plots_lst'),
                        dcc.Graph(figure=params.get("rsi_plot")),
                        dcc.Graph(
                            figure=params.get("orders_ma_cum_profits_plot")),
                        dcc.Graph(
                            figure=params.get("orders_bb_cum_profits_plot")),
                        dcc.Graph(
                            figure=params.get("orders_rsi_cum_profits_plot")),
                    ]),
            dcc.Tab(
                label="Some information",
                children=[
                    dash_table.DataTable(
                        columns=[{
                            "name": i,
                            "id": i
                        } for i in params.get("information").columns],
                        data=params.get("information").to_dict("records"),
                    ),
                    html.Hr(),
                    html.Div(
                        'We present here some risk measures for all trading strategies'
                    ),
                    params.get('all_strategy_risk_measures')
                ],
            ),
        ]),
    ])

    return layout
示例#23
0
def main():
    ###########################################################
    #################       BACKEND                  #################
    ###########################################################


    chosen_stocks = params.get('chosen_stocks')

    investment_data = get_investment_data(params)
    your_investment_data = investment_data[investment_data.name.isin(chosen_stocks)]
    data_step0 = get_data(params)
    data_step1 = process_data(data_step0, params)
    covariance_tbl = get_covariance_tbl(data_step1)
    correlation_tbl = get_correlation_tbl(data_step1)
    portfolio_properties = get_portfolio_properties(data_step1, params)
    yearly_returns = get_returns(data_step1)
    volatility_yearly = get_volatility_yearly(data_step1)

    portfolio_info = pd.merge(
        portfolio_properties.share_allocation_df,
        yearly_returns,
        how="left",
        on="stock_name",
    )
    portfolio_info = pd.merge(
        portfolio_info, volatility_yearly, how="left", on="stock_name"
    )

    data_step2 = get_stock_data_returns(data_step1, params)

    portfolios_simulated = run_portfolios_simulations(
        data_step1, params
    )



    optimal_portfolio = get_portfolio_with(
        portfolios_simulated,
        lowest_volatility=True,
        highest_return=True,
        pretty_print_perc=False,
    )

    params["data_range"] = get_data_range(data_step2, params)
    sim = get_simulations(data_step2, optimal_portfolio, params)

    summary_msg = get_investment_summary(portfolios_simulated, sim, params)

    data = data_step2

    ###########################################################
    #################         FRONTEND                #################
    ###########################################################

    params["data"] = data
    params["data_range"] = get_data_range(data, params)
    params["your_investment_data"] = get_data_table(your_investment_data)
    params["open_prices_plot_all"] = plot(data, "Open", "Open prices")
    params["open_prices_plot_lst"] = add_layout_components_for_multiple_plots(
        plot_low_high_prices, data, params
    )
    params["covariance_tbl_dt"] = get_data_table(covariance_tbl)
    params["correlation_tbl_dt"] = get_data_table(
        correlation_tbl, pretty_print_perc=True
    )
    params["open_scatter_matrix"] = plot_scatter_matrix(data, params, "Open")
    params[
        "default_portfolio_variance"
    ] = portfolio_properties.variance_portfolio_return
    params["default_portfolio_expected_return"] = "{:.2%}".format(
        portfolio_properties.expected_portfolio_return
    )
    params["portfolio_info_dt"] = get_data_table(portfolio_info, pretty_print_perc=True)
    params["dist_returns_plot"] = plot_dist_returns(data, params)
    params[
        "efficient_frontier_optimal_point_plot"
    ] = plot_efficient_frontier_optimal_point(portfolios_simulated)
    params[
        "efficient_frontier_continuous_color_plot"
    ] = plot_efficient_frontier_continuous_color(portfolios_simulated)

    params["portfolios_simulated_dt"] = get_data_table(
        portfolios_simulated, pretty_print_perc=True
    )
    params["summary_msg"] = summary_msg
    params[
        "simulated_stock_plots_lst"
    ] = add_layout_compoment_for_simulated_stock_plots(data, sim.simulated_stocks)
    params["simulations_optimal_portfolio_plot"] = plot_simulated_stocks(
        sim.simulations_optimal_portfolio_df,
        y="Adj Close Price simulated",
        title="Optimal Portfolio simulations",
    )

    params['investment_data_component'] =  html.Ul(
        children=[html.Li(f"{k}:\t{v}") for k, v in params.items() if k in params.get('params_to_show')]
    )
    app.layout = get_layout(params)
    app.run_server(debug=True)
示例#24
0
def main():

    ###########################################################
    #################     BACKEND                    #################
    ###########################################################

    # TODO:user input
    # risk measure

    stocks = params.get("chosen_stocks")
    data = get_data(params, stocks=stocks)
    stock_data = stack_data(data)
    stock_data["Total Traded"] = stock_data["Open"] * stock_data["Volume"]

    dates_vol_traded = [
        get_date_max_min_volume_traded(stock_data, stock) for stock in stocks
    ]
    information = dates_vol_traded[0]
    for i in range(1, len(dates_vol_traded)):
        information = pd.merge(information,
                               dates_vol_traded[i],
                               on="variable_name")

    stock_data = get_moving_averages(stock_data, params)
    stock_data = get_stock_data_returns(stock_data, params)
    stock_data = get_technical_analysis_all(stock_data, params)
    stock_data = ma_trading(stock_data)
    stock_data = bollinger_bands_trading(stock_data)
    stock_data = rsi_trading(stock_data)

    count_orders = get_count_orders_all_strat(stock_data, params)
    information = pd.concat([information, count_orders])
    all_strat_risk_measures = get_all_strategy_risk_measures(stock_data)

    params["information"] = information

    ###########################################################
    #################        FRONT END                 #################
    ###########################################################

    params["open_prices_plot"] = plot(stock_data,
                                      y="Open",
                                      title="Open Prices")

    high_low_plots_lst = []
    for stock in stocks:
        high_low_plots_lst.append(
            dcc.Graph(figure=plot_low_high_prices(data[stock], stock)))
        high_low_plots_lst.append(html.Hr())
    params['high_low_plots_lst'] = high_low_plots_lst

    params["volume_plot"] = plot(stock_data, y="Volume", title="Volume traded")
    params["total_traded_plot"] = plot(stock_data,
                                       y="Total Traded",
                                       title="Total Traded")

    params['moving_average_plots_lst'] = add_multiplots_components(
        stock_data, plot_moving_average)

    params["scatter_matrix_plot"] = plot_scatter_matrix(data, params)

    params["dist_returns_plots"] = plot_dist_returns(stock_data, params)
    params["returns_scatter_matrix_plot"] = plot_returns_scatter_matrix(
        stock_data, params)
    params["cum_return_plot"] = plot_cum_return(stock_data)
    params["rsi_plot"] = plot_rsi(stock_data)
    params['orders_ma_cum_profits_plot'] = plot_cum_profits(
        stock_data, 'orders_ma_cum_profits', params, 'MA')
    params['orders_bb_cum_profits_plot'] = plot_cum_profits(
        stock_data, 'orders_bb_cum_profits', params, 'BB')
    params['orders_rsi_cum_profits_plot'] = plot_cum_profits(
        stock_data, 'orders_rsi_cum_profits', params, 'RSI')

    params['bolliger_bans_plots_lst'] = add_multiplots_components(
        stock_data, plot_bollinger_bands)
    params['all_strategy_risk_measures'] = get_data_table(
        all_strat_risk_measures)
    app.layout = get_layout(params)
    app.run_server(debug=True)
示例#25
0
def get_technical_analysis_all(stock_data: pd.DataFrame,
                               params: dict) -> pd.DataFrame:
    return pd.concat([
        get_technical_analysis(stock_data, stock_name)
        for stock_name in params.get('STOCK_CODES')
    ])
示例#26
0
import dash
from src.constants import params
from src.utils import *

__all__ = ['app']

app = dash.Dash(__name__, external_stylesheets=params.get("STYLE_SHEET"))

示例#27
0
def stock_data_returns(stock_data: pd.DataFrame) -> pd.DataFrame:
    stock_data_returns = pd.concat(
        [get_return(stock_data, stock) for stock in params.get("STOCK_CODES")]
    )
    return stock_data_returns
示例#28
0
 def test_information_tbl(self, inf_data: tuple):
     information, _ = inf_data
     stocks = list(params.get("STOCK_CODES").keys())
     for stock in stocks:
         assert stock in information.columns
示例#29
0
 def test_get_data(self):
     data_step0 = get_data(params)
     chosen_codes = [stock.code for stock in params.get("STOCKS_INFO").values()]
     for multi_idx in data_step0.columns:
         assert multi_idx[1] in set(chosen_codes)
示例#30
0
 def test_preprocess_data(self, data_step0):
     data_step1 = process_data(data_step0, params)
     chosen_codes = [stock.code for stock in params.get("STOCKS_INFO").values()]
     for col in ["stock_name", "stock_code", "sector"]:
         assert col in data_step1.columns