Optimization - Min tracking error

import pandas as pd
import qcs
from qcs import Context, PortfolioConstraint

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

# Import DAE from csv
df_dae = pd.read_csv("examples/dae.csv")


def convert_ae_type_to_snake_case(ae_type):
    ae_type = ae_type.lower()
    if ae_type == "AbsWeight":
        return "abs_weight"
    return ae_type


portfolio_constraints = []
for _index, row in df_dae.iterrows():
    portfolio_constraints.append(
        PortfolioConstraint(
            label=row["Label"],
            asset_exposure_type=convert_ae_type_to_snake_case(row["AE Type"]),
            exposure_coefficients=[
                row[col]
                for col in df_dae.columns
                if col not in ["Label", "AE Type", "Limit Min", "Limit Max"]
            ],
            limit_min=row["Limit Min"],
            limit_max=row["Limit Max"],
        )
    )


# Provide other inputs
pivot_fields = ["sector", "ticker"]
fields = ["\\\\div(MAV,MAV#)", "MAV", "STD%", "STD.BM%"]

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

print("\nOriginal portfolio risks:")
df_risks = snapshot.pivot_view(context, pivot_fields).get_risks(fields)
print(df_risks)


print("\nOptimized portfolio positions:")
optimized_snapshot = snapshot.optimize(
    context=context,
    portfolio_constraints=portfolio_constraints,
    cost_function="min_tracking_error",
)
for position in optimized_snapshot.positions:
    print(f"{position.ticker}\t{position.size}")

print("\nOptimized portfolio risks:")
df_risks = optimized_snapshot.pivot_view(context, pivot_fields).get_risks(
    fields
)
print(df_risks)