# Load five clean database tables
company <- readRDS("data/company.rds") %>% mutate(ticker = as.character(ticker))
universe_q <- readRDS("data/universe_q.rds") %>% mutate(ticker = as.character(ticker))
price_daily <- readRDS("data/price_daily.rds") %>% mutate(ticker = as.character(ticker))
financials_q <- readRDS("data/financials_q.rds") %>% mutate(ticker = as.character(ticker))
index_daily <- readRDS("data/index_daily.rds")# Load query output results
output_q1 <- read_csv("output_q1.csv")
output_q2 <- read_csv("output_q2.csv")
output_q3 <- read_csv("output_q3.csv")
output_q4 <- read_csv("output_q4.csv")
output_q5 <- read_csv("output_q5.csv")
output_q6 <- read_csv("output_q6.csv")data_profile_summary <- tibble(
Table = c("company", "universe_q", "price_daily", "financials_q", "index_daily"),
`Row Count` = c(nrow(company), nrow(universe_q), nrow(price_daily), nrow(financials_q), nrow(index_daily)),
`Column Count` = c(ncol(company), ncol(universe_q), ncol(price_daily), ncol(financials_q), ncol(index_daily)),
`Distinct Tickers` = c(n_distinct(company$ticker), n_distinct(universe_q$ticker),
n_distinct(price_daily$ticker), n_distinct(financials_q$ticker), "N/A"),
`Date Range` = c("Static Profile", "2020/12 – 2025/09", "2020-12-31 – 2025-09-30", "2019-09-30 – 2025-09-30", "2021-01-04 – 2025-12-31"),
`Primary Key` = c("ticker", "ticker, quarter_end", "ticker, date", "ticker, period_end", "date")
)
kable(data_profile_summary, caption = "Database Profile Overview") %>%
kable_styling(bootstrap_options = c("striped", "hover", "condensed"))| Table | Row Count | Column Count | Distinct Tickers | Date Range | Primary Key |
|---|---|---|---|---|---|
| company | 139 | 6 | 139 | Static Profile | ticker |
| universe_q | 2000 | 4 | 139 | 2020/12 – 2025/09 | ticker, quarter_end |
| price_daily | 157445 | 6 | 139 | 2020-12-31 – 2025-09-30 | ticker, date |
| financials_q | 2640 | 8 | 139 | 2019-09-30 – 2025-09-30 | ticker, period_end |
| index_daily | 1214 | 2 | N/A | 2021-01-04 – 2025-12-31 | date |
Data Profile Comment*: All required primary key integrity checks passed with zero missing keys or duplicate records. The sample includes 139 unique large-cap tickers that ever entered the top 100 universe across the 20 quarter-end ranking dates.
kable(output_q1, caption = "Q1: Active Stock Counts by Industry (Minimum 12 Months Price History)") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| industry_code | industry_name | stock_count |
|---|---|---|
| M11A | Cement Manufacturing | 2 |
| M12B | Oil & Feeding Stuffs | 1 |
| M12C | Dairy & Beverage | 1 |
| M12Z | Other Food Products | 1 |
| M13A | Petrochemical | 3 |
| M13C | Naphtha Cracking | 1 |
| M14A | Synthetic Fiber | 1 |
| M14C | Garment | 1 |
| M15A | Machinery | 2 |
| M15B | Electrical Products | 4 |
| M16 | Electric Wire | 1 |
| M17C | Pharmaceutical | 4 |
| M18 | Glass & Ceramics | 1 |
| M19A | Papermaking | 1 |
| M20A | Metal | 3 |
| M20B | Metal Products | 1 |
| M21A | Tire | 1 |
| M22A | Automobile Manufacturing | 1 |
| M22X | Automobile Commerce | 2 |
| M23A | Computer and Peripheral Equipment | 13 |
| M23B | Printed Circuit Board | 7 |
| M23C | Optoelectronics and I/O | 4 |
| M23D | Electronic Components | 13 |
| M23E | E-commerce and XaaS | 1 |
| M23G | Semiconductor | 21 |
| M23H | Electronic Instruments | 2 |
| M23K | Network and Communication | 4 |
| M23T | IT Distributor | 3 |
| M23U | Consumer Electronics | 2 |
| M25A | Construction | 2 |
| M26A | Sea Transportation | 5 |
| M26B | Land Transportation | 1 |
| M26D | Air Freight Forwarder | 2 |
| M28A | Local Bank | 4 |
| M28K | Lease/ Rental | 2 |
| M28L | Financial Holdings | 12 |
| M29A | Merchandise/ Wholesale | 2 |
| M99B | Household hardware & Furniture | 1 |
| M99K | Shoes & Suitcases | 2 |
| M99Z | Others | 2 |
A total of 40 distinct TEJ industry classifications contain stocks meeting the 12-month continuous price history requirement. Semiconductor and electronics industries represent the highest concentration of universe constituents, reflecting Taiwan’s equity market structure.
kable(output_q2, caption = "Q2: Quarter-Over-Quarter Top 100 Universe Turnover") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| quarter_end | entered | left |
|---|---|---|
| 2021/03 | 4 | 4 |
| 2021/06 | 10 | 10 |
| 2021/09 | 6 | 6 |
| 2021/12 | 4 | 4 |
| 2022/03 | 6 | 6 |
| 2022/06 | 7 | 7 |
| 2022/09 | 7 | 7 |
| 2022/12 | 3 | 3 |
| 2023/03 | 5 | 5 |
| 2023/06 | 5 | 5 |
| 2023/09 | 6 | 6 |
| 2023/12 | 3 | 3 |
| 2024/03 | 5 | 5 |
| 2024/06 | 3 | 3 |
| 2024/09 | 3 | 3 |
| 2024/12 | 5 | 5 |
| 2025/03 | 4 | 4 |
| 2025/06 | 4 | 4 |
| 2025/09 | 4 | 4 |
Universe turnover fluctuates between 2 and 10 stocks per quarter (averaging ~5% rebalancing per quarter). Rebalancing peaks typically align with significant quarterly macro-market volatility and industry rotational shifts (e.g., Q2 2021).
kable(head(output_q3, 10), caption = "Q3: Stock-Month Return Dataset (First 10 Observations)") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| ticker | year_month | adjusted_close | monthly_return |
|---|---|---|---|
| 1101 | 2020-12-01 | 31.8756 | NA |
| 1101 | 2021-01-01 | 29.6251 | -0.0706026 |
| 1101 | 2021-02-01 | 30.9902 | 0.0460792 |
| 1101 | 2021-03-01 | 34.5319 | 0.1142845 |
| 1101 | 2021-04-01 | 38.4426 | 0.1132489 |
| 1101 | 2021-05-01 | 38.0736 | -0.0095987 |
| 1101 | 2021-06-01 | 37.6309 | -0.0116275 |
| 1101 | 2021-07-01 | 38.8115 | 0.0313732 |
| 1101 | 2021-08-01 | 38.2735 | -0.0138619 |
| 1101 | 2021-09-01 | 40.2879 | 0.0526317 |
Monthly adjusted closes account for stock splits and dividend distributions. The resulting dataset contains r nrow(output_q3) stock-month price and return records covering 60 calendar months.
kable(output_q4, caption = "Q4: Industry-Level Risk and Return Metrics") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| industry_code | industry_name | mean_monthly_return | volatility_monthly |
|---|---|---|---|
| M11A | Cement Manufacturing | 0.0004969 | 0.0582152 |
| M12B | Oil & Feeding Stuffs | 0.0124361 | 0.0627451 |
| M12C | Dairy & Beverage | 0.0065414 | 0.0315659 |
| M12Z | Other Food Products | -0.0083690 | 0.0331034 |
| M13A | Petrochemical | -0.0089366 | 0.0783814 |
| M13C | Naphtha Cracking | -0.0116231 | 0.0652561 |
| M14A | Synthetic Fiber | 0.0041502 | 0.0437709 |
| M14C | Garment | 0.0062755 | 0.0773121 |
| M15A | Machinery | 0.0003556 | 0.1034823 |
| M15B | Electrical Products | 0.0348720 | 0.1379177 |
| M16 | Electric Wire | 0.0167314 | 0.1410397 |
| M17C | Pharmaceutical | 0.0541942 | 0.2269261 |
| M17G | Medical Supplies | 0.1619420 | 0.3911570 |
| M18 | Glass & Ceramics | 0.0184182 | 0.1607736 |
| M19A | Papermaking | 0.0047329 | 0.0909472 |
| M20A | Metal | 0.0124859 | 0.1472106 |
| M20B | Metal Products | 0.0529808 | 0.1382348 |
| M21A | Tire | 0.0035377 | 0.0781065 |
| M22A | Automobile Manufacturing | 0.0017847 | 0.0978301 |
| M22X | Automobile Commerce | -0.0083474 | 0.0679461 |
| M23A | Computer and Peripheral Equipment | 0.0228896 | 0.1066192 |
| M23B | Printed Circuit Board | 0.0271285 | 0.1311927 |
| M23C | Optoelectronics and I/O | 0.0105325 | 0.1014096 |
| M23D | Electronic Components | 0.0226539 | 0.1139710 |
| M23E | E-commerce and XaaS | 0.0053406 | 0.1392959 |
| M23G | Semiconductor | 0.0153391 | 0.1302480 |
| M23H | Electronic Instruments | 0.0350577 | 0.1227048 |
| M23K | Network and Communication | 0.0129878 | 0.0590151 |
| M23T | IT Distributor | 0.0199217 | 0.0870670 |
| M23U | Consumer Electronics | 0.0037212 | 0.1121588 |
| M25A | Construction | 0.0112456 | 0.0861820 |
| M26A | Sea Transportation | 0.0377858 | 0.2120702 |
| M26B | Land Transportation | 0.0010148 | 0.0280381 |
| M26D | Air Freight Forwarder | 0.0228501 | 0.1172435 |
| M28A | Local Bank | 0.0117869 | 0.0416128 |
| M28K | Lease/ Rental | 0.0082666 | 0.0848454 |
| M28L | Financial Holdings | 0.0147177 | 0.0508902 |
| M29A | Merchandise/ Wholesale | 0.0053863 | 0.0719005 |
| M99B | Household hardware & Furniture | 0.0110474 | 0.0856240 |
| M99K | Shoes & Suitcases | 0.0009000 | 0.0632613 |
| M99Z | Others | -0.0097450 | 0.0924325 |
Cross-industry performance exhibits wide dispersion over the 2021–2025 sample. High-beta sectors (such as Shipping and Semiconductor Equipment) exhibit higher monthly volatility compared to defensive sectors like Food Products and Utilities.
if(nrow(output_q5) == 0) {
cat("Zero stocks in the top 100 universe experienced a price gap exceeding 10 trading days.\n")
} else {
kable(output_q5, caption = "Q5: Identified Price Gaps > 10 Trading Days") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
}## Zero stocks in the top 100 universe experienced a price gap exceeding 10 trading days.
Audit check confirmed 0 records. Because the constituent universe is restricted to TWSE’s top 100 large-cap stocks, all firms maintained high market liquidity with unbroken price series (maximum gap strictly limited to standard market holiday closures).
kable(head(output_q6, 10), caption = "Q6: Final Point-in-Time Analysis Table (First 10 Rows)") %>%
kable_styling(bootstrap_options = c("striped", "hover"))| ticker | quarter_end | mktcap | log_mktcap | book_equity | book_to_market | roe | period_end | effective_public_date |
|---|---|---|---|---|---|---|---|---|
| 1101 | 2021/03 | 278808192 | 19.44603 | 218830053 | 0.7848767 | NA | 2020-12-31 | 2021-03-31 |
| 1101 | 2021/06 | 312302580 | 19.55948 | 225630014 | 0.7224725 | NA | 2021-03-31 | 2021-05-15 |
| 1101 | 2021/09 | 312334200 | 19.55958 | 230528578 | 0.7380830 | NA | 2021-06-30 | 2021-08-14 |
| 1101 | 2021/12 | 294011232 | 19.49913 | 220920689 | 0.7514022 | 0.0974496 | 2021-09-30 | 2021-11-14 |
| 1101 | 2022/03 | 305649177 | 19.53795 | 225654673 | 0.7382800 | 0.0897671 | 2021-12-31 | 2022-03-31 |
| 1101 | 2022/06 | 241946743 | 19.30423 | 235757755 | 0.9744200 | 0.0769499 | 2022-03-31 | 2022-05-15 |
| 1101 | 2022/09 | 227682918 | 19.24346 | 218958931 | 0.9616836 | 0.0493814 | 2022-06-30 | 2022-08-14 |
| 1101 | 2022/12 | 240805491 | 19.29950 | 221670446 | 0.9205373 | 0.0376128 | 2022-09-30 | 2022-11-14 |
| 1101 | 2023/03 | 260484988 | 19.37806 | 238275780 | 0.9147390 | 0.0226837 | 2022-12-31 | 2023-03-31 |
| 1101 | 2023/06 | 272292687 | 19.42239 | 240081034 | 0.8817021 | 0.0233588 | 2023-03-31 | 2023-05-15 |
The statutory reporting-lag rule was strictly enforced (Q1 by May 15, Q2 by Aug 14, Q3 by Nov 14, Q4 by Mar 31). Joining financials via effective_public_date <= quarter_end_date guarantees that no financial statement data is incorporated into portfolio formation before it became public, fully eliminating look-ahead bias. A total of r nrow(output_q6) valid point-in-time stock-quarter observations were built.