Black-Litterman returns

import pandas as pd
import qcs
from qcs import AllocationSnapshot, Context, PricingContext

assets = qcs.import_assets_from_csv("examples/assets.csv")
histories = qcs.import_histories_from_csv(
    "examples/histories.csv", sep=",", date_format="%Y-%m-%d"
)

context = Context(
    date="2023-03-31",
    horizon="1m",
    local_db={"assets": assets, "histories": histories},
)

positions = [
    {"ticker": "EQUITYEUR68", "size": 100.0, "expected_return": 0.01},
    {"ticker": "EQUITYEUR70", "size": 200.0, "expected_return": 0.05},
    {"ticker": "EUR", "size": 200.0, "expected_return": 0.02},
]


# Jay Walters method
snapshot = AllocationSnapshot(currency="USD", positions=positions)

df_returns = pd.DataFrame(
    [
        {"ticker": position.ticker, "prior_return": position.expected_return}
        for position in snapshot.positions
    ]
)
print("\nMethod: Jay Walters")
print("\nPrior estimate of returns:")
print(df_returns)

snapshot_with_posterior_returns = snapshot.bl_returns(
    context=context,
    views=[0.02, 0.1],
    confidences=[0.3, 0.9],
    matrix_p=[[1, 0, 0], [0, 1, 1]],
    tau=0.2,
    uncertainty_method="jay_walters",
)

df_returns["posterior_return"] = [
    position.expected_return
    for position in snapshot_with_posterior_returns.positions
]
print("\nPosterior estimate of returns:")
print(df_returns)


# Idzorek method
reference_market = AllocationSnapshot(
    currency="USD",
    positions=[
        {"ticker": "EQUITYEUR68", "allocation": 20},
        {"ticker": "EQUITYEUR70", "allocation": 20},
        {"ticker": "EUR", "allocation": 20},
    ],
)

pricing_context = PricingContext(risk_aversion=0.3)

snapshot = AllocationSnapshot(
    currency="USD",
    positions=positions,
    reference_market=reference_market,
    pricing_context=pricing_context,
)

df_returns = pd.DataFrame(
    [
        {"ticker": position.ticker, "prior_return": position.expected_return}
        for position in snapshot.positions
    ]
)
print("\nMethod: Idzorek")
print("\nPrior estimate of returns:")
print(df_returns)

snapshot_with_posterior_returns = snapshot.bl_returns(
    context=context,
    views=[0.02, 0.1],
    confidences=[0.3, 0.9],
    matrix_p=[[1, 0, 0], [0, 1, 1]],
    uncertainty_method="idzorek",
)

df_returns["posterior_return"] = [
    position.expected_return
    for position in snapshot_with_posterior_returns.positions
]
print("\nPosterior estimate of returns:")
print(df_returns)