Malaysian CPO benchmark is trading about $1,137 per tonne, down 0.7% from the previous session and equivalent to RM 4,617 per tonne at USD/MYR 4.08. The World Bank global palm oil benchmark is about $1,117 per tonne, while Indonesia's reference price is about $1,008 per tonne. Brent crude is up 0.2% to about $105 per barrel. The Malaysian benchmark started from a two-day-stale anchor at $1,137, and our model's published seven-day path is +0.3% over seven sessions, implying the pull factors are modestly outweighing the push factors for now.
What is pushing palm oil up
The widest visible support comes from the soybean oil palm oil spread. The soybean oil premium is about $402 per tonne, leaving palm heavily discounted. A wide BOPO spread makes palm the cheaper cooking and oleochemical input, encouraging buyers to switch into palm and supporting physical CPO demand.
Energy markets add a second bullish mechanism. Brent crude has risen 8.5% over the past seven days to about $104.4 per barrel. Palm's POGO spread is about -$375 per tonne, in the 0th percentile of its range. At that level palm oil is cheaper than diesel on an energy-equivalent basis, which strengthens the case for discretionary biodiesel blending and reinforces Indonesia's policy-driven demand.
Indonesia's B50 mandate is a further demand-side support. Pertamina is targeting 100% B50 distribution by the end of September. Moving from B40 to B50 absorbs an estimated 3-4 million tonnes of palm oil per year, tightening the domestic balance and reducing exportable supply even as production rises.
El Niño adds a weather risk premium. The ONI is at +1.8 degC, a strong El Niño state. Dryness in Kalimantan is notable: about 15 mm of rainfall is expected over the next seven days, while other palm belt areas show 44-66 mm. The yield impact is likely to be lagged by 6-12 months, but the current risk premium supports prices because buyers and sellers worry about future supply losses even while current output is strong.
What is pushing palm oil down
The heaviest bearish force is the MPOB August stock build. Headline total palm stocks rose 7.48% to 2.82 million tonnes. Official CPO closing stocks rose 15.2% month-on-month to 1,645,570 tonnes, 58% above the five-year average. The stocks-to-use ratio is 14.1%, an ample level. Exports fell 7.5% month-on-month to 1,294,664 tonnes. This combination of rising stocks and weakening exports means more palm is available to the market, pressuring nearby prices.
Peak production season compounds that pressure. July through October is the seasonal peak for Malaysian output. Our model's seasonal path shows production up about 4.5% two months ahead and stocks up about 7.0% one month ahead, with the September monthly average at -0.9%. Strong seasonal supply is arriving before any El Niño yield damage can bite, keeping the physical market well supplied.
The current balance
Our model's factor balance is four bullish to two bearish, so the upside has the upper hand for now. The bullish side has direct demand mechanisms: the wide BOPO spread, the deeply negative POGO, Indonesia's B50 targets, and the El Niño risk premium. The bearish side is concentrated in the current stock overhang and peak-season production, which are visible in official data but may not fully reflect the lagged weather risk. Technical signals are mixed, with a 5/20 SMA golden cross but a negative MACD histogram and RSI at 52, while CFTC soyoil net longs are crowded but fell 8.1k contracts week-on-week. These are neutral factors in our model and do not tip the balance.
To flip the balance to bearish, two things would need to change. First, the MPOB stock build would need to persist into September with exports staying weak, confirming that demand is not absorbing the seasonal surplus. Second, the B50 mandate would need to be delayed or watered down, and Brent or the BOPO spread would need to narrow, removing the energy and substitution bid. For now, the model's 7-day path of +0.3% reflects a market that is absorbing bearish supply data while retaining a bullish demand and weather layer underneath.

