Beispiel #1
0
def portfolio_cum_return(df: pd.DataFrame):
    """Кумулятивная доходность портфеля."""
    names = get_investors_names(df)
    # После внесения средств
    post_value = df["Value"]
    # Перед внесением средств
    pre_value = post_value.subtract(df[names].sum(axis=1), fill_value=0)
    portfolio_return = pre_value / post_value.shift(1)
    portfolio_return.iloc[0] = 1
    return portfolio_return.cumprod()
Beispiel #2
0
def update_data(
    report_name: str, date: pd.Timestamp, value: float, inflows: dict, dividends: float
):
    """Обновляет файл с данными статистики изменения стоимости портфеля.

    Проверяет, что в этом месяце статистика еще не вносилась.

    :param report_name:
        Название файла с отчетом.
    :param date:
        Дата отчета.
    :param value:
        Стоимость активов.
    :param inflows:
        Словарь с именами инвесторов и внесенных ими средств за период.
    :param dividends:
        Дивиденды за период.
    """
    df = read_data(report_name)

    last_date = df.index[-1]
    if last_date + pd.DateOffset(months=1, day=1) > date:
        raise POptimizerError("В этом месяце данные уже вносились в отчет")

    total_inflow = 0
    for investor, inflow in inflows.items():
        if investor not in df.columns:
            raise POptimizerError(f"Неверное имя инвестора - {investor}")
        df.loc[date, investor] = inflow
        total_inflow += inflow

    df.loc[date, "Value"] = value

    portfolio_return = (value - total_inflow) / df.loc[last_date, "Value"]
    investors = pdf_upper.get_investors_names(df)
    value_labels = "Value_" + investors
    pre_inflow_value = df.loc[last_date, value_labels] * portfolio_return
    df.loc[date, value_labels] = pre_inflow_value.add(
        df.loc[date, investors].values, fill_value=0
    )

    if dividends == 0:
        df.loc[date, "Dividends"] = np.nan
    else:
        df.loc[date, "Dividends"] = dividends

    df.to_excel(REPORTS_PATH / f"{report_name}.xlsx", SHEET_NAME)
Beispiel #3
0
def test_get_investors_names(df):
    df = pdf_upper.get_investors_names(df)
    assert isinstance(df, pd.Index)
    assert list(df) == ["WLMike", "Igor"]