Investment Analysis

Investment Analysis and Deepening through Literature Study

During my studies at the University of Potsdam in the summer semester of 2024, I took the course "Investment" taught by Prof. Dr. Carsten Kruppe. In this course, I gained comprehensive knowledge of both static and dynamic investment calculation methods. These skills form the foundation of my analytical abilities regarding various investment projects and company valuations.

To further expand my knowledge, I immersed myself in both classical and modern investment literature. Notable works include "The Intelligent Investor" by Benjamin Graham and "Die Prinzipien des Wohlstands" by Florian Homm. These books provided me with deeper insights into the thinking of successful investors and sharpened my financial analysis skills.

Detailed Analysis of the Schlumberger Stock

The EV/EBITDA data can be obtained directly from Nasdaq or via rapidapi.com. While this calculation is applicable to other stocks, my analysis is specifically focused on Schlumberger, as I believe that the stock is misrepresented in the aforementioned book, suggesting that this method could reliably determine whether a stock should be bought or sold.

Python Code:
// Python code for processing and analyzing investment data
import openpyxl
from datetime import datetime

def read_xlsx_to_dict(file_path, current_date):
    # Loading an Excel workbook and filtering its data to only keep records older than a specified current date.
    # This data is organized into a dictionary grouped by year with the most recent value for each year.
    current_date = datetime.strptime(current_date, "%d.%m.%Y")
    workbook = openpyxl.load_workbook(file_path)
    sheet = workbook.active
    data_dict = {}
    for i in range(2, sheet.max_row + 1):
        date_str = sheet.cell(row=i, column=1).value
        date = datetime.strptime(date_str, "%Y-%m-%d")
        if date > current_date:
            continue
        value = float(sheet.cell(row=i, column=sheet.max_column).value)
        year = date.year
        if year not in data_dict or date > datetime.strptime(data_dict[year][0], "%Y-%m-%d"):
            data_dict[year] = (date_str, value)
    return {date: value for year, (date, value) in data_dict.items()}

def find_extremes(data_dict):
    # Finding and returning the lowest and highest values from the data dictionary.
    sorted_items = sorted(data_dict.items(), key=lambda item: item[1])
    lowest = sorted_items[0]
    highest = sorted_items[-1]
    return lowest, highest

def find_three_next_lowest_excluding_lowest(data_dict, lowest_value):
    # Excluding the lowest value from the data dictionary and finding the next three lowest values.
    filtered_items = [item for item in data_dict.items if item[1] != lowest_value]
    sorted_items = sorted(filtered_items, key=lambda item: item[1])
    return sorted_items[:3]

def calculate_worstcase(next_lowest_values):
    # Calculating the average of the next three lowest values, providing a "worst-case scenario" average.
    values = [value for date, value in next_lowest_values]
    return sum(values) / len(values)

"""The 'current_date' is used for backtesting the recorded stock data up to the specified date to verify if the predictions were accurate."""
# Example of using the functions:
file_path = EV_EBITDA.xlsx
current_date = '31.12.2020' 
data_dict = read_xlsx_to_dict(file_path, current_date)
lowest, highest = find_extremes(data_dict)
three_next_lowest_excluding_lowest = find_three_next_lowest_excluding_lowest(data_dict, lowest[1])
worstcase = calculate_worstcase(three_next_lowest_excluding_lowest)

print("Lowest value:", lowest)
print("Three next lowest values excluding the lowest value:", three next lowest excluding lowest)
print("Worst-case scenario value:", worstcase)
                                    

Before giving my final assessment, I want to emphasize that my calculations may contain errors, and if so, I appreciate any corrections.

Backtesting and Critical Analysis of Florian Homm's Approaches

In a practical application of my knowledge, I analyzed the stock of Schlumberger S.A., specifically calculating the EV/EBITDA multiple for the year 2020. The results of my backtesting revealed significant discrepancies with the analyses presented by Florian Homm, particularly concerning the timing of market lows and the evaluation of risk-reward ratios.

Buy Recommendations:
'2015-03-31': EV/EBITDA Multiple: 1.4187, Price: €83.72
'2014-12-31': EV/EBITDA Multiple: 1.449, Price: €85.72
'2015-06-30': EV/EBITDA Multiple: 1.4876, Price: €86.38
Buy recommendation at €85.27.

Sell Recommendations:
'2017-03-31': EV/EBITDA Multiple: 42.9413, Price: €77.55
'2016-12-31': EV/EBITDA Multiple: 39.3338, Price: €84.30
'2016-06-30': EV/EBITDA Multiple: 37.71, Price: €77.96
Sell recommendation at €79.94.

Assessing buy and sell recommendations for Schlumberger S.A. at the beginning of 2020, when the stock was priced at €36, revealed that the methodology was not sensible for that period. Historical analysis for 2019 and 2018 also yielded unconvincing results. Furthermore, the inconsistent use of dollars and euros in the analysis, along with many undeveloped critical calculations, made the book seem unprofessional and inadequate. The ambiguity in presenting data and methods often left me spending hours trying to decipher how the author derived his figures, which significantly hindered understanding.

The analysis revealed that the lows and recommendations from the books did not align with the most profitable outcomes from a contemporary viewpoint. It appears that data points were selectively adjusted to support the book's narrative, casting doubt on its reliability as a guide for buy/sell decisions. Extensive backtesting with over 50 other cyclical stocks showed that many of the risk-reward ratios described by Florian Homm are not applicable under current market conditions.

These insights underscore the importance of independently testing investment methods outlined in bestsellers before relying on their claims.

Let's build something together

Contact me