【Application(7)】- Jim Slater’s Zulu Principle

To construct a portfolio based on Jim Slater’s principle

Photo Creds: This is MONEY


Jim Slater is one of the well-known U.K. investors. He used to write column articles of portfolio recommendation for Sunday Telegraph and was famous for earning around 68.9% return during the period between 1963 to 1965, while the U.K. stock market only grew at 3.6% at the same period. Jim Slater’s ‘Zulu Principle’ stresses the importance of focusing on your own niche field, where you can take advantage of. Therefore, Jim Slater especially pays attention to small and medium size firms that have long-term profit growth and relative strength and adopts price/earnings to growth ratio (PEG ratio) as an important standard for valuation, as the following shown:

  • EPS growth exceeds 15% in four consecutive years
  • PEG ratio is less than 1.2 and the expected PE ratio is less than 20
  • High liquidity, Low debt ratio, abundant cash flow and positive profit in five consecutive years
  • Firms that have competitive edge, like having a dominant brand
  • Turnaround and thematic stocks, such as having a new product or new management team
  • Small market capitalization, high relative strength of stock price and high insider stock ownership

The Editing Environment and Modules Required

We use Windows OS and Jupyter Notebook in this article

import pandas as pd
import numpy as np
import tejapi
import matplotlib.pyplot as plt
tejapi.ApiConfig.api_key = "Your Key"
tejapi.ApiConfig.ignoretz = True

The Highlights of the Article

  • Quantify Jim Slater’s investing principles
  • Stocks selection and return calculation

Quantitative Indicators

Since Jim Slater’s stock-picking standards include some subjective judgement factors, we present the following objective and quantitative indicators based on them and also adjust them by considering Taiwan stock market environments

Fundamental Conditions

Condition1: Firm market value < Market average market value

Condition2: Positive net incomes in the past five years

Condition3: Net income growth > 15% in three consecutive years

Condition4: Expected net income growth ≥ 15%

Condition5: 5-year average cash flow from operating > 5-year average net income

Condition6: Recent cash flow from operating > recent net income

Condition7: Recent operating margin ≥ 10%

Condition8: Recent return on capital employed ≥ 10%

Condition9: Recent debt/equity ratio < 50%

Condition10: Recent shareholding ratio of directors and supervisors ≥ 20% or recent increase in this ratio

Market-side conditions

Condition11: Expected PE ratio ≤ 20

Condition12: Expected PE ratio/Expected net income growth ≤ 1.2

Condition13: Monthly excess return > 0

Paid Database Used

Investing Strategy in Practice

  • Stock-picking conditions: at least 9 fundamental conditions should be fulfilled, but market-side conditions should all be satisfied
  • Portfolio holding period: to avoid look-ahead bias, we adopt the approach proposed in【Application(1)】The investing strategy of Benjamin Graham — the founder of securities analysis, which takes Q4 financial reports announcement date as the portfolio formation date. For example, we assume complete 2004 financial data will be disclosed in 2005/03/31, so the portfolio based on it will be held between 2005/03/31 ~ 2006/3/31
  • Portfolio return calculation: portfolio should be held in exact one year to calculate yearly return which also considers transaction costs

Step 1. Obtain the codes of TSE listed common stocks

security = tejapi.get('TWN/ANPRCSTD',
paginate = True)
stock_list = security[(security['mkt'] == 'TSE') & (security['stype'] == 'STOCK')]['coid'].tolist()

Step 2. Obtain all the data we need and create condition column

Each loop deals with each stock. Because of the huge amount of data obtained, it takes around 30 ~ 40 minutes. The procedure includes data frequency adjustment, using np.where() to create condition columns, combining data from different databases and storing the outputs in data. Besides, since the index might be disordered after selecting, adding, sorting or removing data, we usually add reset_index(drop=True). The following is the final content of data:

data_cp = data.copy()

To avoid modifying the raw data, we copy data and proceed it with data_cp

#Calculate market average market value
avg_mv = data_cp.groupby(by = 'mdate_x')['MV'].mean()
#Map market average market value to data_cp by date column
data_cp['MarketAverageMarketValue'] = data_cp['mdate_x'].map(avg_mv)
#Condition1: Firm market value < Market average market value
data_cp['condition1'] = np.where(data_cp['MV'] < data_cp['MarketAverageMarketValue'], 1, 0)

Once we have the market value of whole firms, we can now create condition1 column. Here we use map() to map market average market value to data_cp by its date column.

#We choose the columns we need
data_cp = data_cp[['coid','mdate_x','MV','ExpectedNetIncomeGrowth','condition1','condition2','condition3','condition4','condition5','condition6','condition7','condition8','condition9','condition10']]
#Calculate the score and select those higher than 9
data_cp['score'] = data_cp['condition1'] + data_cp['condition2'] + data_cp['condition3'] + data_cp['condition4'] + data_cp['condition5'] + data_cp['condition6'] + data_cp['condition7'] + data_cp['condition8'] + data_cp['condition9'] + data_cp['condition10']
data_cp = data_cp[data_cp['score'] >= 9].sort_values(by = 'mdate_x').reset_index(drop=True)

Step 3. Market-side condition and portfolio return calculation

Here we use each year as one loop and make the second filtering by market-side conditions and calculate portfolio return. It’s worth noting that the time window of PE ratio we obtain is the previous year at portfolio formation date. For example, if mdate_x is ‘2020–12–01’, it means we’ll construct the portfolio on ‘2021–03–31’(120 days later) and we need PE ratio from ‘2020–03–31’ to ‘2021–03–31’). Since this portfolio will be held until ‘2022–03–31’ which hasn’t happened yet, we will exclude 2020-based portfolio while calculating portfolio return.


Step 4. Visualize cumulative return (Code can be found in Source Code)

Step 5. Performance (Code can be found in Source Code)

Step 6. Constituent stocks of 2020-based portfolio (Code can be found in Source Code)


Due to the huge data that covers financial, shareholding status and market-side data, we suggest readers begin with fewer firms, shorter time windows or fewer stock selection standards. If the output meets your expectation, then you can examine it from a longer period. In addition to time length, the quality and various data are required. Therefore, we recommend readers to purchase different databases in TEJ E Shop, in order to put those well-known investors’ investing philosophy into practice!

The content of this webpage does not constitute any offer or solicitation to offer or recommendation of any investment product. There may be survivor bias existing since we use current listed companies. It is for learning purposes only and does not take into account your individual needs, investment objectives and specific financial circumstances. Investment involves risk. Past performance is not indicative of future performance. Readers are requested to use their personal independent thinking skills to make investment decisions on their own. If losses are incurred due to relevant suggestions, it will not be involved with the author.

Source Code

Extended Reading

Related Link

You could give us encouragement by …
We will share financial database applications every week.
If you think today’s article is good, you can click on the
applause icon once.
If you think it is awesome, you can hold the
applause icon until 50 times.
If you have any feedback, please feel free to leave a comment below.



Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
TEJ 台灣經濟新報

TEJ 台灣經濟新報

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,專門提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習ML、人工智慧AI及自然語言處理NLP等新技術,持續提供創新服務