K-Beauty: On the Verge of a New Leap Forward?

K-Beauty: Poised for a New Leap Forward

The K-beauty industry has recently been capturing the spotlight once again. As an investor looking into the sector, I feel that this industry is not just following a fleeting trend but is facing a period of serious structural transformation. In the past, there was a high dependency on China, but now the export market is rapidly expanding to the United States, Japan, Europe, the Middle East, and Southeast Asia. The role of technology-driven brands and Original Design Manufacturing (ODM) companies has become more critical than ever.

This shift involves more than just diversifying export destinations; it accompanies a paradigm shift in product essence and consumer perception. Consumers now choose cosmetics based on more specific and scientific criteria such as ingredients, efficacy, safety, and sustainability, rather than just brand image. As a result, the beauty industry is gradually approaching the boundary of the healthcare and wellness sectors, presenting both a challenge and an opportunity for K-beauty companies.


🌍 K-Beauty’s Expansion Strategy: Moving Beyond China

Just a few years ago, K-beauty was largely dependent on the Chinese market. However, following the THAAD incident in 2017, the growth in the Chinese market slowed due to government regulations, an unofficial boycott sentiment, and the rapid rise of local Chinese brands. In response, Korean cosmetics companies strategically began to diversify their export markets, a strategy that is now yielding visible results.

As of 2024, the United States has emerged as the largest export destination for Korean cosmetics, with market share steadily increasing in Japan, Europe, the Middle East, and Southeast Asia as well. This trend is not merely a geographical diversification but a strategic pivot to adapt to the needs of global consumers. This demands precise product planning tailored to regional consumer characteristics: American consumers are sensitive to ingredients and efficacy, Japanese consumers value functionality and simplicity, Europeans prioritize sustainability and eco-friendliness, and Middle Eastern consumers focus on luxury and Halal certification.

Distribution methods are also evolving. While department store-centric distribution was dominant in the past, digital platforms like Amazon, Qoo10, TikTok, and Olive Young have now become core channels. This provides global expansion opportunities for emerging brands and SMEs, enabling them to build a loyal customer base through Direct-to-Consumer (D2C) communication.

📌 Summary of Export Share Changes

Export Destination2016 Share (Approx. %)2024 Share (Approx. %)Key Change Factors
Greater China70%24%Geopolitical risks, rise of local brands, need for channel diversification.
United States-18.7%Expansion of digital distribution, ingredient-focused consumer culture, popularity of derma brands.
Japan-9.5%Popularity of K-culture, expanding consumption among women in their 10s and 20s.
Europe--Increasing demand for eco-friendly ingredients and sustainable packaging.
Southeast Asia--Spread of Hallyu (Korean Wave) via K-pop/dramas, effectiveness of social media marketing.
2024 data is based on annual export figures from the Korea Customs Service and the Ministry of Food and Drug Safety.

🔬 From Brands to Technology: A Shift in Industry Leadership

K-beauty is transforming from an industry of ‘brands that make you look pretty’ to one centered on ’technological capabilities with scientifically proven efficacy.’ This phenomenon arises as consumer perceptions of beauty shift towards health and wellness. In response, both domestic and international companies are actively strengthening their research and development (R&D).

Furthermore, with the rapid rise of derma-cosmetic brands based on dermatology and the strengthening trend of purchasing based on specific ingredients like PDRN, microbiome, retinol, and peptides, the ‘function-centric skincare’ market is moving to the forefront. K-beauty is recognized as one of the sectors that best reflects this trend, instilling the perception of ‘science-based cosmetics’ in consumers worldwide.


📊 K-Beauty Companies from an Investor’s Perspective

While studying the industry, looking at related companies from an investment standpoint is also an interesting approach. The cosmetics industry was traditionally considered a cyclical consumer good, but it is recently being re-evaluated as an investment theme as it merges with device, bio, and healthcare elements.

📈 Key Company Comparison Summary

CompanyMarket Cap (Approx.)2024 Revenue GrowthOperating Profit MarginOverseas Sales %Features & Investment Points
AmorepacificKRW 8.0 Trillion+5.9%5.8%44%Turnaround expectations, expanding North American sales, brand renewal in progress.
APR CorpKRW 5.9 Trillion+38.0%17.0%55%Device + cosmetics ecosystem, global expansion based on D2C model.
LG H&HKRW 5.0 Trillion---Luxury-focused, in the early stages of renewal, China risk remains.
CosmaxKRW 2.7 Trillion+21.9%8.1%46%Growth based on indie brands, leading the ODM ecosystem, expanding global factories.
Data as of July 2025. Financials are based on FY2024 results. Market cap is subject to change.

Notably, technology-focused companies like APR are maximizing customer lifetime value by adopting a hardware + consumables model, while Cosmax is being evaluated as playing a ‘TSMC-like role’ in the cosmetics industry. Meanwhile, although LG Household & Health Care and Amorepacific still have high exposure to China and duty-free channels, they are seeking new growth opportunities through restructuring.


🔭 Reasons to be Optimistic about K-Beauty’s Future

  1. Tangible diversification of export markets is becoming visible, with a rapid transition towards becoming global brands.
  2. The digital-centric distribution structure lowers entry barriers and provides an environment where brands can communicate directly with consumers to strengthen their identity.
  3. The R&D competitiveness of Korean companies in response to technology-driven trends is highly regarded in the global market, with the convergence of derma-cosmetics and beauty devices becoming a new standard.
  4. Increased investment in ESG, clean beauty, and sustainability will serve as a foundation for K-beauty to survive and grow in the global market in the mid- to long term.

From an investor’s perspective, the K-beauty industry is currently at the starting line for its second golden age, a time when the innovations in its industrial structure and the results of its global strategy are beginning to show in earnest. Closely observing the flow of this industry over the next 2-3 years will be a very meaningful experience, not only for industrial analysis but also for future career path setting and strategy development.

📚 References and Further Insights

For more vivid insights, consider the following content. You can hear the actual perspectives of beauty industry professionals and analysts, along with in-depth explanations of the industry structure.

뷰티 초고수가 들려주는 한국 화장품 산업 이야기 | 뷰티 1부

브랜드가 강자가 아닌 이유? 뷰티 2부

프랑스 명품도 눌러버린 한국 화장품, 폭발적으로 성장 중 | 슈퍼맨 이주호

의외로 잘 모르는 한국 화장품의 글로벌 성공 비결 | 박종대 위원

중국이 K-뷰티 당장 쫓아오지 못하는 이유 | 시그나이트 파트너스 이새봄 수석

TIGER Cosmetics ETF Analysis

📊 TIGER Cosmetics ETF Holdings (As of July 2025)

RankTickerWeight
1APR10.56%
2LG Household & Health Care10.40%
3Amorepacific10.28%
4d’Alba Global9.70%
5Pharma Research9.60%
6Kolmar Korea9.43%
7Silicon29.43%
8Cosmax9.41%
9VT6.71%
10Cosmecca Korea3.66%

수익율 비교

PYTHON
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
from curl_cffi import requests
import yfinance as yf

# —————————————————————————————————————————————
# 1. Fetch Global Index Data
# —————————————————————————————————————————————
def fetch_market_data(tickers, start_date, end_date, session):
    """
    Downloads global index (closing price) data using yfinance.
    :param tickers: List of symbols to fetch (e.g., ['^GSPC', '^KS11'])
    :param start_date: Start date for data (YYYY-MM-DD)
    :param end_date: End date for data (YYYY-MM-DD)
    :param session: curl_cffi requests session
    :return: DataFrame with date index (columns=['S&P500','KOSPI'])
    """
    raw = yf.download(
        tickers,
        start=start_date,
        end=end_date,
        session=session,
        repair=True
    )['Close']
    raw.columns = ['S&P500', 'KOSPI']
    # Reset index and rename the date column
    df = raw.reset_index().rename(columns={'index': 'Date'})
    return df

# —————————————————————————————————————————————
# 2. Load and Preprocess Local Excel Data
# —————————————————————————————————————————————
def load_and_preprocess_excel(path, sheet, header_row=5):
    """
    Reads the PRICE_DATA sheet from out.xlsx,
    keeps necessary columns, and converts to date/numeric types.
    :param path: Path to the Excel file
    :param sheet: Sheet name
    :param header_row: The actual row where the data header starts (0-based)
    :return: Preprocessed DataFrame (columns=['Date','MarketPrice','BaseIndex'])
    """
    df = pd.read_excel(path, sheet_name=sheet, header=header_row)
    # Remove empty columns
    df = df.dropna(axis=1, how='all')
    # Select key columns
    df = df[['구분', '시장가격', '기초지수(WISE 화장품)']]
    # Convert types
    df['구분'] = pd.to_datetime(df['구분'])
    df['시장가격'] = pd.to_numeric(df['시장가격'], errors='coerce')
    df['기초지수(WISE 화장품)'] = pd.to_numeric(df['기초지수(WISE 화장품)'], errors='coerce')
    # Filter data from 2023-01-01 onwards
    df = df[df['구분'] >= '2023-01-01'].copy()
    # Rename columns for clarity
    df.rename(columns={'구분': 'Date', '기초지수(WISE 화장품)': 'tiger_cosmetics'}, inplace=True)
    # Set Date as index
    df.set_index('Date', inplace=True)
    return df

# —————————————————————————————————————————————
# 3. Merge Data and Handle Missing Values
# —————————————————————————————————————————————
def merge_and_fill(etf_df, market_df):
    """
    Merges ETF and global index data by date,
    then fills missing values using linear interpolation and forward/backward fill.
    :param etf_df: ETF DataFrame (date index)
    :param market_df: Index DataFrame (with Date, S&P500, KOSPI columns)
    :return: Merged DataFrame with missing values handled
    """
    market_df = market_df.copy()
    market_df['Date'] = pd.to_datetime(market_df['Date'])
    market_df.set_index('Date', inplace=True)

    # Merge dataframes
    df = etf_df.merge(
        market_df[['S&P500', 'KOSPI']],
        left_index=True, right_index=True,
        how='left'
    )

    # 1) Linear interpolation
    df[['S&P500','KOSPI']] = df[['S&P500','KOSPI']].interpolate(method='linear')

    # 2) Supplement with forward/backward fill average
    for col in ['S&P500','KOSPI']:
        df[col] = df[col].fillna((df[col].ffill() + df[col].bfill())/2)

    return df

# —————————————————————————————————————————————
# 4. Calculate Indicators (Relative Returns & Moving Averages)
# —————————————————————————————————————————————
def calculate_indicators(df):
    """
    Calculates cumulative relative returns and 5-day moving averages.
    :param df: Merged DataFrame
    :return: DataFrame with new indicator columns
    """
    # Cumulative return relative to the start date
    df['tiger_cosmetics_relative'] = df['tiger_cosmetics'] / df['tiger_cosmetics'].iloc[0]
    df['S&P500_relative'] = df['S&P500'] / df['S&P500'].iloc[0]
    df['KOSPI_relative'] = df['KOSPI'] / df['KOSPI'].iloc[0]

    # 5-day simple moving average
    for col in ['tiger_cosmetics','S&P500','KOSPI']:
        df[f'{col}_SMA'] = df[col].rolling(window=5).mean()

    return df

# —————————————————————————————————————————————
# 5. Plot Chart and Save
# —————————————————————————————————————————————
def plot_and_save(df, output_path, font_path):
    """
    Sets up Korean font, creates a two-panel chart (price trend and cumulative return),
    and saves it as a PNG file.
    :param df: DataFrame with indicators (date index)
    :param output_path: File path to save the chart (e.g., 'tiger_kbeauty.png')
    :param font_path: Path to a system font file for displaying Korean characters
    """
    # Set up Korean font
    prop = fm.FontProperties(fname=font_path)
    plt.rcParams['font.family'] = prop.get_name()
    plt.rcParams['axes.unicode_minus'] = False

    fig, (ax1, ax2) = plt.subplots(
        2, 1, figsize=(12, 8), sharex=True
    )

    # Top plot: Price Trend
    ax1.plot(df.index, df['tiger_cosmetics'], label='TIGER K-Beauty ETF Close')
    ax1.plot(df.index, df['S&P500'], label='S&P 500 Close')
    ax1.plot(df.index, df['KOSPI'], label='KOSPI Close')
    ax1.set_ylabel('Closing Price')
    ax1.set_title('Index and ETF Closing Price Trends Since 2023')
    ax1.legend()
    ax1.grid(True)

    # Bottom plot: Cumulative Returns
    ax2.plot(df.index, df['tiger_cosmetics_relative'], label='ETF Cumulative Return')
    ax2.plot(df.index, df['S&P500_relative'], label='S&P 500 Cumulative Return')
    ax2.plot(df.index, df['KOSPI_relative'], label='KOSPI Cumulative Return')
    ax2.set_ylabel('Cumulative Return')
    ax2.set_title('Relative Cumulative Return Comparison Since 2023')
    ax2.legend()
    ax2.grid(True)

    plt.xlabel('Date')
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig(output_path, dpi=400)
    plt.close(fig)

# —————————————————————————————————————————————
# 6. Execution Block
# —————————————————————————————————————————————
def main():
    # Set parameters
    start_date = "2023-01-02"
    end_date   = "2025-07-20"
    tickers    = ['^GSPC', '^KS11']
    excel_path = "out.xlsx"
    sheet_name = 'PRICE_DATA'
    font_path  = '/usr/share/fonts/truetype/nanum/NanumGothic.ttf' # To prevent garbled Korean text in matplotlib
    output_png = 'tiger_kbeauty_comparison.png'

    # Create session (to impersonate Chrome User-Agent and avoid 'too many requests' errors from yfinance)
    session = requests.Session(impersonate="chrome")

    # 1) Fetch global index data
    market_df = fetch_market_data(tickers, start_date, end_date, session)

    # 2) Load and preprocess local Excel data
    # yfinance cannot fetch KRX:228790, data can be downloaded from https://www.tigeretf.com
    etf_df = load_and_preprocess_excel(excel_path, sheet_name)
    
    # 3) Merge data and handle missing values
    merged_df = merge_and_fill(etf_df, market_df)

    # 4) Calculate indicators
    result_df = calculate_indicators(merged_df)

    # 5) Plot chart and save
    plot_and_save(result_df, output_png, font_path)


if __name__ == "__main__":
    main()
Click to expand and view more

Copyright Notice

Author: Jaehun Ryu

Link: https://jaehun.me/en/posts/k-beauty-on-the-verge-of-a-new-leap-forward/

License: CC BY 4.0

This work is licensed under the Creative Commons Attribution 4.0 International License. You are free to use it for any purpose, including commercial use, as long as you provide proper attribution.

Comments

Start searching

Enter keywords to search articles

↑↓
ESC
⌘K Shortcut