Faits :
A.
A.a. En 1998, la société lausannoise A._ SA s'est intéressée à prendre en location des locaux commerciaux sis à Lausanne, qui appartenaient alors à une compagnie d'assurance. La société précitée envisageait de procéder à d'importantes transformations de ces locaux pour un montant de 1'500'000 à 2'000'000 fr. Les discussions avec la gérance représentant la propriétaire ont porté sur le loyer et la prise en charge par la propriétaire d'une partie des futurs travaux.
Le 16 juin 1998, la gérance a fait la proposition suivante pour le nouveau loyer:
"Loyer de base, soit prix moyen au m2 de Fr. 259.80 Fr. 510'000.-
Diminution pour rentabilisation de Fr. 1'200'000.-
(...) sur 15 ans, renté à 4,5% Fr. 111'600.-
_
Valable du 01.10.98 au 30.09.2013 Fr. 398'400.-
Dès le 01.10.2013, le loyer sera ramené au loyer initial net de Fr. 510'000.-, basé sur un IPC de septembre 1998 indexé à l'IPC de septembre 2013. (...) ".
A.b. Le 22 juillet 1998, A._ SA, en qualité de locataire, a signé avec la propriétaire de l'immeuble un contrat de bail pour locaux commerciaux portant sur une surface de 1'963 m 2et prenant effet le 1 er octobre 1998. Le loyer annuel net était de 375'000 fr. (31'250 fr. par mois); une adaptation entière à l'indice des prix à la consommation (IPC) était prévue. Le bail était résiliable moyennant avis donné douze mois à l'avance pour fin septembre, mais au plus tôt pour le 30 septembre 2013; à défaut, le bail était reconduit tacitement de cinq ans en cinq ans.
Un document intitulé "Clauses particulières" a été signé le même jour et joint au contrat de bail. Il prévoyait notamment:
"Dès le 01.10.2013, le loyer sera ramené au loyer initial net de Fr. 510'000.-, basé sur un IPC du 30 septembre 2007 indexé à l'IPC du 30 septembre 2013. Le loyer annuel ne pourra toutefois pas être inférieur au montant initial de Fr. 510'000.-."
Le 15 octobre 1999, la société zurichoise B._ AG est devenue propriétaire de l'immeuble, et partant bailleresse. A neuf reprises, elle a augmenté le loyer en fonction de l'IPC pour finalement le porter à 427'416 fr. dès le 1 er janvier 2009. La locataire a contesté cette dernière hausse par voie judiciaire avant de communiquer au Tribunal des baux du canton de Vaud qu'elle l'acceptait; par prononcé du 14 juillet 2009, le Tribunal en a pris acte en tant que déclaration de passé-expédient.
A.c. Par formule officielle du 16 novembre 2010, la bailleresse a résilié le contrat de bail pour le 30 septembre 2013. La locataire a contesté le congé devant la Commission de conciliation, qui a prononcé son annulation le 31 janvier 2012. La bailleresse a alors déposé une demande en validation du congé devant le Tribunal des baux. La procédure est encore pendante.
A.d. Par lettre du 19 janvier 2012 adressée à la bailleresse, la locataire a requis une diminution de loyer dès le 1 er octobre 2013. Relevant que le taux hypothécaire était de 4,25% lors de la conclusion du contrat et de 2,5% depuis décembre 2011, elle estimait que cet écart de 1,75% justifiait une baisse de loyer de 20,37%. Elle alléguait en outre que le loyer actuel procurait un rendement excessif à la bailleresse. Elle demandait que le loyer initial de 375'000 fr. soit réduit de 20,37% (- 76'387 fr. 50), et donc ramené à 298'612 fr. 50 dès le 1 er octobre 2013.
Le 7 mars 2012, la locataire a saisi la Commission de conciliation d'une requête en réduction de loyer fondée sur la baisse du taux hypothécaire de référence et sur un rendement excessif procuré à la bailleresse. La conciliation a échoué.
B.
B.a. La locataire a porté l'action devant le Tribunal des baux, concluant à la réduction du loyer annuel à 287'000 fr. dès le 1 er octobre 2013. A l'appui de sa demande, elle invoquait le rendement excessif et la baisse du taux hypothécaire de référence de 4,25% à 2,25%. La bailleresse a conclu au rejet. Lors de l'audience du 15 novembre 2013, la locataire a modifié sa conclusion dans le sens que le loyer annuel net devait être réduit à 276'787 fr.; elle a précisé que la demande était fondée sur la méthode dite relative et, uniquement à titre superfétatoire, sur la méthode absolue du rendement net. La bailleresse a confirmé sa conclusion en rejet de la demande.
Par jugement du 2 décembre 2013, le Tribunal des baux a fixé le loyer annuel net dû dès le 1 er octobre 2013 à 375'000 fr., soit le montant initial convenu. Le tribunal a fait le raisonnement suivant: la clause d'indexation prévue dans le contrat de bail était valable à partir du 1 er octobre 2013 seulement, de sorte que les hausses intervenues jusqu'alors étaient nulles. La bailleresse ne pouvait opposer à la locataire la clause selon laquelle le loyer serait au minimum de 510'000 fr. à compter du 1 er octobre 2013; en effet, la locataire avait le droit impératif de demander une baisse de loyer lorsque les conditions légales étaient remplies. Pour le calcul du loyer, il n'était pas possible d'invoquer simultanément les méthodes relative et absolue; seule la méthode relative, invoquée à titre principal par la locataire, était donc déterminante. A défaut d'indications sur les paramètres nécessaires, il fallait toutefois retenir que les parties voulaient régler la question du loyer jusqu'à la date d'expiration du bail et ne pouvaient donc pas invoquer la méthode relative pour fixer le loyer admissible à cette date. La conclusion en baisse de loyer devait donc être rejetée. Quant à la bailleresse, elle n'avait pas notifié une hausse de loyer à 510'000 fr. au moyen de la formule officielle, si bien que cette modification n'était pas entrée en vigueur.
B.b. La locataire et la bailleresse ont fait appel, concluant à ce que le loyer soit fixé à 293'137 fr. 50, respectivement à 427'416 fr. Par arrêt du 5 novembre 2014, la Cour d'appel civile du Tribunal cantonal vaudois a rejeté l'appel de la locataire et intégralement admis celui de la bailleresse, fixant le loyer annuel net à 427'416 fr. à partir du 1 er octobre 2013.
La Cour d'appel a jugé que les parties avaient conclu un bail avec une clause d'échelonnement prévoyant un premier échelon de quinze ans avec un loyer de 375'000 fr., puis un second échelon de cinq ans avec un loyer de 510'000 fr. Elle en a conclu qu'une baisse de loyer était exclue durant cette période de vingt ans. L'indexation du loyer durant cet intervalle était également impossible, eu égard à l'interdiction de cumuler une clause d'échelonnement avec une clause d'indexation. La bailleresse aurait dû notifier une hausse de loyer correspondant au nouvel échelon de loyer pour le 1 er octobre 2013, ce qu'elle avait omis de faire, probablement parce qu'elle avait résilié le bail. Le loyer n'avait donc pas pu passer à 510'000 fr. La locataire ayant toutefois passé expédient en 2009 pour le loyer de 427'416 fr., il y avait lieu d'admettre une adaptation consensuelle du loyer. La Cour d'appel en a conclu que le loyer devait rester fixé à ce dernier montant.
C.
La locataire (recourante) a interjeté un recours en matière civile auprès du Tribunal fédéral. Elle conclut à ce que le loyer annuel net dû dès le 1 er octobre 2013 soit fixé à 293'137 fr. 50. La bailleresse (intimée) conclut au rejet du recours. Recourante et intimée ont déposé une seconde écriture. L'autorité précédente s'est référée à son arrêt.
Considérant en droit :
1.
La recourante conteste avoir conclu un contrat à loyers échelonnés. Elle objecte qu'il n'y a pas d'échelonnement du loyer pendant la durée initiale du contrat et que la clause prévoyant un loyer plus élevé à l'échéance de ce délai est tout au plus une réserve de hausse.
1.1. Le bail a été conclu pour une durée minimale de quinze ans; durant cette période, le loyer de 510'000 fr. était réduit à 375'000 fr. pour tenir compte des investissements faits par la recourante. A la fin des quinze ans, le bail se prolongeait automatiquement s'il n'était pas résilié par l'une des parties. Dans cette hypothèse, la réduction de loyer accordée tombait et le loyer passait au montant de 510'000 fr.
1.2. La cour de céans a déjà eu à connaître d'une cause similaire. Les parties avaient conclu un contrat de bail résiliable pour la première fois après cinq ans; pendant cette durée initiale, le locataire bénéficiait d'une réduction d'un tiers sur le loyer convenu. Le contrat lui accordait un droit d'option pour une prolongation de cinq ans supplémentaires; si le locataire exerçait ce droit, il devait payer non plus le loyer réduit, mais le loyer entier convenu. Dans les faits, le locataire n'avait pas exercé son droit d'option à l'échéance du délai initial, mais les parties n'avaient pas résilié le contrat, qui avait donc été tacitement reconduit. La cour de céans a qualifié un tel contrat de bail à loyers échelonnés (ATF 124 III 57 consid. 3b).
La recourante objecte que cette jurisprudence ne s'applique pas en l'espèce, car le contrat auquel elle se rapporte accordait au locataire le droit de demander unilatéralement la prolongation. Le bailleur ne pouvait pas, à l'échéance de la durée minimale, mettre un terme au contrat contre l'avis du locataire.
Dans l'arrêt cité, la cour de céans ne s'est pas fondée sur la clause d'option pour justifier la qualification du contrat; elle n'y fait aucune référence. Rien n'indique qu'elle lui ait accordé de l'importance; l'on ne peut inférer qu'elle aurait qualifié le contrat différemment en l'absence d'une telle clause, que le locataire n'avait d'ailleurs pas utilisée.
Les deux contrats - celui examiné dans l'arrêt cité et celui faisant l'objet de la présente procédure - sont des contrats de durée indéterminée ("congéables") contenant des clauses de majoration de loyer similaires, effectives à l'échéance de la durée initiale du contrat. Dans les deux cas, le locataire a le choix de mettre fin au bail, ou de le maintenir avec le loyer majoré. La différence entre les deux contrats consiste en ce que l'un permet au locataire d'imposer à l'autre partie la continuation du bail à l'échéance de la durée initiale, respectivement empêche le bailleur de résilier le contrat contre l'avis du locataire. L'existence ou l'absence d'une telle clause d'option ne change toutefois pas la nature du contrat, qui reste dans les deux hypothèses un contrat de bail de durée indéterminée avec une durée minimale identique pour les deux parties. Il est admis que la reconduction tacite du contrat de bail marque la continuité dans la relation contractuelle plutôt qu'une césure (ATF 137 III 580 consid. 2 p. 584). Le bail de durée indéterminée subsiste au-delà de la durée initiale s'il n'est pas résilié. Les motifs qui conduisent les parties à ne pas résilier importent peu à cet égard.
La validité d'une clause d'échelonnement dépend de l'existence d'une clause d'option en faveur du locataire uniquement lorsque la durée initiale du bail est inférieure à trois ans (cf. art. 269c let. a CO; COMMENTAIRE SVIT, Le droit suisse du bail à loyer, 2011, n° 3 ad art. 269b et n° 4 ad art. 269c CO; DAVID LACHAT, Le bail à loyer, 2008, ch. 20.3.2.1, nbp. 62). Si la durée initiale est de trois ans ou plus, la loi admet le contrat à loyers échelonnés, sans exiger d'autres conditions ou garanties en faveur du locataire quant à la reconduction du bail au-delà de la durée initiale. Dès lors que le contrat de durée indéterminée subsiste, à défaut de résiliation, au-delà de l'échéance du délai initial, une clause de majoration prenant effet à cette date est valide.
Il faut ainsi retenir qu'un contrat de bail conclu pour une durée d'au moins trois ans, prévoyant une seule majoration de loyer d'un montant déterminé intervenant au moment où le bail est tacitement prolongé, constitue un contrat de bail à loyers échelonnés au sens de l'art. 269c CO ( PETER HIGI, Commentaire zurichois, 4 e éd. 1998, n os 58 et 73 art. 269c CO).
1.3. La recourante avance un second motif de ne pas accorder à l'arrêt précité (ATF 124 III 57) une importance déterminante pour le cas d'espèce: dans cette affaire-là, le locataire aurait bénéficié d'un loyer de faveur pendant la durée initiale du contrat, alors que dans le cas présent, le loyer réduit valable durant la durée initiale aurait été négocié pour tenir compte des investissements auxquels la recourante allait procéder. Or, la validité d'une clause de majoration ne saurait dépendre du fait que le loyer initial était particulièrement favorable pour le locataire. Dans l'un et l'autre cas, le loyer initial et la majoration à l'échéance de la durée initiale ont été négociés et stipulés par les parties; que l'une ou l'autre partie ait été plus adroite à cette occasion est sans pertinence pour la validité du contrat conclu.
2.
Sous réserve de la contestation du loyer initial, le locataire lié par un contrat de bail à loyers échelonnés ne peut pas contester le loyer pendant le bail (art. 270d CO). Il peut, dans les trente jours dès la réception de l'objet loué, contester le principe même de l'échelonnement, le loyer initial ou les échelons subséquents. Ultérieurement, il ne peut plus remettre en cause les échelons subséquents, peu importe l'évolution des facteurs de fixation du loyer (ATF 124 III 57 consid. 3a; 121 III 397 consid. 2b/aa p. 401; LACHAT, op. cit., ch. 20.3.2.4). Ce n'est qu'à l'échéance du contrat échelonné qu'il pourra demander la modification du loyer ( LACHAT, op. cit., ch. 20.3.2.6).
En l'espèce, la validité de la résiliation du contrat à l'échéance du délai initial, à savoir au 30 septembre 2013, est litigieuse; elle fait actuellement l'objet d'une procédure judiciaire en annulation du congé, initiée par la recourante. En l'état, l'on ignore si le contrat de bail est venu à échéance le 30 septembre 2013. Dans la présente procédure, la recourante demande une réduction du loyer dû à partir du 1 er octobre 2013 en exécution du contrat tacitement reconduit. C'est donc cette hypothèse qu'il faut retenir pour statuer sur la présente demande. Comme la Cour d'appel l'a jugé, il faut alors admettre que la recourante n'est pas habilitée à contester le loyer dû en vertu du contrat avant le prochain terme de résiliation au 30 septembre 2018.
3.
La Cour d'appel a jugé que le loyer annuel dû à partir du 1 er octobre 2013 était, comme précédemment, de 427'416 fr.
3.1. La Cour d'appel a d'abord retenu que le loyer n'avait pas passé à 510'000 fr. comme stipulé, faute de notification de cette hausse au moyen de la formule officielle.
Sous le régime de l'AMSL (Arrêté fédéral instituant des mesures contre les abus dans le secteur locatif, du 30 juin 1972), la cour de céans, en se référant à l'art. 13 al. 1 et 2 de l'ordonnance topique (OSL), a jugé que chaque majoration de loyer, même celle résultant d'un contrat à loyers échelonnés, devait faire l'objet d'un avis officiel de hausse. Elle l'a motivé par le fait que le loyer échelonné n'emportait pas la présomption qu'il n'était pas abusif; il appartenait au bailleur d'établir que le nouveau loyer était indispensable à un rendement normal de l'immeuble, à défaut de quoi le loyer initial devait être tenu pour convenable (ATF 113 II 299 consid. 2e, 116 II 587 consid. 3a). Cette jurisprudence est due au fait qu'à l'époque, le régime légal permettait de contester le loyer à chaque nouvelle adaptation prévue par le contrat à loyers échelonnés. Il en va différemment aujourd'hui: l'art. 270d CO a modifié la situation juridique dans le sens qu'une telle contestation n'est plus possible ( LACHAT, op. cit., ch. 20.3.2.4., nbp. 71). L'art. 19 al. 1 et 2 OBLF (RS 221.213.11) a néanmoins gardé la même teneur que l'ancien art. 13 al. 1 et 2 OSL: l'alinéa 2 de l'art. 19 OBLF prévoit toujours que l'alinéa 1, qui impose l'utilisation de la formule officielle pour communiquer une hausse de loyer au locataire, s'applique par analogie lorsque le bailleur augmente le loyer selon un indice ou un échelonnement convenus. La majoration de loyer qui n'est pas notifiée par formule officielle est nulle (art. 269d al. 2 let. a CO).
La formule officielle doit fournir au locataire les éléments lui permettant d'apprécier en pleine connaissance de cause l'opportunité ou non de contester l'augmentation du loyer (ATF 137 III 362 consid. 3.2.1 p. 365). Dès le moment où une contestation de la hausse est légalement exclue, l'exigence d'une notification de cette hausse par formule officielle, sous menace de nullité, n'a guère de sens. Divers auteurs contestent dès lors le bien-fondé de cette exigence ( COMMENTAIRE SVIT, op. cit., n° 14 ad art. 269c CO; PATRICIA DIETSCHY, in Commentaire pratique, Droit du bail à loyer, 2010, n° 26 ad art. 269c CO; LACHAT, op. cit., ch. 20.3.2.4., nbp. 73; HIGI, op. cit., n° 40 ad art. 269c CO); d'aucuns contestent même la nécessité de toute déclaration de hausse dès lors que montant et terme de la hausse sont définis dans le contrat ( ROGER WEBER, in Commentaire bâlois, 5 e éd. 2011, n° 3 ad art. 269c CO). Il n'y a pas à examiner cette question plus avant dès lors que les parties ne contestent pas ce point de l'arrêt attaqué.
Le Tribunal fédéral applique certes le droit d'office (art. 106 al. 1 LTF). Toutefois, compte tenu de l'obligation de motiver qui incombe au recourant (art. 42 al. 2 LTF), il n'examine pas, comme le ferait un juge de première instance, toutes les questions juridiques qui pourraient se poser, mais se limite en principe à celles qui sont soulevées devant lui. Pour satisfaire à l'exigence de motivation, le recourant doit discuter les motifs de la décision entreprise et indiquer précisément en quoi il estime que l'autorité précédente a méconnu le droit (ATF 140 III 86 consid. 2, 133 III 545 consid. 2.2).
3.2. La Cour d'appel a ensuite jugé que l'indexation stipulée dans le contrat ne s'appliquait pas avant le 1 er octobre 2018.
L'indexation et l'échelonnement du loyer ne peuvent pas être cumulés (ATF 124 III 57 consid. 3a). Si le contrat prévoit néanmoins cette solution, il faut se demander ce que les parties auraient convenu si elles avaient eu conscience du caractère inadmissible d'un tel cumul (ATF 124 III 57 consid. 3c). La recherche de la volonté hypothétique des parties est une question de droit (ATF 120 II 35 consid. 4b, 107 II 216 consid. 3b; cf. aussi ATF 136 III 334 consid. 2.4 p. 338). En l'occurrence, la Cour d'appel a jugé que les parties auraient fait prévaloir la clause d'échelonnement.
La recourante plaide que les parties ont privilégié l'indexation pendant la durée du bail. Il n'est pas évident qu'elle entende ainsi contester la volonté hypothétique établie par les juges vaudois. Quoi qu'il en soit, l'autorité précédente a précisé qu'en appel, il n'était pas contesté que les parties auraient fait prévaloir la clause d'échelonnement si elles avaient eu connaissance du vice affectant le contrat; la recourante n'objecte pas que la question de la volonté hypothétique aurait fait l'objet d'un grief en appel. Compte tenu de l'exigence de l'épuisement des voies de droit, il n'y a pas à revenir sur un point non discuté en appel.
Il faut ainsi s'en tenir à la prévalence de la clause d'échelonnement; la clause d'indexation ne peut s'appliquer qu'à l'échéance de la période d'échelonnement, soit le 30 septembre 2018 dans l'hypothèse ici retenue où le contrat a été tacitement reconduit à l'issue du délai initial. A noter qu'une augmentation de loyer résultant de l'indexation doit faire l'objet, comme l'échelonnement, d'une notification par formule officielle.
3.3. La Cour d'appel a finalement jugé que la recourante, par passé-expédient, avait consenti au loyer exigé à partir du 1 er janvier 2009, qu'il y avait lieu de retenir une adaptation consensuelle du loyer et que la recourante ne pouvait donc plus contester le loyer de 427'416 fr. accepté dans ce cadre. La recourante ne soulève aucune critique à ce sujet. Elle n'en souffle mot dans l'acte de recours, voire dit dans ses observations ne pas contester ce montant pour la période du 1 er janvier 2009 au 30 septembre 2013.
4.
Il s'ensuit le rejet du recours. La recourante supporte les frais et dépens de la présente procédure (art. 66 et 68 LTF).
Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 7'000 fr., sont mis à la charge de la recourante.
3.
La recourante versera à l'intimée une indemnité de 8'000 fr. à titre de dépens.
4.
Le présent arrêt est communiqué aux mandataires des parties et à la Cour d'appel civile du Tribunal cantonal du canton de Vaud.
Lausanne, le 7 mai 2015
Au nom de la Ire Cour de droit civil
du Tribunal fédéral suisse
La Présidente : Kiss
La Greffière : Monti