SATS Stock Analysis (Is it a Good Buy?)

SATS stock analysis

SATS stock prices had been badly hit because of the Wuhan virus breakout. Just one year ago, I wrote my first post on the Babylonians about the 52-week low formula using SATS as an example.

Fast forward to today, SATS is now trading at its 52-week low. So I thought it would be a good time to review through SATS fundamentals again. How often do you get to see a stock at its 52-week low in this euphoria market? However, this time it would be slightly different. I am going to do it in python instead of excel.

This would be a good test for my python skills also. All my previous python posts have been hand-held through video tutorials one after another. It is easy to follow other people’s codes and understand them. But when you are starting from a blank canvas with nothing, it really tests your understanding of python.

I find myself googling through every single step, patronizing sites like Stack Overflow and Youtube being the most common ones. It is a steep learning curve, but also a good one. You really learn a lot by doing it on your own rather than watching others do it.

Anyways, I have managed to write 50 lines of codes to analyze SATS stocks. Most of the challenge comes from data cleansing. I would try to focus this article more on the financial side of things rather than the python codes itself. Hopefully, this would give you further insights into the company.

Collating SATS Financial Data into a Data Frame

The financial data that I am pulling from is not from Yahoo this time. I am using S&P Capital IQ, which is a premium subscription software tool. I downloaded SATS financial data over the past 20 years and read the excel file directly into python.

To challenge myself, I did not clean the data from excel. So it is just a messy data structure and I have to think about how to put the information into a nice pandas data frame. This is how the original version looks like.

There are gaps, blank cells, irrelevant rows, and the dates are not standardized. So this is a summary of what I did for data cleaning.

  1. Replace ‘-‘ with NaN
  2. Drop all the rows that are NaN over the 20 years
  3. Drop irrelevant rows like (‘Currency’, ‘Shares per Depository Receipt’, ‘ Filing Date’, ‘Restatement Type’, ‘ Calculation Type’)
  4. Extract only the dates values in the columns
  5. Replace the column values with the dates values

Here is how the first few lines of codes look like.

Let’s see how the income statement looks like now.

Alright, looks good so far. However, the income statement is not enough. We also need the balance sheet and cash flow statement for our 52-week low filters. Do take a look at them if as I will be using that framework to analyze SATS.

So we have to do the same for the balance sheet and cash flow statement. However, when I read in the balance sheet excel file, the dates are in a mess.

The dates are in different formats and I can’t do a string split by delimiter. That is because some will work and some won’t. I have tried using regular expressions (Python regex) but it can’t seem to work either. So I gave up and thought of another workaround solution.

Instead of creating three separate data frames, I would just append all of them together under one big data frame. This data frame would contain data of the income statement, balance sheet and cash flow.

To append this data, we need the column names to be the same. So I just set the column names of the balance sheet and cash flow to be equal to the income statement. Done! Problem solved. Let’s see how the code looks like.

The data cleaning part is exactly the same as the income statement. The final step is just to concatenate all the three financial statements together. Let’s run df and see how our data frame looks like.

Starting to look good. We have 95 rows of metrics to play around with and 20 years of data. Last but not least, let’s transpose this to put the metrics into columns.

BAM! Done! We are all ready. Before we begin our analysis, let’s see what are the metrics that we have in our columns.

Look at the wealth of information that is available! You can almost analyze anything. But for now, we will stick to the basics. Before we dive into the 52-week low filters, let’s have a look at the high-level overview of simple things like revenue, earnings, dividends and PE ratio.

SATS Financial Analysis

SATS stock analysis

Total Revenue has been going up. But not so much for gross profits and net profits. In fact, if we look closely, net profits have not been able to break above the $200 million over the past 20 years. Let’s remove the scale of revenue and zoom in a little more on the gross profit, operating earnings and net income.

Now we are starting to see something. EBIT and net income have been compressed. Despite gross profit going up steadily, the bottom-line figures can’t seem to catch up. What does this tell us? Very simply, operating expenses are rising faster than the growth in gross profits. This was previously mentioned in my guide to analyzing the income statement.

In fact, we can plot this out and see the difference.

For the most part of it, you can see that the operating expenses line is above the gross profit line. Expenses are rising faster than profits. This goes to prove why despite gross profits are increasing, EBIT and net income have been compressed.

This probably means the management is unable to keep costs under control. And if you think about it, what makes up a large part of SATS’s operating costs? It is staff costs. They have a large army of ground handlers and cooks preparing cargos and food.

Inflation causes wages to rise annually. They have to keep up their earnings with labour expenses. Furthermore, SATS has a union. This puts pressure on the management if the wages remain stagnant. It is really a tough business to be in. That’s why they are investing so heavily on new technologies and innovation. It is to improve productivity and reduce labour reliance.

Let’s look at their margins.

SATS stock analysis

It doesn’t look so robust either. It has been falling since the peak of 2003. But the positive is that recent years have shown margins stabilizing and there are slight upward improvements.

Sustainability of Dividends Payout

Next, let’s look at the sustainability of dividends payout. SATS is now at its 52-week low and the dividend yield is about a low 4%+. Is it sustainable? Let’s compare the free cash flow and total dividends paid. We can also plot out the spread to better visualize the margin of safety. Do check up the cash flow guide for more information about this.

SATS dividend yield

Dividends have been increasing steadily like a clockwork, but free cash flow is ranging sideways without much growth. This is something to look out for as investors. Furthermore, their earnings for the first quarter of 2020 would definitely take a hit from the Wuhan pandemic. This means it is likely the spread would sink into the negative.

Though it might be a one-off event, the trend doesn’t look sustainable. Either management has to cut CAPEX to increase FCF, or dividends have to be cut. Alternatively, increase EBIT or net income significantly, which has historically been a challenging task.

Even though the recent drop in oil prices might provide some relief for airline carriers, the overall aviation industry has been hit badly by the Wuhan virus. To protect their already compressed airline yields, it is likely that most airlines would continue to think about cost-cutting solutions. That could mean doing away with in-flight catering services, a direct revenue driver of SATS.

SATS 20-Year PE Ratio

Lastly, is SATS overvalued or undervalued? The most famous metric to measure this is the PE ratio. Let’s pull the PE ratio of the past 20 years and have a quick look at where it stands.

Since the S&P Capital IQ only gives us the latest financial results up to Sep 2019, we will use the basic EPS for that date. Our data frame also does not have the latest SATS share price data. This is because we only append based on rows that have the same dates. So I will manually extract the latest SATS price and directly replace the last row value. That gives us the latest PE ratio.

In addition, I also plotted the mean of the PE as well as +/- 1 standard deviation up and down from the average PE ratio. Let’s take a look at the PE ratio chart.

SATS PE ratio

The latest PE ratio based on the share price of $4.45 is 21.2x. The average PE is around 15.8x. Even though we are now at the 52-week low, SATS is nowhere near cheap based on historical PE measures.

For it to be trading at 15.8x PE ratio, the price must be somewhere around $3.30. That is another 26% drop from the current price of $4.45. During the SARS crisis, SATS’s share price fell from around $2.00 to $1.40, a 28% drop.

Alright, that is some brief financial overview of SATS financials. Now let’s see if SATS is able to pass the 52-week low formula test. Remember to read about the 52-low week filters first before proceeding.

The 52-Week Low Filter #1 (Qualitative Analysis)

The first filter is a qualitative analysis of whether the company has an economic moat. I will leave that up to you. But here is my quick take.

SATS is in a highly regulated business. You need ground handling licenses from airports to operate and the barrier to entry is extremely high. Their only competitor is dnata. It is like a monopolistic business. The growth catalyst is high population growth in emerging economies, rising middle class, and terminal five. But that is a decade away in 2030.

In the short term, the risks are a slowdown in economic growth and trade, which directly translates to lower cargo volumes and earnings. High CAPEX business to stay competitive, which Warren Buffet avoids. Series of joint-ventures and acquisitions, which Damodaran takes as a sell signal. And lastly, the pressure to control operating costs, in particular, wage inflation.

The 52-Week Low Filter #2 (FCF Yield)

The second filter is measuring the free cash flow yield. Since we already have the FCF as calculated above, we just need the enterprise value of the business. Our data frame has debt and cash but there is no market cap. Market cap is calculated by taking share price * the number of outstanding shares. The only information we are missing from our data frame is SATS share price.

So I would pull SATS stock prices from Yahoo finance using pandas data reader. However, we need to match the stock price to the financial year-end dates of our data frame. Since SATS financial year ends in March, we have to filter out such that we only extract the yearly stock price as of 31 March. That is another data cleansing challenge in python.

Afterwhich, we can concatenate the share price as a new column to our existing data frame. From there, the market cap can be easily calculated by taking share price * outstanding shares. Then we can calculate the enterprise value by taking market cap + debt – cash. Finally, just take FCF divided by enterprise value to get our FCF yield.

This is how my code looks.

That is the first part of the filter. The second part is to compare this FCF yield against the risk-free rate. The idea is to have a good buffer or margin of safety between the FCF yield and the risk-free rate.

Again, we are going to pull this bond yield from yahoo and do the same thing as we did for SATS price. I would be using the 10-year US treasury bond. Finally, to get the margin of safety, we just subtract the 10-year bond yield from our FCF.

Let’s plot this out and see how this looks.

SATS dividend yield

As of Sep 2019. the yield spread is approximately 1.8%. The higher the margin of safety, the better. But it has been decreasing year after year since 2000.

I don’t remember the author of the 52-week low specifying what is his requirements. I guess is up to the individual. More importantly, it is that the margin of safety should be high or at least consistent. Are you willing to take on the equity risk for that additional 1.8% premium?

The 52-Week Low Filter #3 (ROIC)

The third filter is the return on invested capital.

This requires some work also as we have to manually calculate the metrics. But it is not much of a hassle, especially when using python.

Firstly, we need to get the net operating profits after tax. This is calculated by taking EBIT * (1 – effective tax rate). Secondly, we need to calculate the total invested capital which is total assets – cash – accounts payables. Lastly, ROIC is just NOPAT divided by total invested capital.

Let’s have a look at the codes and charts.


ROIC is around 10%, below the average of 12%. It is not looking that robust either. That seems like a head and shoulder pattern to me. ROIC also gives insight into the efficiency of utilizing assets.

This is important since we are on the topic of SATS heavy investment into CAPEX to boost productivity. How do you know whether they are making good use of the money on investments? How efficiently do the assets generate profits? That is what ROIC is about.

The right way to use this would be to compare the ROIC against the WACC or the weighted average cost of capital. It must be higher if not the company is destroying shareholders’ value.

Calculating WACC is another new topic altogether. But I will just use the lazy way of using other analysts’ report which is about 7%. So they are earning in excess of about 3-5%. You can look at it as borrowing from a bank at a rate of 5% and earning 8% on your return on investments.

Since SATS have consistently achieved ROIC of above 7%, we can say that they passed filter #3. Even though it is not really convincing as the margin spread of 3% is quite narrow.

The 52-Week Low Filter #4 (LTD to FCF)

This is the last of the quantitative filter.

Filter #4 is a test of whether the balance sheet is an ironclad. The ratio is long term debt to free cash flow ratio. In this ratio, we are trying to ask how long does it take for a company’s free cash flow to repay all the long term debts?

Hence, the lower the number the better as that means debts can be repaid quickly. This one is easy as we already have the metrics in our data frame. Let’s see how this looks.

Within just 6 months, all of SATS long term debt can be fully repaid with its free cash flow. The ratio has historically been relatively low also. This is because their debt to capital ratio is only about 15%. So there isn’t much to worry about here. This filter is definitely a pass for SATS.

The last filter. Is SATS at its 52-week low?

Summary of SATS Stock Analysis

What I like about the 52-week low formula is that it is concise, simple and neat. In just five filters, it covers almost all the important aspects of investing such as liquidity, efficiency, yield, the margin of safety and the qualitative aspects of the business.

In my personal opinion, the risks seem to outweigh the growth catalysts in filter #1. Most of the other filters like FCF yield and ROIC, though it is a pass, is a narrow one and it lacks consistency. Debt is definitely not an issue as seen in filter #4. Unless they use debt to sustain current dividend payouts, which is a slippery slope move. Filter #5 is also a pass as it is now at its 52-week low.

Furthermore, the financial margins are showing patterns of a downtrend and weakness, not for the short-term but throughout the past 20 years. EBIT and net income have not been able to outpace rising operating costs by a good margin. PE ratio is nowhere even near the average.

And for that reason, I am out. (Shark Tank, Barbara)


  1. Where can I get the free Capita IQ data like you have? Also, can you share with me which are the python finance video tutorials online?

    • You have to pay for it, probably not a good idea to have it. I did some from Coursera, Udemy, Youtube, books, it’s all over haha. Maybe I would write one post about this if u are keen.

      • Hi, may I ask why it is not a good idea to have Capita IQ subscription? Are there any alternative to retrieve information such as pricing, income statement, etc using python for SGX stocks? There is free api for markets in NYSE, NASAQ, AMEX, EURONEX, TSX, INDEXES, ETFs, MUTUAL FUNDS, FOREX and CRYPTO if u are ever interested.

Leave a Reply

Your email address will not be published.