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 author = {Jensen, Theis Ingerslev and Kelly, Bryan 634 and 635 Pedersen, Lasse Heje}, <br> 636 title = {Is There a Replication Crisis in Finance?}, 637 <br> 638 journal = {The Journal of Finance}, <br> 639 volume = {78}, <br> 640 number = {5}, <br> 641 pages = {2465-2518}, <br> 642 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'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 © 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.