This section summarizes each clean table in data/: row
count, date range, number of distinct tickers, and the highest share of
missing values in any column.
| table | rows | date_from | date_to | n_tickers | max_pct_missing |
|---|---|---|---|---|---|
| company | 141 | NA | NA | 141 | 1e+02 |
| universe_q | 2000 | 2020-12-31 | 2025-09-30 | 141 | 0e+00 |
| price_daily | 169286 | 2021-01-04 | 2025-12-31 | 141 | 0e+00 |
| financials_q | 2943 | 2020-12-31 | 2025-12-31 | 141 | 3e-02 |
| index_daily | 1214 | 2021-01-04 | 2025-12-31 | NA | 0e+00 |
Comment. All five required tables are loaded from
data/. The last column shows the worst column in each table
for missing values; column-level missing values and the decisions made
are documented in cleaning_log.md.
| Industry | Number of stocks |
|---|---|
| M23G | 22 |
| M23A | 13 |
| M23D | 13 |
| M28L | 12 |
| M23B | 7 |
| M17C | 5 |
| M26A | 5 |
| M15B | 4 |
| M23C | 4 |
| M23K | 4 |
| M28A | 4 |
| M13A | 3 |
| M20A | 3 |
| M23T | 3 |
| M11A | 2 |
| M14C | 2 |
| M15A | 2 |
| M22X | 2 |
| M23H | 2 |
| M23U | 2 |
| M25A | 2 |
| M26D | 2 |
| M28K | 2 |
| M29A | 2 |
| M99K | 2 |
| M99Z | 2 |
| M12B | 1 |
| M12C | 1 |
| M12Z | 1 |
| M13C | 1 |
| M14A | 1 |
| M16 | 1 |
| M17G | 1 |
| M18 | 1 |
| M19A | 1 |
| M20B | 1 |
| M21A | 1 |
| M22A | 1 |
| M23E | 1 |
| M26B | 1 |
| M99B | 1 |
Comment. In total, 141 stocks have at least 12 months of price data. The largest industry is M23G with 22 stocks, and 15 industries contain only one stock, so industry-level results should be read with care.
| quarter_end | prev_quarter_end | n_entered | n_left | turnover_rate |
|---|---|---|---|---|
| 2021-03-31 | 2020-12-31 | 5 | 5 | 0.05 |
| 2021-06-30 | 2021-03-31 | 9 | 9 | 0.09 |
| 2021-09-30 | 2021-06-30 | 6 | 6 | 0.06 |
| 2021-12-30 | 2021-09-30 | 4 | 4 | 0.04 |
| 2022-03-31 | 2021-12-30 | 6 | 6 | 0.06 |
| 2022-06-30 | 2022-03-31 | 7 | 7 | 0.07 |
| 2022-09-30 | 2022-06-30 | 5 | 5 | 0.05 |
| 2022-12-30 | 2022-09-30 | 4 | 4 | 0.04 |
| 2023-03-31 | 2022-12-30 | 4 | 4 | 0.04 |
| 2023-06-30 | 2023-03-31 | 6 | 6 | 0.06 |
| 2023-09-28 | 2023-06-30 | 5 | 5 | 0.05 |
| 2023-12-29 | 2023-09-28 | 3 | 3 | 0.03 |
| 2024-03-29 | 2023-12-29 | 6 | 6 | 0.06 |
| 2024-06-28 | 2024-03-29 | 3 | 3 | 0.03 |
| 2024-09-30 | 2024-06-28 | 3 | 3 | 0.03 |
| 2024-12-31 | 2024-09-30 | 5 | 5 | 0.05 |
| 2025-03-31 | 2024-12-31 | 5 | 5 | 0.05 |
| 2025-06-30 | 2025-03-31 | 3 | 3 | 0.03 |
| 2025-09-30 | 2025-06-30 | 5 | 5 | 0.05 |
Comment. On average 4.9 stocks enter and the same number leave each quarter, because the universe always has exactly 100 members. Mean turnover is 4.9% per quarter and the maximum is 9%, so the universe is fairly stable.
| Statistic | Value |
|---|---|
| Stock-months | 8369.0000 |
| With a return | 8228.0000 |
| NA returns | 141.0000 |
| |Return| > 100% | 5.0000 |
| Min | -0.4478 |
| Median | 0.0068 |
| Mean | 0.0174 |
| Max | 1.8661 |
Comment. Returns are computed from month-end
adjusted closes within each ticker. A ticker’s first month has no return
(NA), and so does any month whose previous month-end is missing. There
are 5 monthly returns beyond +/-100%; these are checked for split or
adjustment errors in cleaning_log.md.
| Industry | Stocks | Observations | Mean return | SD of return |
|---|---|---|---|---|
| M17G | 1 | 13 | 0.0963 | 0.3641 |
| M20B | 1 | 59 | 0.0538 | 0.1394 |
| M17C | 5 | 272 | 0.0414 | 0.1997 |
| M26A | 5 | 295 | 0.0410 | 0.2065 |
| M15B | 4 | 236 | 0.0349 | 0.1384 |
| M23H | 2 | 118 | 0.0347 | 0.1222 |
| M23B | 7 | 413 | 0.0297 | 0.1320 |
| M18 | 1 | 59 | 0.0254 | 0.1594 |
| M26D | 2 | 118 | 0.0227 | 0.1155 |
| M16 | 1 | 59 | 0.0223 | 0.1382 |
| M23D | 13 | 765 | 0.0222 | 0.1159 |
| M23A | 13 | 767 | 0.0204 | 0.1062 |
| M23T | 3 | 177 | 0.0183 | 0.0883 |
| M23G | 22 | 1278 | 0.0181 | 0.1368 |
| M28L | 12 | 708 | 0.0164 | 0.0511 |
| M23K | 4 | 236 | 0.0139 | 0.0581 |
| M20A | 3 | 177 | 0.0138 | 0.1436 |
| M12B | 1 | 59 | 0.0125 | 0.0613 |
| M28A | 4 | 236 | 0.0122 | 0.0403 |
| M25A | 2 | 118 | 0.0120 | 0.0845 |
| M14C | 2 | 118 | 0.0108 | 0.0904 |
| M19A | 1 | 59 | 0.0086 | 0.0860 |
| M23C | 4 | 236 | 0.0085 | 0.1027 |
| M28K | 2 | 118 | 0.0069 | 0.0843 |
| M23U | 2 | 118 | 0.0066 | 0.1100 |
| M12C | 1 | 59 | 0.0059 | 0.0313 |
| M99B | 1 | 59 | 0.0058 | 0.0846 |
| M14A | 1 | 59 | 0.0058 | 0.0420 |
| M29A | 2 | 118 | 0.0049 | 0.0712 |
| M22A | 1 | 59 | 0.0032 | 0.0961 |
| M99K | 2 | 118 | 0.0026 | 0.0617 |
| M26B | 1 | 59 | 0.0024 | 0.0253 |
| M11A | 2 | 118 | 0.0013 | 0.0576 |
| M21A | 1 | 59 | 0.0011 | 0.0790 |
| M15A | 2 | 118 | 0.0003 | 0.1039 |
| M23E | 1 | 59 | -0.0013 | 0.1340 |
| M13A | 3 | 177 | -0.0037 | 0.0842 |
| M13C | 1 | 59 | -0.0063 | 0.0693 |
| M12Z | 1 | 59 | -0.0067 | 0.0319 |
| M22X | 2 | 118 | -0.0072 | 0.0672 |
| M99Z | 2 | 118 | -0.0122 | 0.0911 |
Comment. The industry with the highest mean return is M17G (9.63% per month), but it rests on only 13 observations, so it is not reliable. Industries with few stocks and few observations also show the highest volatility, which is a sign that small samples and possible outliers drive the extremes.
No gap longer than 10 trading days was found.
Comment. Gaps are measured against the TAIEX trading
calendar, and days with zero volume are treated as no-price days because
TEJ carries the last price forward during suspensions. The query found 0
gaps affecting 0 stocks. A test that deletes 11 consecutive days of one
stock and confirms the query detects it is included in
queries.R.
The table has 6000 rows, 141 stocks and 60 months. Each row is a stock that was in the top 100 at the previous quarter-end, with accounting data taken only from statements whose statutory deadline had already passed at the end of month t.
| Column | Type | Unit | Meaning |
|---|---|---|---|
| ticker | text | - | TWSE stock code |
| month | Date | - | Month t (marked by the first day of the month) |
| formation_date | Date | - | Last trading day of month t (portfolio formation date) |
| prev_quarter_end | Date | - | Quarter-end whose top-100 ranking decides eligibility |
| rank_prev_q | integer | - | Market-cap rank at that quarter-end (1 to 100) |
| ret_next | numeric | ratio | Return in month t+1 (0.05 = 5%); NA in the last month |
| log_mktcap | numeric | ln(million NTD) | Size: natural log of market cap at the end of month t |
| bm | numeric | ratio | Book-to-market = book equity / market cap |
| roe | numeric | ratio | Trailing 4-quarter net income to parent / average equity |
| revenue | numeric | see dictionary | Revenue field from the statement used |
| stmt_period_end | Date | - | Period end of the statement used |
| stmt_deadline | Date | - | Statutory filing deadline of that statement (must be <= formation_date) |
| Variable | Missing | Percent | Reason |
|---|---|---|---|
| ret_next | 100 | 1.7 | No next-month price (last sample month) or the stock left the market |
| log_mktcap | 0 | 0.0 | No missing values: price and shares are available in every row |
| bm | 200 | 3.3 | No statement had been public yet at month t, or book equity is missing |
| roe | 1400 | 23.3 | Needs 4 consecutive quarters of net income and equity 4 quarters earlier; NA if the series is incomplete (under investigation, see cleaning_log.md) |
| revenue | 202 | 3.4 | No statement public yet, or the revenue field is missing |
| rows_dropped | tickers_affected |
|---|---|
| 0 | 0 |
| ticker | month | formation_date | prev_quarter_end | rank_prev_q | ret_next | log_mktcap | bm | roe | revenue | stmt_period_end | stmt_deadline |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1101 | 2021-01-01 | 2021-01-29 | 2020-12-31 | 29 | 0.0461 | 12.3700 | NA | NA | NA | NA | NA |
| 1101 | 2021-02-01 | 2021-02-26 | 2020-12-31 | 29 | 0.1143 | 12.4196 | NA | NA | NA | NA | NA |
| 1101 | 2021-03-01 | 2021-03-31 | 2020-12-31 | 29 | 0.1132 | 12.5383 | 0.7849 | NA | 32289325 | 2020-12-31 | 2021-03-31 |
| 1101 | 2021-04-01 | 2021-04-29 | 2021-03-31 | 28 | -0.0096 | 12.6623 | 0.6933 | NA | 32834962 | 2020-12-31 | 2021-03-31 |
| 1101 | 2021-05-01 | 2021-05-31 | 2021-03-31 | 28 | -0.0116 | 12.6527 | 0.7218 | NA | 21142807 | 2021-03-31 | 2021-05-15 |
| 1101 | 2021-06-01 | 2021-06-30 | 2021-03-31 | 28 | 0.0314 | 12.6517 | 0.7225 | NA | 21371294 | 2021-03-31 | 2021-05-15 |
| 1101 | 2021-07-01 | 2021-07-30 | 2021-06-30 | 28 | -0.0139 | 12.6826 | 0.7005 | NA | 21371294 | 2021-03-31 | 2021-05-15 |
| 1101 | 2021-08-01 | 2021-08-31 | 2021-06-30 | 28 | 0.0526 | 12.6004 | 0.7770 | NA | 27127459 | 2021-06-30 | 2021-08-14 |
| 1101 | 2021-09-01 | 2021-09-30 | 2021-06-30 | 28 | -0.0539 | 12.6518 | 0.7381 | NA | 27130206 | 2021-06-30 | 2021-08-14 |
| 1101 | 2021-10-01 | 2021-10-29 | 2021-09-30 | 26 | -0.0466 | 12.5965 | 0.7800 | NA | 27133870 | 2021-06-30 | 2021-08-14 |
Comment. The look-ahead rule works as follows: for
each stock-month, only statements with
stmt_deadline <= formation_date are eligible, and the
latest eligible quarter is kept. Rows with NA in bm or
roe mean that no eligible statement existed yet, or that
trailing-4-quarter ROE could not be computed.
## Complete cases: 4500 of 6000
## No look-ahead (deadline <= formation_date): TRUE