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)