When running the unit test for Stulz engine, I noticed that option value was different if I was using ACT360 instead of ACT365fixed despite the fact that option maturity is expressed in years.
Here below is an example with Quantlib-Python based on the unit test.
import QuantLib as ql
calculation_date = ql.Date.todaysDate()
calendar = ql.Germany()
#/ basketType, optionType, strike, s1, s2, q1, q2, r, t, v1, v2, rho, result, tol
#ew BasketOptionTwoData(BasketType.MinBasket, Option.Type.Put, 100.0, 100.0, 100.0, 0.00, 0.00, 0.05, 0.50, 0.30, 0.30, 0.10, 11.893, 1.0e-3),
dc = ql.Actual360()
t = 0.5
r = 0.05
K = 100
S1 = 100
q1 = 0
v1 = 0.3
S2 = 100
q2 = 0
v2 = 0.3
rho = 0.1
expiryDate = calculation_date + int(360 * t + 0.5)
exercise = ql.EuropeanExercise(expiryDate)
r_curve = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, r, dc))
q1_curve = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, q1, dc))
v1_curve = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(calculation_date, calendar, v1, dc))
q2_curve = ql.YieldTermStructureHandle(ql.FlatForward(calculation_date, q2, dc))
v2_curve = ql.BlackVolTermStructureHandle(ql.BlackConstantVol(calculation_date, calendar, v2, dc))
p1 = ql.BlackScholesMertonProcess(ql.QuoteHandle(ql.SimpleQuote(S1)), q1_curve, r_curve, v1_curve)
p2 = ql.BlackScholesMertonProcess(ql.QuoteHandle(ql.SimpleQuote(S2)), q1_curve, r_curve, v2_curve)
analyticEngine = ql.StulzEngine(p1, p2, rho);
payoff = ql.PlainVanillaPayoff(ql.Option.Put, K)
basketoption = ql.BasketOption(ql.MinBasketPayoff(payoff), exercise)
basketoption.setPricingEngine(analyticEngine)
result = basketoption.NPV()
print(result)
# returns 11.892 with dc = ql.Actual360() and expiryDate = calculation_date + int(360 * t + 0.5) (pass unit test)
# returns 11.905 with dc = ql.Actual365Fixed() and expiryDate = calculation_date + int(365 * t + 0.5) (fails unit test)