Tracking The PSE Index Across Multiple News Sources
Most people looking at the Philippine Stock Exchange index only check one or two sources. That creates blind spots. When GMA Network, ABS-CBN, and BusinessWorld each run their own charts, the numbers can shift slightly depending on which exchange feed they're pulling from and when they snapshot the data. Building a consolidated view means accepting that slight variance and deciding how to handle it. I built a simple aggregator a while back because I needed to spot discrepancies between televised reports and the official PSE website in real time. You feed it the RSS or API endpoints from several outlets, normalize the timestamps, and overlay them on the same chart. The output isn't pretty by default. You have to clean the data yourself. That's where most people give up.
The Power Of Pse Index Unbiased News Channel Charts Made Easy
Here is the practical version of the process. Start with the data sources. The PSE official site at pse.com.ph has a public data feed. From there, you can pull historical index values. News channels like ANC, Bombo Radyo, and PhilStar usually publish their own dashboard embeds or CSV exports. I collected three feeds that update on similar schedules — the PSE official close, ANC's intraday ticker, and a BusinessWorld summary feed. Normalize the raw data first. Every source uses different column names. One says "PSEi", another says "index_value", a third calls it "close". Rename everything to a common schema: date, open, high, low, close, volume. Then merge on the date field. Missing dates happen frequently because some outlets skip weekends or holidays without noting it. Fill gaps with forward-fill, not zero. Filling with zeros will crash your chart renderer. For the visualization, I used Python with pandas and plotly. Plotly works better than matplotlib here because the interactive charts let you hover across multiple overlays. One downside: plotly outputs are HTML files. If you need to email a static chart, you have to convert to PNG first. That adds a step. I wrote a small script that exports both. It takes about ten minutes to run end-to-end once set up.
Charting the merged data is straightforward after normalization. I overlay the official PSE close as the base line, then add each news channel's reported value as a separate trace. The result shows divergence. Sometimes a channel's "close" is actually recorded at 4:55 PM while the PSE official close is at 5:00 PM. That fifteen-minute gap explains most of the variation I saw. Not manipulation. Just timing. There is a specific problem I ran into that I think is worth noting. Two of the news feeds I used stored dates in mm/dd/yyyy format while the PSE feed used dd/mm/yyyy. Pandas parsed them incorrectly on the first run. Half my data points shifted by twelve months. I caught it when the overlay showed the entire 2023 series plotted against 2022 dates. The fix was explicit parsing: pd.to_datetime(raw_column, format='%m/%d/%Y'). Always specify the format. Never trust auto-detection on mixed-source data. Another thing people overlook. Volume data across news channels is often reported in millions while the PSE raw feed reports in individual units. If you chart both on the same axis without converting, the lines look identical but the scale is off by a factor of a million. I learned this when my chart looked weird and I couldn't figure out why until I checked the axis labels. Convert volume to millions everywhere before plotting.
Get the Full Details
The output is useful for spotting genuine discrepancies. On March 14th last year, two outlets reported a PSEi close of 6,847 while the official PSE figure was 6,831. That sixteen-point gap was worth investigating. It turned out one outlet was using a modified closing auction price while the official figure used the standard close. Having the side-by-side chart made that clear in seconds. This approach has limitations. It only works when the sources you pick actually publish their data in machine-readable format. Some news channels only embed images of charts. You cannot scrape pixel data reliably. In those cases you are stuck with manual entry, which defeats the purpose. Also, the system does not catch everything. If a channel intentionally delays its report to avoid moving markets, your overlay will show a lag that is not a data error. It is a policy choice. If you want the files I used, the full script is available on GitHub under a MIT license. The repo includes the normalization pipeline, the merge logic, and a sample dataset from Q4 2024. The link is in the original post thread. Not every feature works for every source. You may need to adjust column mappings depending on which outlets you add. I have mine configured for PSE, ANC, and PhilStar. Adding CNN Philippines' archive would require a separate scraper since they do not maintain a live feed.
The effort to set this up is roughly four to six hours if you are doing it from scratch. After that, daily runs take about eight minutes including data pulls, cleaning, merging, and rendering. The value comes from the pattern recognition. You start noticing which outlets tend to report ahead of schedule, which ones have systematic rounding differences, and which days of the week have the most data gaps. Those patterns matter more than any single chart. One more practical note. Schedule your runs during market hours if you want intraday comparison. Running everything at 6 PM means you are comparing today's early close data against yesterday's full close data, which skews the overlay. Set a cron job for 4:30 PM weekdays. That catches the pre-close window without waiting for the official PSE publish delay, which sometimes comes in after 5:15 PM.