What ClinicalTrials.gov is, and why it counts as stock data
ClinicalTrials.gov is the clinical trial registry operated by the US National Institutes of Health. Pharmaceutical companies and hospitals worldwide register trials there when they begin. Registration is legally required for trials seeking US marketing approval, so most significant Korean pharma trials appear there as well. Anyone can query it for free, and there is a public API.
One of the registered fields is the estimated completion date: the date the sponsor itself has written down for when the trial is planned to end. What matters here is not its accuracy but its existence. The event that moves pharma and biotech prices most is the trial readout, and this field means roughly when that event will happen is disclosed in advance.
The perennial problem in predicting from market data is that you know neither what will happen nor when. Clinical trials are a rare domain where half of that is already solved. You do not know the content of the event, success or failure, but you roughly know its timing. That asymmetry is the starting point for this entire pipeline.
Why 60 days specifically
Buying on the day of the readout is late. The announcement arrives after the price has already begun absorbing it. Reviewing 77 past trial events, the correlation between institutional net buying and readout-day return was clear at the 30-day mark, and a large share of names that rose more than 5 percent gave much of it back. The old saying about buying the rumor and selling the news shows up directly in the data.
So the observation window is the two months before the readout. Watching begins at D-60, the judgment is made around D-30, and the position is closed before the announcement. The first version put a full year of trials into the candidate pool and the alerts became unusable. The complaint that too many names were coming through came from the actual user, which was me, so the window went from 365 days to 60. In the code it is a single constant.
That constant is shared by both the cron batch and the manual refresh, so changing one line changes both paths. You can widen it if you want a longer view, but the moment you do, a mass of low-scoring names comes with it.
How the filtering pipeline actually runs
A batch runs every morning in order. First, it pulls trials sponsored by Korean pharma and biotech companies from ClinicalTrials.gov. Second, it keeps only those whose estimated completion falls between 7 and 60 days out. Anything closer than 7 days is treated as already priced in and dropped. Third, the remaining trials are mapped to ticker symbols through a separate company-to-ticker mapping table.
Fourth, each ticker gets 60 days of order-flow data attached: short-selling balance ratio, institutional net buying, and foreign net buying. Fifth, that time series is split into an earlier half and a later half to ask whether the flow is accelerating. The signal is not that institutions are buying but that they are buying more in the later half.
Sixth, five technical strategies each run against the price data and return long, short, or neutral, and their consensus is computed. Seventh, all of it is folded into a single score. Finally the results are written to the database and pushed to Telegram.
What the six dimensions are measuring
Six axes are each scored 0 to 100 and combined into one weighted number. The weights are calibrated by backtest, but if the calibration sample is under 30 cases the calibrated values are discarded and the defaults are restored. That is the overfitting guard.
Above 75 is strong buy, above 60 is buy, above 45 is watch, above 30 is hold, and below that is avoid. One further condition applies. The top grade, strong buy, is only granted when at least three measured outcomes support it, because strong-buy calls that were never validated against measured results turned out to average negative realized returns.
The market dimension is, honestly, half dead right now. Excess-return-versus-market data is not yet collected, so a neutral constant of 50 goes in. Because of that, the code refuses any automatic calibration that tries to assign this dead dimension a large weight. A grid search once handed market a weight of 0.4, and giving 40 percent to a constant is not optimization, it is overfitting.
| Dimension | Weight | What it looks at |
|---|---|---|
| Clinical | 25% | Trial phase, days remaining to completion, pipeline activity |
| Order flow | 25% | Combined pattern of institutional and foreign buying and short-selling balance |
| Backtest | 20% | Measured past performance of the same grade and technical consensus pairing |
| Technical | 15% | Long and short consensus across five strategies |
| Market | 10% | Excess return versus market (fixed at neutral 50 while uncollected) |
| Indication | 5% | Premium or discount by disease category |
The strongest signal, and why its number was removed from the screen
Ten order-flow patterns are defined as named combinations. The best performing one is institutional buying accelerating in the later half while the short-selling ratio stays at or below 7 percent. Historically it averaged +8.43 percent with 94.12 percent of cases positive. The worst on the other end, institutional selling combined with foreign selling, averaged -6.63 percent with 10 percent positive.
94 percent is an attractive number. And this system does not show it in the alert.
The reason is simple. That 94.12 percent came from 17 cases. It is 16 out of 17. Seventeen cases is closer to anecdote than sample, and it swings hard if the conditions shift even slightly. Presenting a figure like that as if it were this stock's win rate is not analysis, it is advertising. The principle is written into the alert formatting code as a comment: combination constants are unvalidated backtest values and must not be exposed as forecasts, only actually measured returns may be shown, and the system's cumulative scorecard is disclosed transparently at the bottom.
So every alert carries a measured scorecard. As of 12 August, 15 recommendations have confirmed outcomes, averaging -2.6 percent with 27 percent positive. On a long-only basis the expected value is not yet above zero. It is an alert that reports its own losing record back to me every day.
Making numbers look good is easy. Pick a favorable window, do not grow the sample, write backtest constants as if they were track record. The hard part is deleting the good-looking number yourself and putting the unflattering measured one in its place. The hardest part of this pipeline was not the scoring. It was that decision.
What showed up in the 12 August alert, and how to read it
In the batch that ran early on 12 August 2026, four names passed the filters. Samsung Biologics was the only one to reach a buy grade at a composite 75.9, in Phase 3 with 20 days remaining to estimated completion, which also satisfied the golden signal condition of buy-or-better, Phase 3, and composite of 60 or more. The other three were Ko Bio Labs at 55.3 (watch), Daewon Pharmaceutical at 50.9 (watch), and Boryung at 37.1 (hold).
The reason this must not be read as a stock recommendation is the scorecard in the previous section. The score does not say this name will go up. It says this name scored this well against six conditions I chose. That it is output from a system whose measured expected value is still negative has to be read alongside it.
Asked what the number is good for, my answer is narrowing the field. There are hundreds of listed pharma and biotech names in Korea and far more trials. Cutting that to four every morning at least gives a person something to look at. The judgment after that is still human. This system does not place orders.
How to receive the output, or build your own
The daily output is visible as is on the public Telegram channel t.me/ClinicalSignalKR. Company name, grade, signal combination, trial phase and days remaining, composite score, technical consensus, and the measured scorecard at the bottom go out in the same body the operator receives. There is no separately polished edition.
If you want to build your own, every ingredient is public data. Trial schedules come from the ClinicalTrials.gov public API. Short-selling balances and investor-type trading flows are published by the Korea Exchange. Closing prices and volume are available from broker or public quote APIs. In other words you can start without paid data.
If you change one thing about the order of construction, make it this. Do not build the scoring first. Build the place where measured outcomes are recorded first: the columns for entry price, exit price, and realized return. Without it you will never have a way to falsify your backtest numbers, and then whatever you build, you will end up believing the flattering ones.
