PageSourceSearch

https://jkpfactors.com/

html jkpfactors.com collected 2026-09-24 10:38:24 UTC 52,468 bytes, 1,160 lines download raw bytes

1<!doctype html>
2<html lang="en">
3
4<head>
5    <meta charset="utf-8">
6    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7    <meta name="author" content="Theis I. Jensen, Bryan Kelly, Lasse H. Pedersen">
8    <link rel="shortcut icon" href="https://jkpfactors.com/favicon.ico">
9
10    
11    
11<script>
12        (function () {
13            try {
14                var p = localStorage.getItem('jkpfactors_theme_preference');
15                if (p !== 'light' && p !== 'dark' && p !== 'system') p = 'system';
16                var dark = p === 'dark' || (p === 'system' &&
17                    window.matchMedia('(prefers-color-scheme: dark)').matches);
18                document.documentElement.setAttribute('data-theme', dark ? 'dark' : 'light');
19            } catch (e) {
20                document.documentElement.setAttribute('data-theme', 'light');
21            }
22        })();
23    </script>
23
24
25    <!-- Google tag (gtag.js) -->
vendor: 64 bytes, lines 25-26
25
26<script async src="https://www.googletagmanager.com/gtag/js?id=
26G-M3NRZ2NVB6
vendor: 12 bytes, line 26
26"></script>
27<script>
28  
vendor: 134 bytes, lines 28-32
28window.dataLayer = window.dataLayer || [];
29  function gtag(){dataLayer.push(arguments);}
30  gtag('js', new Date());
31
32  gtag('config', '
32G-M3NRZ2NVB6
vendor: 4 bytes, line 32
32');
33</script>
33
34
35    <meta name="description" content="Global Factor Data: 153 characteristics/factors clustered into 13 themes across 93 countries, from Jensen, Kelly, and Pedersen's Journal of Finance 2023 paper on the replication crisis in finance." />
36
37    <link rel="preconnect" href="https://fonts.googleapis.com">
38    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
39    <link href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@0;1&display=swap" rel="stylesheet">
40
41    <link
42        href="https://fonts.googleapis.com/css2?family=DM+Serif+Display:ital@1&family=Raleway:ital,wght@0,100..900;1,100..900&display=swap"
43        rel="stylesheet">
44
45    <!-- Client CSS + theme manager compiled by Vite -->
46    <link rel="preload" as="style" href="https://jkpfactors.com/build/assets/client-DLLOMoQ2.css" /><link rel="modulepreload" as="script" href="https://jkpfactors.com/build/assets/theme-DNy6x2FE.js" /><link rel="stylesheet" href="https://jkpfactors.com/build/assets/client-DLLOMoQ2.css" />
46<script type="module" src="https://jkpfactors.com/build/assets/theme-DNy6x2FE.js"></script>
46    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/select2.min.css" rel="stylesheet" />
47    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
48        integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA=="
49        crossorigin="anonymous" referrerpolicy="no-referrer" />
50    <link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
51    
52    <!-- Prism.js for syntax highlighting -->
53    <link href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/themes/prism-tomorrow.min.css" rel="stylesheet" />
54    <link href="https://jkpfactors.com/client/css/prism-unified.css" rel="stylesheet" />
55    
56    <meta name="csrf-token" content="slHS1st6xJYtXitrSWrLNGuWAJPcVduSvUNREgq8">
57    <style>
58        .header-title {
59            font-family: 'DM Serif Display';
60            color: var(--text);
61            white-space: normal;
62            padding-top: 10px;
63            width: 100%;
64            text-transform: uppercase;
65        }
66
67        .select2-container .select2-selection--single {
68            height: 50px !important;
69        }
70
71        .select2-container--default .select2-selection--single .select2-selection__rendered {
72            line-height: 45px !important;
73        }
74
75        .select2-container--default .select2-results__option--disabled {
76            font-size: 13px !important;
77            color: var(--text) !important;
78            font-weight: 300 !important;
79            border-bottom: 1px solid var(--border) !important;
80        }
81
82        .bg-purple {
83            background: var(--brand-navy) !important;
84        }
85
86        a {
87            word-wrap: break-word;
88        }
89
90        .newcol.active {
91            color: #238822 !important;
92        }
93
94        .newcol:hover {
95            color: var(--accent) !important;
96        }
97
98        .nav-link {
99            opacity: 1 !important;
100        }
101
102        .select2-container--default .select2-results__option--highlighted.select2-results__option--selectable {
103            background-color: var(--accent) !important;
104            color: #ffffff !important;
105        }
106
107        @media all and (min-width: 992px) {
108            .dropdown-menu li {
109                position: relative;
110            }
111
112            .nav-item .submenu {
113                display: none;
114                position: absolute;
115                left: 100%;
116                top: -7px;
117            }
118
119            .nav-item .submenu-left {
120                right: 100%;
121                left: auto;
122            }
123
124            .dropdown-menu>li:hover {
125                background-color: var(--bg-inset)
126            }
127
128            .dropdown-menu>li:hover>.submenu {
129                display: block;
130            }
131        }
132
133        /* ============ desktop view .end// ============ */
134
135        /* ============ small devices ============ */
136        @media (max-width: 991px) {
137            .dropdown-menu .dropdown-menu {
138                margin-left: 0.7rem;
139                margin-right: 0.7rem;
140                margin-bottom: .5rem;
141            }
142        }
143
144        .code-blue {
145            color: #4759AB;
146        }
147
148        .code-dark {
149            color: #003C4F;
150        }
151
152        .code-green {
153            color: #657422;
154        }
155
156        .code-p-green {
157            color: #21794D;
158        }
159
160        .code-red {
161            color: #AD0000;
162        }
163
164        .blue-box {
165            background-color: var(--bg-elevated);
166            color: var(--text);
167            padding: 20px;
168            margin-top: 20px;
169            margin-bottom: 20px;
170            border-radius: 4px;
171            position: relative;
172            width: 100%;
173
174            box-shadow: -2px 2px 11px -4px rgba(0, 0, 0, 0.64);
175            -webkit-box-shadow: -2px 2px 11px -4px rgba(0, 0, 0, 0.64);
176            -moz-box-shadow: -2px 2px 11px -4px rgba(0, 0, 0, 0.64);
177        }
178
179        body {
180            font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif !important;
181            color: var(--text) !important;
182        }
183
184        .comment-text {
185            color: var(--text-muted);
186        }
187
188        .navbar-expand-md .navbar-nav .dropdown-menu {
189            top: 51px;
190        }
191
192        .mylist:hover {
193            background: transparent !important;
194            color: var(--text-muted) !important;
195            cursor: pointer;
196        }
197
198        .text-blue {
199            color: var(--text) !important;
200            text-decoration: none;
201            font-size: 15px !important;
202        }
203
204        p {
205            font-family: Raleway;
206            font-size: 18px;
207            line-height: 160%;
208            text-align: justify;
209        }
210
211        .hide-show {
212            cursor: pointer;
213
214            text-decoration: underline;
215        }
216
217        .dm-serif-regular {
218            font-family: "DM Serif Display";
219        }
220
221        .raleway-font {
222            font-family: Raleway !important;
223        }
224
225        .dropdown-item.active,
226        .dropdown-item:active {
227            color: var(--text);
228            text-decoration: none;
229            background-color: transparent;
230        }
231
232        .author {
233            text-decoration: none;
234            font-size: 20px !important;
235            color: var(--primary);
236        }
237
238        .author-dec {
239            font-family: "Raleway", sans-serif;
240            font-size: 12px;
241            color: var(--text-subtle);
242            text-align: center;
243        }
244
245        .newcol {
246            font-size: 12px;
247            display: inline-block;
248            margin: 5px 8px;
249            color: var(--text-muted);
250            padding-bottom: 0px;
251            width: 100%;
252            padding-right: .5rem;
253            padding-left: .5rem;
254
255            text-wrap: nowrap;
256        }
257
258        .newcol-aft {
259            position: relative;
260        }
261
262        .newcol-aft::after {
263            display: inline-block;
264            margin-left: .255em;
265            vertical-align: .255em;
266            content: "";
267            border-top: .3em solid;
268            border-right: .3em solid transparent;
269            border-bottom: 0;
270            border-left: .3em solid transparent;
271        }
272
273        @media screen and (max-width: 700px) {
274            .newbar {
275                flex-direction: column !important;
276                line-height: 15px !important;
277                margin-top: 20px;
278            }
279
280        }
281
282        .dropdown-submenu {
283            position: relative;
284        }
285
286        .dropdown-submenu .dropdown-menu {
287            top: 0;
288            left: 100%;
289            margin-top: -1px;
290        }
291
292        .btn-default.active,
293        .btn-default:active,
294        .open>.dropdown-toggle.btn-default {
295            color: var(--primary) !important;
296            background: transparent !important;
297            background-image: none !important;
298            border: none !important;
299        }
300
301        .btn-default {
302            color: var(--primary) !important;
303            background: transparent !important;
304            border: none !important;
305        }
306
307        .dropdown-submenu {
308            position: relative;
309        }
310
311        .dropdown-submenu .dropdown-menu {
312            bottom: 0;
313            left: 0;
314            position: relative;
315            border: 0
316        }
317
318
319        :root {
320            --primary-color: #D5E2FD;
321            --icon-size: 3rem;
322        }
323
324        input[type="radio"] {
325            display: inline-block;
326            position: absolute;
327            overflow: hidden;
328            clip: rect(0 0 0 0);
329            height: 1;
330            width: 1;
331            margin: -1;
332            padding: 0;
333            border: 0;
334        }
335
336        .icon {
337            display: flex;
338            justify-content: center;
339            align-items: center;
340            color: var(--text);
341            border-radius: 0.5rem;
342            overflow: hidden;
343            padding: 0px 7.5px;
344        }
345
346        .icon:hover {
347            cursor: pointer;
348            background-color: var(--primary-color);
349        }
350
351        .peer:checked~.icon {
352            background-color: var(--primary-color);
353        }
354
355
356        .wrapper {
357            display: flex;
358            flex-shrink: 0;
359            gap: 0.5rem;
360        }
361
362        .main-container-text {
363            font-size: 18px !important;
364            line-height: 160% !important;
365            text-align: justify;
366        }
367
368        /* .container {
369            max-width: 1140px !important;
370        } */
371
372        .form-switch .form-check-input:checked {
373            background-position: right center;
374            background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e") !important;
375        }
376
377        .form-switch .form-check-input:focus {
378            background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e") !important;
379        }
380
381        .form-check-input {
382            width: 1em;
383            height: 1em;
384            margin-top: .25em;
385            vertical-align: top;
386            background-color: var(--bg-elevated);
387            background-repeat: no-repeat;
388            background-position: center;
389            background-size: contain;
390            border: 1px solid rgba(0, 0, 0, .25);
391            -webkit-appearance: none;
392            -moz-appearance: none;
393            appearance: none;
394            -webkit-print-color-adjust: exact;
395            color-adjust: exact;
396        }
397
398        .form-check-input[type=checkbox] {
399            border-radius: 0.25em !important;
400            border: 1px solid rgba(0, 0, 0, .25) !important;
401        }
402
403        .form-check-input:focus {
404            border-color: #86b7fe;
405            outline: 0;
406            box-shadow: 0 0 0 .25rem rgba(13, 110, 253, .25)
407        }
408
409        /* Machine-readable alternates card. Shared by the CTF pages that
410           publish a Markdown or JSON version of themselves. Every colour is a
411           theme token, which is what makes dark mode work without a
412           prefers-color-scheme block. */
413        /* Machine-readable rules card. Every colour is a theme token, which is
414           what makes dark mode work without a prefers-color-scheme block. */
415        .llm-card {
416            background-color: var(--bg-sunken);
417            border-left: 4px solid var(--primary);
418            padding: 1rem;
419            margin: 1rem 0 1.5rem;
420        }
421        .llm-card__heading {
422            font-family: 'Raleway', sans-serif;
423            font-size: 1rem;
424            font-weight: bold;
425            color: var(--primary);
426            margin: 0 0 0.5rem;
427        }
428        .llm-card__lead {
429            font-family: 'Raleway', sans-serif;
430            font-size: 0.9rem;
431            line-height: 1.6;
432            color: var(--text);
433            margin-bottom: 0.75rem;
434        }
435        .llm-card__actions {
436            display: flex;
437            flex-wrap: wrap;
438            align-items: center;
439            gap: 0.75rem;
440            margin-bottom: 0.75rem;
441        }
442        .llm-card__btn {
443            background-color: var(--bg-elevated);
444            color: var(--text);
445            border: 1px solid var(--border-strong);
446            padding: 0.35rem 0.75rem;
447            border-radius: 0.2rem;
448            cursor: pointer;
449            font-family: 'Raleway', sans-serif;
450            font-size: 0.8rem;
451            display: inline-flex;
452            align-items: center;
453            justify-content: center;
454            /* Fixed width so the Copied / Copy failed states do not shift layout. */
455            min-width: 13.5rem;
456        }
457        .llm-card__btn:hover {
458            background-color: var(--border);
459            border-color: var(--text-muted);
460        }
461        .llm-card__btn:focus-visible {
462            outline: 2px solid var(--primary);
463            outline-offset: 2px;
464        }
465        .llm-card__btn[data-state="success"] {
466            color: var(--success);
467            border-color: var(--success);
468        }
469        .llm-card__btn[data-state="error"] {
470            color: var(--danger);
471            border-color: var(--danger);
472        }
473        .llm-card__url {
474            font-size: 0.8rem;
475            word-break: break-all;
476        }
477        .llm-card__meta {
478            list-style: none;
479            padding-left: 0;
480            margin: 0;
481            font-family: 'Raleway', sans-serif;
482            font-size: 0.8rem;
483            line-height: 1.6;
484            color: var(--text-muted);
485        }
486        .llm-card__meta li {
487            margin-bottom: 0.25rem;
488        }
489        .llm-card code {
490            font-size: 0.8rem;
491            word-break: break-all;
492        }
493    </style>
494        <style>
495        .copyButton {
496            cursor: pointer;
497        }
498
499        .tooltip {
500            width: 20px;
501            height: 20px;
502        }
503
504        code {
505            color: var(--primary) !important;
506        }
507    </style>
508    <title>Home | Global Factor Data</title>
509
510    
511    
512    <!-- jQuery -->
513    
513<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
513
514
515
516
517</head>
518
519<body>
520
521    <div class="w-100 mb-0 py-md-4 pt-3 dm-serif-regular" style="background-color: var(--bg-elevated); color: var(--text);">
522    <div class="header-title text-center">
523        <div class="d-none d-xl-block" style="font-size:64px;">Global Factor Data</div>
524        <div class="d-none d-lg-block d-xl-none" style="font-size:48px;">Global Factor Data</div>
525        <div class="d-none d-md-block d-lg-none" style="font-size:36px;">Global Factor Data</div>
526        <div class="d-sm-block d-md-none" style="font-size:28px;">Global Factor Data</div>
527    </div>
528</div>
529
530<nav style="padding-bottom: 5px !important; background-color: var(--bg-elevated);  width: 100%; margin: auto;">
531    <div class="container-fluid border-bottom">
532        <div class="d-flex justify-content-center flex-wrap">
533            <div class="px-0">
534                <a href="/" class="newcol text-blue  active ">About</a>
535            </div>
536            <div class="px-0">
537                <a href="/data" class="newcol text-blue ">Data Download</a>
538            </div>
539            <div class="px-0">
540                <a href="/analysis" class="newcol text-blue ">Analysis</a>
541            </div>
542            <div class="px-0">
543                <a class="newcol newcol-aft text-blue " href="#"
544                    id="navbarDropdownMenuLink" role="button" data-bs-toggle="dropdown" aria-expanded="false">
545                    Resources
546                </a>
547                <ul class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
548                    <li class="dropdown-submenu">
549                    </li>
550                    <li><a class="dropdown-item" target="_blank"
551                            href="https://jkpfactors-data.s3.amazonaws.com/documents/Documentation.pdf">Documentation</a></li>
552                    <li><a class="dropdown-item" href="https://jkpfactors.com/jkp-wrds-guide">JKP/WRDS Guide</a></li>
553                    <li><a class="dropdown-item" href="https://jkpfactors.com/release-notes">Release Notes</a></li>
554                    <li><hr class="dropdown-divider"></li>
555                    <li style="pointer-events: none;"><span class="dropdown-item-text text-muted" style="font-size: 12px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;"><i class="fa-brands fa-github me-1"></i>GitHub</span></li>
556                    <li><a class="dropdown-item" target="_blank"
557                            href="https://github.com/bkelly-lab/jkp-data">Repository</a></li>
558                    <li><a class="dropdown-item" target="_blank"
559                            href="https://github.com/bkelly-lab/jkp-data/discussions">Community Discussions</a></li>
560                    <li><a class="dropdown-item" target="_blank"
561                            href="https://github.com/bkelly-lab/jkp-data/blob/main/CONTRIBUTING.md">Contributing Guide</a></li>
562                </ul>
563            </div>
564
565            <div class="px-0">
566                <ul class="list-unstyled" style="margin: 0px auto;">
567                    <li class="nav-item dropdown">
568                        <a href="#" class="newcol newcol-aft text-blue" id="navbarDropdown" role="button"
569                            data-bs-toggle="dropdown" aria-expanded="false">
570                            Common Task Framework
571                        </a>
572                        <ul class="dropdown-menu" aria-labelledby="navbarDropdown">
573                            <li style="margin: auto; width: 100%;"><a class="dropdown-item"
574                                    style="color: var(--text) !important;" href="https://jkpfactors.com/ctf/rules">
575                                    Rules
576                                </a></li>
577                            <li style="margin: auto; width: 100%;"><a class="dropdown-item"
578                                    style="color: var(--text) !important;" href="https://jkpfactors.com/ctf/dataset-access">
579                                    Dataset Access
580                                </a></li>
581                            <li style="margin: auto; width: 100%;"><a class="dropdown-item"
582                                    style="color: var(--text) !important;" href="https://jkpfactors.com/ctf/submit">
583                                    Model Submission
584                                </a></li>
585                            <li style="margin: auto; width: 100%;"><a class="dropdown-item"
586                                    style="color: var(--text) !important;" href="https://jkpfactors.com/ctf/leaderboard">
587                                    Leaderboard
588                                </a></li>
589                        </ul>
590                    </li>
591                </ul>
592            </div>
593
594            <div class="px-0">
595                <a href="/contact" class="newcol text-blue ">Contact Us</a>
596            </div>
597
598            <div class="px-0 d-flex align-items-center">
599                <div class="theme-toggle" role="group" aria-label="Color theme">
600                    <button type="button" class="theme-toggle__btn" data-theme-choice="light"
601                        aria-pressed="false" title="Light theme" aria-label="Light theme">
602                        <i class="fa-solid fa-sun" aria-hidden="true"></i>
603                    </button>
604                    <button type="button" class="theme-toggle__btn" data-theme-choice="dark"
605                        aria-pressed="false" title="Dark theme" aria-label="Dark theme">
606                        <i class="fa-solid fa-moon" aria-hidden="true"></i>
607                    </button>
608                    <button type="button" class="theme-toggle__btn" data-theme-choice="system"
609                        aria-pressed="false" title="Match system theme" aria-label="Match system theme">
610                        <i class="fa-solid fa-desktop" aria-hidden="true"></i>
611                    </button>
612                </div>
613            </div>
614        </div>
615    </div>
616</nav>
617
618        <!-- Start Hero Section -->
619    <section>
620        <div class="main">
621            <div class="container">
622                <p class="my-3 container raleway-font text-dark main-container-text">
623                    This website is based on the article <a
624                        href="https://onlinelibrary.wiley.com/doi/full/10.1111/jofi.13249">“Is There a Replication Crisis in
625                        Finance?”</a>
625 (Jensen, Kelly, and Pedersen, Journal of Finance 2023).
626                    This paper constructs 153 characteristics/factors clustered into 13 themes (see cluster diagram <a
627                        href="/graph">here</a> ) in
628                    93 countries. This website provides access to the data and a number of other resources.
629
630                    Please cite our paper if you are using this data. You can access the BibTeX <a class="copyButton raleway-font text-dark position-relative">here.<span class="tooltip">Copied!</span></a>
631                    <code style="display: none">
632                        @article{JensenKellyPedersen2023, <br>
633                        &nbsp; &nbsp; &nbsp; &nbsp; author = {Jensen, Theis Ingerslev and Kelly, Bryan
634                        and
635                        Pedersen, Lasse Heje}, <br>
636                        &nbsp; &nbsp; &nbsp; &nbsp; title = {Is There a Replication Crisis in Finance?},
637                        <br>
638                        &nbsp; &nbsp; &nbsp; &nbsp; journal = {The Journal of Finance}, <br>
639                        &nbsp; &nbsp; &nbsp; &nbsp; volume = {78}, <br>
640                        &nbsp; &nbsp; &nbsp; &nbsp; number = {5}, <br>
641                        &nbsp; &nbsp; &nbsp; &nbsp; pages = {2465-2518}, <br>
642                        &nbsp; &nbsp; &nbsp; &nbsp; year = {2023} <br>
643                        }
644                    </code>
645                </p>
646
647                <div class="mt-5">
648                    <div class="text-center mb-4"
649                        style="font-size:20px; color:var(--text); margin-bottom:20px; font-family: 'DM Serif Display' !important;">
650                        <span class="text-center fs-5"
651                            style="border-bottom:solid 2px var(--text); padding-bottom: 3px;">Authors</span>
652                    </div>
653
654                    <div class="container">
655                        <div class="row">
656                            <div class="col-4">
657                                <div class="col-12">
658                                    <h2 class="text-center" style="font-size: 20px;font-weight: 300;">
659                                        <a class="author raleway-font" style="color: var(--accent);; font-size: 20px;"
660                                            href="https://www.tijensen.com/">Theis I.
661                                            Jensen</a>
662                                    </h2>
663                                </div>
664                                <div class="col-12">
665                                    <p class="text-center author-dec mb-2">Yale</p>
666                                </div>
667                            </div>
668
669                            <div class="col-4">
670                                <div class="col-12">
671                                    <h2 class="text-center" style="font-size: 20px;font-weight: 300;">
672                                        <a class="author raleway-font" style="color: var(--accent);; font-size: 20px;"
673                                            href="https://www.bryankellyacademic.org/">Bryan Kelly</a>
674                                    </h2>
675                                </div>
676                                <div class="col-12">
677                                    <p class="text-center author-dec mb-2">
678                                        Yale, AQR Capital, and NBER
679                                    </p>
680                                </div>
681                            </div>
682
683                            <div class="col-4">
684                                <div class="col-12">
685                                    <h2 class="text-center" style="font-size: 20px;font-weight: 300;">
686                                        <a class="author raleway-font" style="color: var(--accent);; font-size: 20px;"
687                                            href="https://www.lhpedersen.com/">Lasse H.
688                                            Pedersen</a>
689                                    </h2>
690                                </div>
691                                <div class="col-12">
692                                    <p class="text-center author-dec mb-2">
692Copenhagen Business School and AQR Capital</p>
693                                </div>
694                            </div>
695                        </div>
696                    </div>
697                </div>
698
699                <section class="news-section mt-5" aria-labelledby="news-heading">
700                    <div class="text-center"
701                        style="font-size:20px; color:var(--text); margin-bottom:20px; font-family: 'DM Serif Display' !important;">
702                        <h2 id="news-heading" class="text-center fs-5 d-inline"
703                            style="border-bottom:solid 2px var(--text); padding-bottom: 3px; font-size: inherit; font-weight: inherit;">News</h2>
704                    </div>
705
706                    <div class="container">
707                        <div class="news-list-container">
708                                                        <article class="news-item">
709                                <div class="news-item-header">
710                                    <time datetime="2026-04-16">Apr 2026</time>
711                                    <a href="https://github.com/bkelly-lab/jkp-data/discussions/89" target="_blank" rel="noopener noreferrer" class="news-item-title">Data Updated Through December 2025<span class="visually-hidden"> (opens in new tab)</span></a>
712                                </div>
713                                <p class="news-item-excerpt">All data on jkpfactors.com has been updated through December 2025. Factor returns (long-minus-short, high-minus-low, theme clusters) for all 153...</p>
714                            </article>
715                                                        <article class="news-item">
716                                <div class="news-item-header">
717                                    <time datetime="2026-04-16">Apr 2026</time>
718                                    <a href="https://github.com/bkelly-lab/jkp-data/discussions/88" target="_blank" rel="noopener noreferrer" class="news-item-title">New Data Types Available for Download on jkpfactors.com<span class="visually-hidden"> (opens in new tab)</span></a>
719                                </div>
720                                <p class="news-item-excerpt">We&#039;ve expanded the data available on jkpfactors.com with several new download categories beyond the long-short factor returns that have been...</p>
721                            </article>
722                                                        <article class="news-item">
723                                <div class="news-item-header">
724                                    <time datetime="2026-01-30">Jan 2026</time>
725                                    <a href="https://github.com/bkelly-lab/jkp-data/discussions/28" target="_blank" rel="noopener noreferrer" class="news-item-title">The Common Task Framework is Live - Submit Your Pricing Model<span class="visually-hidden"> (opens in new tab)</span></a>
726                                </div>
727                                <p class="news-item-excerpt">A new chapter in asset pricing research begins: the Common Task Framework (CTF) is now open for submissions. Ready to compete? Submit your model, see...</p>
728                            </article>
729                                                    </div>
730
731                                                <nav class="news-pagination" aria-label="News pagination" id="news-pagination"
732                             data-api-url="https://jkpfactors.com/api/news"
733                             data-current-page="1"
734                             data-last-page="2">
735                            <div class="pagination-controls">
736                                
737                                                                <span class="pagination-btn pagination-nav disabled" aria-disabled="true">
738                                    <i class="fa-solid fa-angles-left"></i>
739                                </span>
740                                
741                                
742                                                                <span class="pagination-btn pagination-nav disabled" aria-disabled="true">
743                                    <i class="fa-solid fa-chevron-left"></i>
744                                </span>
745                                
746                                
747                                <div class="pagination-pages">
748                                    
749                                    
750                                                                                                            <sp
750an class="pagination-btn pagination-page active" aria-current="page">1</span>
751                                                                                                                                                <a href="https://jkpfactors.com?news_page=2" class="pagination-btn pagination-page" data-page="2">2</a>
752                                                                        
753                                                                    </div>
754
755                                
756                                                                <a href="https://jkpfactors.com?news_page=2" class="pagination-btn pagination-nav" aria-label="Next page" data-page="2">
757                                    <i class="fa-solid fa-chevron-right"></i>
758                                </a>
759                                
760                                
761                                                                <a href="https://jkpfactors.com?news_page=2" class="pagination-btn pagination-nav" aria-label="Last page" data-page="2">
762                                    <i class="fa-solid fa-angles-right"></i>
763                                </a>
764                                                            </div>
765
766                            <div class="pagination-info">
767                                Page 1 of 2
768                            </div>
769                        </nav>
770                                            </div>
771                </section>
772
773                <div class="row align-items-center mt-5">
774                    <div class="col-md-12">
775                        <div class="intro-excerpt">
776                            <div>
777                                <p style="line-height: 25px;" class="text-dark">
778                                    The content of this website is updated regularly as new data becomes available. See
779                                    the News section above for the latest update.
780                                    
781                                </p>
782                            </div>
783                        </div>
784                    </div>
785                </div>
786
787                <!-- Missing Your Favorite Factor CTA Section -->
788                <div class="text-center mt-5"
789                    style="font-size:20px; color:var(--text); margin-bottom:20px; font-family: 'DM Serif Display' !important;">
790                    <span class="text-center fs-5"
791                        style="border-bottom:solid 2px var(--text); padding-bottom: 3px;">Community</span>
792                </div>
793
794                <div class="container">
795                    <div style="border: 1px solid var(--border); border-radius: 4px; padding: 25px 30px;">
796                        <h4 class="text-center mb-3" style="font-family: 'DM Serif Display' !important;">Missing Your Favorite Factor?</h4>
797                        <p class="raleway-font text-dark text-center mb-4" style="font-size: 16px; line-height: 1.6;">
798                            We're always looking to expand our factor library. Whether you're a researcher with a paper reference or a developer ready to contribute code, we'd love to hear from you.
799                        </p>
800                        <div class="row justify-content-center mb-3">
801                            <div class="col-md-6">
802                                <p class="raleway-font mb-2" style="font-size: 14px;"><strong>For researchers:</strong> Request a factor: tell us the paper and we'll add it when we can.</p>
803                                <p class="raleway-font mb-0" style="font-size: 14px;"><strong>For developers:</strong> Contribute Python code following the JKP format.</p>
804                            </div>
805                        </div>
806                        <div class="d-flex flex-wrap justify-content-center gap-3 mt-4">
807                            <a href="https://github.com/bkelly-lab/jkp-data/discussions" target="_blank"
808                                class="btn rounded rounded-pill px-4 py-2"
809                                style="font-weight: 500; border: 2px solid var(--accent); color: white; background: var(--accent);">
810                                <i class="fa-brands fa-github me-2"></i>Join the Discussion
811                            </a>
812                            <a href="https://github.com/bkelly-lab/jkp-data/discussions/categories/ideas" target="_blank"
813                                class="btn rounded rounded-pill px-4 py-2"
814                                style="font-weight: 200; border: 1px solid var(--text); color: var(--text); background: transparent;">
815                                <i class="fa-solid fa-lightbulb me-2"></i>Request a Factor
816                            </a>
817                            <a href="/contact"
818                                class="btn rounded rounded-pill px-4 py-2"
819                                style="font-weight: 200; border: 1px solid var(--text); color: var(--text); background: transparent;">
820                                <i class="fa-solid fa-envelope me-2"></i>Contact Us
821                            </a>
822                        </div>
823                        <p class="text-center mt-3 mb-0">
824                            <a href="https://github.com/bkelly-lab/jkp-data/blob/main/CONTRIBUTING.md" target="_blank"
825                                class="raleway-font" style="font-size: 14px; color: var(--accent);">
826                                <i class="fa-solid fa-arrow-right me-1"></i>View Contributing Guide
827                            </a>
828                        </p>
829                    </div>
830                </div>
831            </div>
832        </div>
833    </section>
834
835
836    <!-- Start Footer Section -->
837<footer class="py-4 mt-5" style="background-color: var(--bg-sunken);">
838    <div class="container">
839        <div class="row align-items-center">
840            <div class="col-lg-8">
841                <p class="mb-2 raleway-font" style="font-size: 14px;">
842                    &copy; 2026 Jensen, T., Kelly, B., and Pedersen, L.
843                    Analysis code is available under the <a href="https://opensource.org/licenses/MIT" target="_blank" class="text-dark">MIT License</a>.
844                    Data is licensed under <a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank" class="text-dark">CC BY-NC 4.0</a>.
845                </p>
846            </div>
847            <div class="col-lg-4">
848                <div class="d-flex flex-wrap justify-content-lg-end justify-content-center gap-3">
849                    <a href="https://github.com/bkelly-lab/jkp-data/discussions" target="_blank"
850                        class="text-decoration-none" style="color: var(--text); font-size: 14px;">
851                        <i class="fa-brands fa-github me-1"></i>Discussions
852                    </a>
853                    <a href="https://github.com/bkelly-lab/jkp-data" target="_blank"
854                        class="text-decoration-none" style="color: var(--text); font-size: 14px;">
855                        <i class="fa-brands fa-github me-1"></i>Repository
856                    </a>
857                    <a href="/contact"
858                        class="text-decoration-none" style="color: var(--text); font-size: 14px;">
859                        <i class="fa-solid fa-envelope me-1"></i>Contact
860                    </a>
861                </div>
862                <p class="text-lg-end text-center mt-2 mb-0 raleway-font" style="font-size: 12px; color: var(--text-muted);">
863                    Join our community of researchers
864                </p>
865            </div>
866        </div>
867    </div>
868</footer>
869<!-- End Footer Section -->
870
871
872    <!-- Other JS Libraries -->
873    
873<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
873
874    
874<script src="https://cdn.jsdelivr.net/npm/[email protected]/min/moment.min.js"></script>
874
875    
875<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>
875
876    
876<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/echarts.min.js"></script>
876
877    <!-- Client and App JS compiled by Vite -->
878    <link rel="modulepreload" as="script" href="https://jkpfactors.com/build/assets/client-C4O_3wEV.js" /><link rel="modulepreload" as="script" href="https://jkpfactors.com/build/assets/app-Cf5tBx7E.js" /><link rel="modulepreload" as="script" href="https://jkpfactors.com/build/assets/vendor-BD8Zk9pU.js" /><link rel="modulepreload" as="script" href="https://jkpfactors.com/build/assets/error-handling-CJdC54DE.js" /><link rel="modulepreload" as="script" href="https://jkpfactors.com/build/assets/chart-factory-CtPQJ870.js" />
878<script type="module" src="https://jkpfactors.com/build/assets/client-C4O_3wEV.js"></script>
878<script type="module" src="https://jkpfactors.com/build/assets/app-Cf5tBx7E.js"></script>
878    
879    <!-- Vite compiled assets fallback -->
880        
880<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/select2.min.js"></script>
880
881    
881<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
881
882    
883    <!-- Prism.js for syntax highlighting -->
884    
884<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/components/prism-core.min.js"></script>
884
885    
885<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.29.0/plugins/autoloader/prism-autoloader.min.js"></script>
885
886    
886<script src="https://jkpfactors.com/client/js/prism-unified.js"></script>
886
887
888    <!-- Global Tab Switching Module -->
889    
889<script src="https://jkpfactors.com/client/js/global-tab-switching.js"></script>
889
890
891    
891<script>
892        $(document).ready(function() {
893            function initializeSelect2() {
894                $('.js-example-basic-single').select2({
895                    width: '100%'
896                });
897            }
898
899            initializeSelect2();
900
901            $(window).resize(function() {
902                initializeSelect2();
903            });
904        });
905    </script>
905
906
907    
907<script>
908        document.addEventListener("DOMContentLoaded", function() {
909            if (window.innerWidth < 992) {
910
911                document.querySelectorAll('.navbar .dropdown').forEach(function(everydropdown) {
912                    everydropdown.addEventListener('hidden.bs.dropdown', function() {
913                        this.querySelectorAll('.submenu').forEach(function(everysubmenu) {
914                            everysubmenu.style.display = 'none';
915                        });
916                    })
917                });
918
919                document.querySelectorAll('.dropdown-menu a').forEach(function(element) {
920                    element.addEventListener('click', function(e) {
921                        let nextEl = this.nextElementSibling;
922                        if (nextEl && nextEl.classList.contains('submenu')) {
923                            e.preventDefault();
924                            if (nextEl.style.display == 'block') {
925                                nextEl.style.display = 'none';
926                            } else {
927                                nextEl.style.display = 'block';
928                            }
929
930                        }
931                    });
932                })
933            }
934            // end if innerWidth
935        });
936    </script>
936
937
938    
938<script>
939        $(document).ready(function() {
940            $('.dropdown-submenu a.test').on("click", function(e) {
941                $(this).next('ul').toggle();
942                e.stopPropagation();
943                e.preventDefault();
944            });
945        });
946    </script>
946
947        
947<script>
948        document.addEventListener('DOMContentLoaded', () => {
949            // Copy button functionality
950            document.querySelectorAll('.copyButton').forEach(button => {
951                button.addEventListener('click', function() {
952                    const codeToCopy = this.nextElementSibling.innerText;
953
954                    navigator.clipboard.writeText(codeToCopy).then(() => {
955                        const copiedTooltip = document.createElement('span');
956                        copiedTooltip.textContent = 'Copied!';
957                        copiedTooltip.style.position = 'absolute';
958                        copiedTooltip.style.backgroundColor = 'black';
959                        copiedTooltip.style.color = 'white';
960                        copiedTooltip.style.borderRadius = '4px';
961                        copiedTooltip.style.padding = '5px';
962                        copiedTooltip.style.top = '-10px';
963                        copiedTooltip.style.left = '100%';
964                        copiedTooltip.style.zIndex = '1000';
965                        copiedTooltip.style.fontSize = '0.8rem';
966
967                        button.appendChild(copiedTooltip);
968
969                        setTimeout(() => {
970                            button.removeChild(copiedTooltip);
971                        }, 1000);
972                    }).catch(err => console.error('Failed to copy:', err));
973                });
974            });
975
976            // AJAX News Pagination
977            const paginationNav = document.getElementById('news-pagination');
978            if (!paginationNav) return;
979
980            const newsContainer = document.querySelector('.news-list-container');
981            const apiUrl = paginationNav.dataset.apiUrl;
982
983            // Handle pagination link clicks
984            paginationNav.addEventListener('click', async (e) => {
985                const link = e.target.closest('a[data-page]');
986                if (!link) return;
987
988                e.preventDefault();
989                const page = parseInt(link.dataset.page, 10);
990                await loadNewsPage(page);
991            });
992
993            // Handle browser back/forward
994            window.addEventListener('popstate', async (e) => {
995                if (e.state && e.state.newsPage) {
996                    await loadNewsPage(e.state.newsPage, false);
997                }
998            });
999
1000            async function loadNewsPage(page, updateHistory = true) {
1001                // Add loading state
1002                paginationNav.classList.add('loading');
1003                newsContainer.style.opacity = '0.5';
1004
1005                try {
1006                    const response = await fetch(`${apiUrl}?news_page=${page}`, {
1007                        headers: { 'Accept': 'application/json' }
1008                    });
1009
1010                    if (!response.ok) throw new Error('Failed to load news');
1011
1012                    const data = await response.json();
1013
1014                    // Update news items
1015                    renderNewsItems(data.items);
1016
1017                    // Update pagination controls
1018                    renderPagination(data.currentPage, data.lastPage, data.onFirstPage, data.hasMorePages);
1019
1020                    // Update URL without reload
1021                    if (updateHistory) {
1022                        const newUrl = page === 1
1023                            ? window.location.pathname
1024                            : `${window.location.pathname}?news_page=${page}`;
1025                        history.pushState({ newsPage: page }, '', newUrl);
1026                    }
1027
1028                } catch (error) {
1029                    console.error('Failed to load news:', error);
1030                    // Optionally show error message to user
1031                } finally {
1032                    paginationNav.classList.remove('loading');
1033                    newsContainer.style.opacity = '1';
1034                }
1035            }
1036
1037            function escapeHtml(text) {
1038                const div = document.createElement('div');
1039                div.textContent = text;
1040                return div.innerHTML;
1041            }
1042
1043            function renderNewsItems(items) {
1044                if (items.length === 0) {
1045                    newsContainer.innerHTML = '<p class="news-empty">No news at this time.</p>';
1046                    return;
1047                }
1048
1049                const html = items.map(item => {
1050                    const date = new Date(item.createdAt);
1051                    const monthYear = date.toLocaleDateString('en-US', { month: 'short', year: 'numeric' });
1052                    const isoDate = date.toISOString().split('T')[0];
1053
1054                    return `
1055                        <article class="news-item">
1056                            <div class="news-item-header">
1057                                <time datetime="${isoDate}">${monthYear}</time>
1058                                <a href="${escapeHtml(item.url)}" target="_blank" rel="noopener noreferrer" class="news-item-title">${escapeHtml(item.title)}<span class="visually-hidden"> (opens in new tab)</span></a>
1059                            </div>
1060                            <p class="news-item-excerpt">${escapeHtml(item.excerpt)}</p>
1061                        </article>
1062                    `;
1063                }).join('');
1064
1065                newsContainer.innerHTML = html;
1066            }
1067
1068            function renderPagination(currentPage, lastPage, onFirstPage, hasMorePages) {
1069                // Calculate page range (show up to 5 pages)
1070                let start = Math.max(1, currentPage - 2);
1071                let end = Math.min(lastPage, currentPage + 2);
1072
1073                if (end - start < 4) {
1074                    if (start === 1) {
1075                        end = Math.min(lastPage, start + 4);
1076                    } else {
1077                        start = Math.max(1, end - 4);
1078                    }
1079                }
1080
1081                let pagesHtml = '';
1082
1083                // First page link if not in range
1084                if (start > 1) {
1085                    pagesHtml += `<a href="?news_page=1" class="pagination-btn pagination-page" data-page="1">1</a>`;
1086                    if (start > 2) {
1087                        pagesHtml += `<span class="pagination-ellipsis">...</span>`;
1088                    }
1089                }
1090
1091                // Page numbers
1092                for (let i = start; i <= end; i++) {
1093                    if (i === currentPage) {
1094                        pagesHtml += `<span class="pagination-btn pagination-page active" aria-current="page">${i}</span>`;
1095                    } else {
1096                        pagesHtml += `<a href="?news_page=${i}" class="pagination-btn pagination-page" data-page="${i}">${i}</a>`;
1097                    }
1098                }
1099
1100                // Last page link if not in range
1101                if (end < lastPage) {
1102                    if (end < lastPage - 1) {
1103                        pagesHtml += `<span class="pagination-ellipsis">...</span>`;
1104                    }
1105                    pagesHtml += `<a href="?news_page=${lastPage}" class="pagination-btn pagination-page" data-page="${lastPage}">${lastPage}</a>`;
1106                }
1107
1108                const controlsHtml = `
1109                    <div class="pagination-controls">
1110                        ${currentPage > 1
1111                            ? `<a href="?news_page=1" class="pagination-btn pagination-nav" aria-label="First page" data-page="1"><i class="fa-solid fa-angles-left"></i></a>`
1112                            : `<span class="pagination-btn pagination-nav disabled" aria-disabled="true"><i class="fa-solid fa-angles-left"></i></span>`
1113                        }
1114                        ${!onFirstPage
1115                            ? `<a href="?news_page=${currentPage - 1}" class="pagination-btn pagination-nav" aria-label="Previous page" data-page="${currentPage - 1}"><i class="fa-solid fa-chevron-left"></i></a>`
1116                            : `<span class="pagination-btn pagination-nav disabled" aria-disabled="true"><i class="fa-solid fa-chevron-left"></i></span>`
1117                        }
1118                        <div class="pagination-pages">${pagesHtml}</div>
1119                        ${hasMorePages
1120                            ? `<a href="?news_page=${currentPage + 1}" class="pagination-btn pagination-nav" aria-label="Next page" data-page="${currentPage + 1}"><i class="fa-solid fa-chevron-right"></i></a>`
1121                            : `<span class="pagination-btn pagination-nav disabled" aria-disabled="true"><i class="fa-solid fa-chevron-right"></i></span>`
1122                        }
1123                        ${currentPage < lastPage
1124                            ? `<a href="?news_page=${lastPage}" class="pagination-btn pagination-nav" aria-label="Last page" data-page="${lastPage}"><i class="fa-solid fa-angles-right"></i></a>`
1125                            : `<span class="pagination-btn pagination-nav disabled" aria-disabled="true"><i class="fa-solid fa-angles-right"></i></span>`
1126                        }
1127                    </div>
1128                    <div class="pagination-info">Page ${currentPage} of ${lastPage}</div>
1129                `;
1130
1131                paginationNav.innerHTML = controlsHtml;
1132
1133                // Update data attributes
1134                paginationNav.dataset.currentPage = currentPage;
1135                paginationNav.dataset.lastPage = lastPage;
1136            }
1137        });
1138    </script>
1138
1139
1140    <!-- Global User Notification Modal -->
1141    <div class="modal fade" id="userNotificationModal" tabindex="-1" aria-labelledby="userNotificationModalLabel" aria-hidden="true">
1142        <div class="modal-dialog modal-dialog-centered">
1143            <div class="modal-content">
1144                <div class="modal-header">
1145                    <h5 class="modal-title" id="userNotificationModalLabel">Notice</h5>
1146                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
1147                </div>
1148                <div class="modal-body" id="userNotificationModalBody">
1149                    <!-- Message content will be inserted here -->
1150                </div>
1151                <div class="modal-footer">
1152                    <button type="button" class="btn btn-primary" data-bs-dismiss="modal">OK</button>
1153                </div>
1154            </div>
1155        </div>
1156    </div>
1157
1158</body>
1159
1160</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.