The difference probably comes from not having exactly the same conventions.
When you use ql.MakeOIS all the conventions will come from the ql.Sofr index, but when you build the Instrument manually with ql.OvernightIndexedSwap you are entering all the convention by hand, namely for the schedule.
The ql.MakeSchedule class has many more parameters which mostly ...
Appears to work when using ql.MakeOIS. Still need to understand why there is a discrepancy. Any thoughts?
for quote in marketQuotes:
swapTenor = ql.Period(quote)
fixedRate = quote/100
oisSwap = ql.MakeOIS(swapTenor, sofrIndex, fixedRate, nominal=1E6)
('1W', 0.01982) 0.0