1. Data

TEJ data for Camellia (2064). Net income and operating cash flow (CFO) are cumulative year to date: March = Q1, June = 6 months, September = 9 months, December = full year. Values are in TEJ units.

cam_csv <- "period,wtd_shares,net_income,cfo,cfo_ps,shares,treasury
201112,61600,153843,94651,1.54,61600,0
201206,61600,-54886,191963,3.12,61600,0
201212,61600,-94564,337588,5.48,61600,0
201303,61600,34188,115123,1.87,61600,0
201306,61600,74411,110874,1.80,61600,0
201309,61600,102082,256590,4.17,61600,0
201312,61600,136516,256256,4.16,61600,0
201403,61600,52738,92174,1.49,61600,0
201406,61600,84873,125013,2.02,61600,0
201409,61600,130004,206218,3.34,61600,0
201412,61784,174462,228888,3.70,70000,0
201503,70000,27368,-2426,-0.03,70000,0
201506,70000,49779,124301,1.78,70000,0
201509,70000,102016,255083,3.64,70000,0
201512,70000,95191,375033,5.36,70000,0
201603,70000,19504,82991,1.19,70000,0
201606,70000,62905,194099,2.77,70000,0
201609,70000,56279,96120,1.37,70000,0
201612,70000,121347,133251,1.90,70000,0
201703,70000,-26113,-116768,-1.67,70000,0
201706,70000,5204,-119643,-1.71,70000,0
201709,70000,19882,-187857,-2.68,70000,0
201712,70000,28462,-176636,-2.52,70000,0
201803,70000,379,62079,0.89,70000,0
201806,70000,49567,25352,0.36,70000,0
201809,70000,51976,-134195,-1.92,70000,0
201812,70000,71246,-145064,-2.07,70000,0
201903,70000,-8601,36950,0.53,70000,0
201906,70000,-5481,99876,1.43,70000,0
201909,70000,-21634,301444,4.31,70000,0
201912,69982,-57678,416107,5.96,70000,135
202003,69342,-45060,-14691,-0.21,69630,670
202006,69336,-85448,88026,1.27,69630,485
202009,69334,-116566,110109,1.59,69630,423
202012,69333,-103503,114522,1.65,69630,392
202103,69330,17837,-161748,-2.33,69630,300
202106,69330,44475,-278140,-4.01,69630,300
202109,69330,96512,-219486,-3.17,69630,300
202112,69330,125641,-316842,-4.57,69630,300
202203,69330,39181,56983,0.82,69630,300
202206,69330,77624,26657,0.38,69630,300
202209,69330,106825,189094,2.73,69630,300
202212,69330,79195,445514,6.43,69630,300
202303,69330,-43996,128572,1.85,69630,300
202306,69330,-49361,216447,3.12,69630,300
202309,69330,-64807,317017,4.57,69630,300
202312,69330,-94298,312921,4.51,69630,300
202403,69330,-5033,31934,0.46,69630,300
202406,69330,4580,-45738,-0.66,69630,300
202409,69330,-11028,-31784,-0.46,69630,300
202412,69330,-12812,61030,0.88,69330,225
202503,69330,-15289,-18349,-0.26,69330,0
202506,69330,-94307,-75165,-1.08,69330,0
202509,69330,-104890,-121538,-1.75,69330,0
202512,69330,-89914,-21212,-0.31,69330,0
202603,69330,-175,-24232,-0.35,69330,0
202606,69330,-2708,-6855,-0.10,69330,0"

cam <- read.csv(text = cam_csv)
cam$month <- cam$period %% 100
cam$year  <- cam$period %/% 100
cam$qend  <- as.Date(sprintf("%d-%02d-%02d", cam$year, cam$month,
                             ifelse(cam$month %in% c(3, 12), 31, 30)))
kable(head(cam[, c("period", "net_income", "cfo", "cfo_ps", "shares", "treasury")]))
period net_income cfo cfo_ps shares treasury
201112 153843 94651 1.54 61600 0
201206 -54886 191963 3.12 61600 0
201212 -94564 337588 5.48 61600 0
201303 34188 115123 1.87 61600 0
201306 74411 110874 1.80 61600 0
201309 102082 256590 4.17 61600 0

2. Convert cumulative figures to single-quarter figures

Single-quarter value = this quarter’s cumulative value minus the previous quarter’s cumulative value in the same year (Q1 is already one quarter). 2011 and the missing 2012 quarters give NA.

prev <- match(cam$period - 3, cam$period)
cam$ni_q  <- ifelse(cam$month == 3, cam$net_income, cam$net_income - cam$net_income[prev])
cam$cfo_q <- ifelse(cam$month == 3, cam$cfo,        cam$cfo        - cam$cfo[prev])

kable(tail(cam[, c("period", "net_income", "ni_q", "cfo", "cfo_q")], 12))
period net_income ni_q cfo cfo_q
46 202309 -64807 -15446 317017 100570
47 202312 -94298 -29491 312921 -4096
48 202403 -5033 -5033 31934 31934
49 202406 4580 9613 -45738 -77672
50 202409 -11028 -15608 -31784 13954
51 202412 -12812 -1784 61030 92814
52 202503 -15289 -15289 -18349 -18349
53 202506 -94307 -79018 -75165 -56816
54 202509 -104890 -10583 -121538 -46373
55 202512 -89914 14976 -21212 100326
56 202603 -175 -175 -24232 -24232
57 202606 -2708 -2533 -6855 17377

3. Annual summary (December = full year)

annual <- cam %>%
  filter(month == 12) %>%
  transmute(Year = year, `Net income` = net_income, `Operating cash flow` = cfo)
kable(annual)
Year Net income Operating cash flow
2011 153843 94651
2012 -94564 337588
2013 136516 256256
2014 174462 228888
2015 95191 375033
2016 121347 133251
2017 28462 -176636
2018 71246 -145064
2019 -57678 416107
2020 -103503 114522
2021 125641 -316842
2022 79195 445514
2023 -94298 312921
2024 -12812 61030
2025 -89914 -21212

4. Charts

Annual net income and operating cash flow

annual_long <- pivot_longer(annual, -Year, names_to = "Item", values_to = "Value")

ggplot(annual_long, aes(factor(Year), Value, fill = Item)) +
  geom_col(position = "dodge") +
  geom_hline(yintercept = 0) +
  labs(title = "Camellia: annual net income and operating cash flow",
       x = "Year", y = "Amount (TEJ units)", fill = NULL) +
  theme_minimal() +
  theme(legend.position = "top")

Single-quarter net income and operating cash flow

q_long <- cam %>%
  filter(!is.na(ni_q)) %>%
  transmute(qend, `Net income` = ni_q, `Operating cash flow` = cfo_q) %>%
  pivot_longer(-qend, names_to = "Item", values_to = "Value")

ggplot(q_long, aes(qend, Value, colour = Item)) +
  geom_line(linewidth = 0.8) +
  geom_point(size = 1.5) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  labs(title = "Camellia: single-quarter figures",
       x = "Quarter end", y = "Amount (TEJ units)", colour = NULL) +
  theme_minimal() +
  theme(legend.position = "top")

Cash flow per share (year to date)

ggplot(cam, aes(qend, cfo_ps)) +
  geom_line(colour = "darkgreen") +
  geom_point(colour = "darkgreen", size = 1.5) +
  geom_hline(yintercept = 0, linetype = "dashed") +
  labs(title = "Camellia: cash flow per share (year to date)",
       x = "Quarter end", y = "Per share") +
  theme_minimal()

Treasury stock

ggplot(cam, aes(qend, treasury)) +
  geom_col(fill = "steelblue", width = 60) +
  labs(title = "Camellia: treasury stock held by subsidiaries",
       x = "Quarter end", y = "Shares (TEJ units)") +
  theme_minimal()