Faits :
A.
A.a. Par contrat du 27 octobre 2004, B._ (ci-après: la cliente), née en septembre 1923, a conféré à la société A._ SA (ci-après: la gérante) le mandat de gérer ses actifs déposés auprès de la banque C._ SA (ci-après: la Banque) à Neuchâtel. L'art. 5 du contrat prévoyait que «le Mandataire exercera le mandat de gestion conformément à la politique de placement expressément convenu (sic) avec le Mandant et consigné (sic) dans le document A1». L'art. 9 avait la teneur suivante: «Le Mandataire ne peut être tenu responsable des actions ou des omissions fondées sur la bonne foi, c'est-à-dire qu'il répond uniquement des cas de négligence grave. (...) ». Le document A1, daté du même jour, qualifiait le «profil du client» de «dynamique», par opposition à «conservateur» ou «pondéré». Le placement avait pour objectif la croissance réelle du capital, la cliente étant prête à prendre des risques, selon une attitude plutôt agressive. La monnaie de référence des placements était le franc suisse et des investissements spéculatifs étaient autorisés. Une deuxième annexe A2 précisait que «Le présent acte autorise la société à effectuer pour le compte du client des placements à caractère spéculatif (options, situations spéciales, obligations à haut rendement, instruments dérivés de toutes sortes) », cela à hauteur de 80 % du montant des avoirs. Figurait encore la clause selon laquelle «Les risques inhérents à ces types d'investissement sont entièrement connus et acceptés par le client. Sa disposition à assumer des pertes est totale».
A.b. Au 31 décembre 2004, les avoirs de la cliente auprès de la Banque s'élevaient à environ 180'000 fr. La cliente était en outre titulaire d'un dépôt auprès d'une banque privée, pour une valeur de quelque 195'000 fr. A fin février 2007, le dossier titres détenu auprès de cet établissement a été transféré à la Banque, qui est devenue seule dépositaire dès ce moment-là. Au 25 juin 2009, la valeur du portefeuille de la demanderesse auprès de la Banque est tombée à 8'700 fr. La cliente dit avoir découvert la disparition quasi-totale de sa fortune au printemps 2009, au moment de remplir sa déclaration d'impôts avec l'aide de proches; elle a alors chargé un mandataire d'obtenir des explications circonstanciées de la gérante. Il s'en est suivi un échange de correspondances, à l'occasion duquel la gérante a fourni quelques documents bancaires, sans guère donner d'explications sur les raisons de la perte constatée.
B.
B.a. Par demande déposée le 27 octobre 2009 devant le Tribunal cantonal neuchâtelois, la cliente (ci-après: la demanderesse) a actionné la gérante (ci-après: la défenderesse) en paiement de 147'675 fr. plus intérêts, somme correspondant au dommage qu'elle considérait avoir subi du fait de la mauvaise gestion de son portefeuille par la défenderesse. En substance, la demanderesse alléguait qu'au 31 décembre 2007, son capital était encore de 243'500 fr., montant dont il fallait déduire 35'000 fr. qu'elle avait prélevés au cours de l'année 2008. De ces 208'500 fr., il ne subsistait plus que 8'700 fr. en juin 2009, la perte effective étant de 199'800 fr. (208'500 - 8'700). La perte admissible eu égard à la chute générale des marchés aurait été de - 25 %, soit 52'125 fr. La demanderesse chiffrait ainsi son dommage à 147'675 fr. (199'800 - 52'125).
B.b. Par réponse du 25 janvier 2010, la défenderesse a conclu au rejet intégral de la demande.
B.c. Ensuite de l'entrée en vigueur du CPC et de la nouvelle organisation judiciaire neuchâteloise, la cause a été transférée au Tribunal civil du Littoral et du Val-de-Travers (ci-après: le Tribunal civil).
Une expertise judiciaire a été mise en oeuvre. L'expert, qui exploite un bureau fiduciaire, a déposé un rapport principal le 11 juin 2013 et un complément le 24 décembre 2013.
B.d. Par jugement du 9 juin 2015, le Tribunal civil a condamné la défenderesse à verser à la demanderesse la somme de 96'988 fr. plus intérêts. Son raisonnement est succinctement résumé ci-dessous.
Le contrat de gestion conclu par les parties est soumis aux règles du mandat, en particulier quant à la responsabilité de la défenderesse en tant que gérante de fortune indépendante. Celle-ci a violé son devoir d'information tant à la conclusion du contrat qu'au cours de son exécution; elle s'est écartée sans droit des instructions contenues dans le contrat et a plus généralement violé les règles élémentaires de la profession en matière de sauvegarde des intérêts du mandant. Il s'agit là d'une faute grave, rendant inopérante la clause d'exclusion de responsabilité figurant à l'article 9 du contrat. La preuve du dommage étant très difficile à apporter, il faut recourir à l'<ref-law> et procéder en équité, par comparaison avec le résultat d'une gestion qui aurait été conforme au contrat, en tenant compte de l'évolution des marchés financiers. Il ressort de l'expertise que la perte subie par le portefeuille de la demanderesse est supérieure de 80'189 fr. par rapport à l'indice UBS Actions dont la monnaie de référence est le franc suisse, respectivement supérieure de 96'988 fr. par rapport à l'indice Euro Stoxx 50 exprimé en euro. En définitive, le tribunal s'est fondé sur ce dernier indice, considéré comme le plus proche du type de gestion pratiquée par la défenderesse, du point de vue de l'expert et de l'aveu même de la défenderesse.
B.e. Par arrêt du 7 décembre 2015, la Cour d'appel civile du Tribunal cantonal neuchâtelois a rejeté l'appel interjeté par la défenderesse contre le jugement du 9 juin 2015.
C.
La défenderesse a interjeté un recours en matière civile au Tribunal fédéral, concluant à ce que la demande du 27 octobre 2009 soit entièrement rejetée.
La demanderesse a sollicité l'octroi de l'assistance judiciaire et déposé dans le même temps une réponse concluant au rejet du recours.
L'autorité précédente s'est référée à son arrêt.

Considérant en droit :
1.
1.1. La défenderesse, qui a succombé dans ses conclusions libératoires (<ref-law>), a agi en temps utile (<ref-law>) contre un arrêt final (<ref-law>) rendu sur appel par le tribunal supérieur du canton (<ref-law>) dans une contestation civile dont la valeur litigieuse est supérieure à 30'000 fr. (art. 72 al. 1 et 74 al. 1 let. b LTF). Son recours en matière civile est recevable sur le principe.
1.2. Le Tribunal fédéral statue sur la base des faits établis par l'autorité précédente (<ref-law>). Il ne peut rectifier ou compléter les constatations de l'autorité précédente que si elles sont manifestement inexactes ou découlent d'une violation du droit au sens de l'<ref-law> (<ref-law>). "Manifestement inexactes" signifie ici "arbitraires" (<ref-ruling> consid. 2 p. 117; <ref-ruling> consid. 1.5). Encore faut-il que la correction du vice soit susceptible d'influer sur le sort de la cause (<ref-law>).
La critique de l'état de fait retenu est soumise au principe strict de l'invocation énoncé par l'<ref-law> (<ref-ruling> consid. 2.3 p. 266 et les références). La partie qui entend attaquer les faits constatés par l'autorité précédente doit expliquer clairement et de manière circonstanciée en quoi ces conditions seraient réalisées (<ref-ruling> consid. 1.3.1 p. 18 et les références). Si elle souhaite obtenir un complètement de l'état de fait, elle doit aussi démontrer, par des renvois précis aux pièces du dossier, qu'elle a présenté aux autorités précédentes, en conformité avec les règles de la procédure, les faits juridiquement pertinents à cet égard et les moyens de preuve adéquats (<ref-ruling> consid. 2 p. 90). Si la critique ne satisfait pas à ces exigences, les allégations relatives à un état de fait qui s'écarterait de celui de la décision attaquée ne pourront pas être prises en considération (<ref-ruling> consid. 1.3.1 p. 18).
1.3. Le Tribunal fédéral applique d'office le droit (<ref-law>) à l'état de fait constaté dans l'arrêt cantonal. Cela n'implique pas qu'il examine toutes les questions juridiques qui pourraient se poser, à l'instar d'un juge de première instance. Eu égard à l'obligation de motiver imposée par l'<ref-law>, l'autorité de céans ne traite que les questions qui sont soulevées devant elle par les parties, à moins que la violation du droit ne soit manifeste (<ref-ruling> consid. 2 p. 116; <ref-ruling> consid. 2).
2.
2.1. Les parties ne contestent pas avoir conclu un mandat de gestion de fortune.
Dans le mandat de gestion de fortune (appelé aussi contrat de gestion de fortune), le gérant s'oblige à gérer, dans les termes du contrat, tout ou partie de la fortune du mandant, en déterminant lui-même les opérations boursières à effectuer, dans les limites fixées par le client (arrêts 4A_336/2014 du 18 décembre 2014 consid. 4.1; 4A_90/2011 du 22 juin 2011 consid. 2.2.1; 4A_168/2008 du 11 juin 2008 consid. 2.1, in SJ 2009 I 13). Le mandat de gestion est un mandat au sens des <ref-law>, au moins en ce qui concerne les devoirs et la responsabilité du gérant (<ref-ruling> consid. 4.1 p. 464; <ref-ruling> consid. 2b p. 161).
2.2. La responsabilité du gérant étant soumise aux règles du mandat, le gérant est responsable envers le client de la bonne et fidèle exécution du contrat (<ref-law>; ATF <ref-ruling> consid. 2b p. 161). Le gérant a un devoir de diligence et répond du dommage qu'il cause au client en violant ce devoir intentionnellement ou par négligence (<ref-law> applicable par renvoi de l'<ref-law>; ATF <ref-ruling> consid. 3 p. 161; arrêt précité 4A_90/2011 consid. 2.2.2). Le gérant doit exécuter avec soin la mission qui lui est confiée et sauvegarder fidèlement les intérêts légitimes de son mandant, son premier devoir étant d'agir au profit du mandant et de s'abstenir de tout acte susceptible de lui porter préjudice (arrêt 4A_351/2007 du 15 janvier 2008 consid. 2.2; arrêt 4C.387/2000 du 15 mars 2001 consid. 2a, in SJ 2001 I 525; <ref-ruling> consid. 2a p. 198). Le devoir de diligence doit être déterminé de manière objective (arrêt précité 4A_90/2011 consid. 2.2.2; arrêt 4C.158/2006 du 10 novembre 2006 consid. 3.1; arrêt 4C.126/2004 du 15 septembre 2004 consid. 2.2). S'il doit déployer la diligence due, le gérant ne garantit aucun résultat (arrêt précité 4C.158/2006 consid. 3.1; arrêt 4C.18/2004 du 3 décembre 2004 consid. 1.1, in Praxis 2005 n° 73 p. 566).
2.3. Selon la jurisprudence du Tribunal fédéral, les personnes qui s'occupent à titre professionnel de gestion de patrimoine, à l'instar du gestionnaire de fortune, ont un devoir particulier d'information envers leurs clients, qui découle de l'obligation de diligence et de fidélité imposée au mandataire par l'<ref-law>. Le client doit être renseigné sur les risques des investissements qu'il envisage, conseillé au besoin de manière appropriée quant aux différentes possibilités de placement et prévenu contre la prise de décisions inconsidérées, cela en fonction du niveau propre de ses connaissances et de la nature des placements entrant en considération. Le mandataire doit donc s'informer, en questionnant son client, sur le niveau de connaissances de celui-ci et sur sa tolérance au risque. Les obligations du mandataire sont d'autant plus strictes qu'il s'agit d'affaires à option ou d'opérations à terme, lesquelles sont, selon l'expérience, hautement spéculatives et en conséquence risquées (ATF <ref-ruling> consid. 3a et les références citées; arrêts 4A_364/2013 du 5 mars 2014 consid. 6.3; 4A_380/2010 du 16 novembre 2010 consid. 2.1).
2.4. En matière contractuelle, les conditions d'une action en responsabilité sont énoncées à l'<ref-law>. Si le client ne peut obtenir l'exécution de l'obligation ou ne peut l'obtenir qu'imparfaitement, le gérant est tenu de réparer le dommage en résultant, à moins qu'il ne prouve qu'aucune faute ne lui est imputable (arrêt précité 4A_90/2011 consid. 2.2.2).
2.4.1. La notion juridique du dommage est commune aux responsabilités contractuelle et délictuelle (<ref-law>; <ref-ruling> consid. 4a p. 291) : consistant dans la diminution involontaire de la fortune nette, le dommage correspond à la différence entre le montant actuel du patrimoine du lésé et le montant que ce même patrimoine aurait si l'événement dommageable - ou la violation du contrat - ne s'était pas produit. Il peut survenir sous la forme d'une diminution de l'actif, d'une augmentation du passif, d'une non-augmentation de l'actif ou d'une non-diminution du passif (<ref-ruling> consid. 4.4.2 p. 471).
2.4.2. Selon l'<ref-law>, la preuve d'un dommage incombe à celui qui en demande réparation (al. 1). Lorsque le montant exact du dommage ne peut pas être établi, le juge le détermine équitablement, en considération du cours ordinaire des choses et des mesures prises par la partie lésée (al. 2). Cette dernière disposition tend à instaurer une preuve facilitée en faveur du lésé; néanmoins, elle ne le libère pas de la charge de fournir au juge, dans la mesure où cela est possible et où on peut l'attendre de lui, tous les éléments de fait qui constituent des indices de l'existence du dommage et qui permettent ou facilitent son estimation; elle n'accorde pas au lésé la faculté de formuler sans indications plus précises des prétentions en dommages-intérêts de n'importe quelle ampleur. Au demeurant, l'estimation du dommage relève de la constatation des faits et elle échappe, sous réserve de la protection contre l'arbitraire, au contrôle du Tribunal fédéral (<ref-ruling> consid. 5.1 p. 363/364; voir aussi <ref-ruling> consid. 4.4.2 p. 471).
Si, dans le procès, le lésé ne satisfait pas entièrement à son devoir de fournir des éléments utiles à l'estimation, l'une des conditions dont dépend l'application de l'<ref-law> n'est pas réalisée, alors même que, le cas échéant, l'existence d'un dommage est certaine. Le lésé est alors déchu du bénéfice de cette disposition. La preuve du dommage n'étant pas apportée, le juge doit refuser la réparation (arrêt 4A_154/2009 du 8 septembre 2009 consid. 6).
2.4.3. Dans plusieurs contestations concernant la responsabilité du gérant de fortune, le Tribunal fédéral a admis que le dommage pouvait être déterminé par comparaison entre le résultat du portefeuille effectivement en cause et celui d'un portefeuille hypothétique constitué et géré conformément au contrat pendant la même période (arrêts précités 4A_351/2007 consid. 3.2.2; 4C.295/2006 consid. 5.2.2; 4C.18/2004 consid. 2). Cette méthode permet de prendre en considération, à l'avantage du gérant fautif, la perte que le mandant aurait probablement aussi subie avec un gérant consciencieux, par l'effet d'une baisse généralisée des cours dans la période en cause (arrêt précité 4C.158/2006 consid. 4); cela se justifie car une perte de ce genre ne se trouve pas en lien de causalité avec l'exécution défectueuse du contrat (arrêt 4A_481/2012 du 14 décembre 2012 consid. 3, in SJ 2013 I 487).
3.
3.1. L'analyse portée par les juges cantonaux sur le comportement de la gérante est succinctement présentée ci-dessous.
La défenderesse a violé de manière flagrante ses devoirs d'information tant lors de la conclusion du contrat que durant son exécution, ainsi que son devoir d'investigation envers la demanderesse, qui était âgée de 81 ans lors de la conclusion du contrat, était inexpérimentée en matière d'investissements financiers et n'avait d'autres ressources que son portefeuille de titres et sa rente AVS.
La défenderesse a non seulement omis d'informer la demanderesse de façon conforme à ses obligations, mais elle a de surcroît enfreint les instructions reçues. Pendant toute la durée du contrat, la limite de 80 % posée pour les placements spéculatifs a été dépassée, et les avoirs ont presque exclusivement été placés en euros alors que la monnaie de référence convenue était le franc suisse.
Enfin, les placements décidés par la défenderesse ont violé tous les principes applicables en matière de diversification. Selon l'expertise, le portefeuille de la demanderesse n'était constitué que de trois à cinq positions, pour des avoirs de l'ordre de 375'000 fr. en début de mandat (valeur de l'ensemble du dossier au 31 décembre 2014). Bien plus, les placements liés au produit P._ ont représenté entre 35,5 % et 100 % des placements spéculatifs selon les années (placements spéculatifs qui ont eux-mêmes toujours dépassé la proportion convenue de 80 % des avoirs sous gestion); à certaines périodes se sont même ajoutées des actions P._ qui ont encore augmenté l'exposition au risque sur cette société. Aucun gestionnaire diligent n'aurait exposé son client - à tout le moins sans l'avoir dûment informé et averti, ce qui n'a pas été le cas en l'espèce - à un tel risque, de surcroît concentré sur des warrants. Ces produits dits structurés présentent un risque accru, voire très élevé; à la différence des actions, où une chute du cours peut être suivie d'une reprise avec la perspective d'un gain futur, la perte subie sur un warrant est définitive.
3.2. Concernant le dommage subi par la demanderesse, le Tribunal civil, et dans la foulée le Tribunal cantonal, s'appuyant sur l'expertise, ont jugé que la preuve du dommage avait été apportée à satisfaction et que, conformément à la jurisprudence précitée (consid. 2.4.3 supra), il fallait comparer, sur toute la durée contractuelle puisque la violation contractuelle s'étendait sur cette période, l'évolution du portefeuille de la demanderesse avec celle d'un portefeuille hypothétique, dont la composition aurait en l'occurrence correspondu à celle de l'indice Euro Stoxx 50.
A cet égard, l'expert a précisé qu'il était difficile de trouver un indice permettant une comparaison de performance. Il avait vainement demandé à la défenderesse des références de rendement pour des portefeuilles dynamiques en rapport avec les années 2004 à 2008. L'expert avait finalement pris en compte deux critères: d'une part, l'indice Euro Stoxx 50, qui regroupe des sociétés européennes et dont la monnaie de référence est l'euro; d'autre part, l'indice UBS Actions, qui est l'indice le plus dynamique de cette banque, constitué à 90 % d'actions et dont la monnaie de référence est le franc suisse. La perte subie par le portefeuille de la demanderesse excédait de 80'189 fr. celle enregistrée avec l'indice UBS Actions; elle dépassait de 96'988 fr. celle enregistrée avec l'indice Euro Stoxx 50. Celui-ci, aux dires de l'expert, se rapprochait le plus du genre de placements pratiqués par la défenderesse dans l'exécution du mandat. L'administrateur de la défenderesse l'avait du reste reconnu devant l'expert. Par conséquent, les juges neuchâtelois ont retenu cet indice comme élément de comparaison et conclu que le dommage subi par la défenderesse était de 96'988 fr.
3.3. Devant le Tribunal fédéral, la défenderesse dit ne pas remettre en cause la responsabilité qui lui a été imputée, quand bien même elle ne partage pas l'appréciation du premier juge et de la cour cantonale à cet égard. Dans ces conditions, il n'y a pas matière à revoir le raisonnement des juges neuchâtelois en tant qu'ils reprochent à la défenderesse une violation de ses obligations découlant du contrat de gestion (consid. 3.1 supra), ce raisonnement n'étant entaché d'aucune erreur juridique manifeste (consid. 1.3 supra).
Seront dès lors examinés les griefs relatifs à la preuve et au calcul du dommage (consid. 3.2 supra).
3.4. La défenderesse reproche à la demanderesse de ne pas avoir suffisamment apporté la preuve de son dommage. L'indice Euro Stoxx 50 ne serait pas pertinent du fait qu'il serait trop éloigné de la composition effective du portefeuille de la demanderesse. Il aurait bien plutôt fallu se référer à un portefeuille hypothétique contenant des produits similaires dans leur nature intrinsèque à ceux composant le portefeuille de la demanderesse. L'indice Euro Stoxx 50, comme d'ailleurs l'indice UBS Actions, est composé d'actions et n'aurait dès lors rien de comparable avec les véhicules d'investissement spéculatifs utilisés dans la gestion du portefeuille de la demanderesse.
3.5. Les griefs de la défenderesse tombent à faux. En effet, celle-ci perd de vue que le portefeuille hypothétique dont le résultat peut être comparé à celui du portefeuille de la cliente doit être constitué et géré de façon conforme au contrat et aux règles du mandat (cf. consid. 2.4.3 supra). Or, en l'espèce, il est constant que le recours à des véhicules d'investissement hautement spéculatifs comme des warrants constituait en lui-même une violation caractérisée des devoirs d'information incombant au gérant (cf. consid. 2.3 supra). Qui plus est, la limite de 80 % pour les placements spéculatifs a été dépassée pendant toute la durée du contrat, et le portefeuille de la demanderesse n'était constitué que de trois à cinq positions, en violation de tous les principes applicables en matière de diversification (cf. consid. 3.1 supra).
L'expert s'est expliqué sur les difficultés à trouver un indice de référence dans le cas particulier, précisant que s'il n'existait pas d'indice adapté pour la comparaison avec le portefeuille litigieux, cela tenait peut-être au fait qu'en règle générale, les portefeuilles ne contiennent pas une proportion aussi importante de warrants (complément d'expertise, p. 14). Le Tribunal cantonal a fait sienne cette remarque, relevant que les difficultés rencontrées tenaient peut-être bien au fait que la gestion du portefeuille était à ce point atypique que celui-ci ne pouvait être comparé à aucun autre. La défenderesse taxe cette explication d'arbitraire en soulignant le bon rendement obtenu initialement avec les placements risqués; ce faisant, elle méconnaît les pertes importantes qu'ils ont finalement générées. En outre, elle ne dit mot sur le fait qu'elle n'a pas proposé d'autres indices de référence à l'expert.
L'expert a jugé que l'indice Euro Stoxx 50 se rapprochait le plus du genre de placements opérés par l'appelante. La cour cantonale a constaté en fait, de manière à lier le Tribunal fédéral (cf. consid. 1.2 supra), que l'administrateur de la défenderesse avait admis le choix de cet indice devant l'expert. La défenderesse tente vainement de contester ce fait en se référant à une pièce dénuée de pertinence.
Certes, la monnaie de référence de cet indice est l'euro, tandis que le contrat optait pour le franc suisse. Cet élément n'est toutefois pas déterminant dans ce cas particulier. En effet, le franc suisse a été choisi en relation avec un profil très risqué, ce qui excluait au moins le risque sur effet de change. Or, encore une fois, ce profil contractuel ne saurait servir de critère pour le portefeuille hypothétique, la défenderesse ayant violé l'<ref-law> en omettant d'informer la cliente des risques d'un tel profil, qui était inadapté à sa situation. L'Euro Stoxx 50 est notoirement considéré comme une référence du marché de la zone euro; il effectue une moyenne des actions de cinquante grandes sociétés de la zone euro, sélectionnées dans divers secteurs de l'économie en fonction de l'importance de leur capitalisation boursière. On se situe ainsi dans une perspective de gestion plus classique et diversifiée, appropriée à la situation de la demanderesse, les risques étant moindres que ceux ressortant du profil défini dans le contrat. L'administrateur de la défenderesse a par ailleurs approuvé le choix d'un indice en euros, alors que l'évolution respective du franc suisse et de l'euro sur la période critique lui était connue. Dans ces circonstances, il n'y a pas matière à critiquer l'utilisation de cet indice.
3.6. La manière dont les juges cantonaux ont déterminé le dommage sur la base des conclusions de l'expertise judiciaire échappe ainsi à la critique, ce qui scelle le sort du recours.
4.
Il résulte de ce qui précède que le recours doit être rejeté.
Vu l'issue du recours, les frais de la présente procédure seront mis à la charge de la défenderesse (<ref-law>), qui versera en outre à la demanderesse une indemnité de 6'000 fr. à titre de dépens (art. 68 al. 1 et 2 LTF).
La requête d'assistance judiciaire formulée par la demanderesse (<ref-law>) est en conséquence privée d'objet.

Par ces motifs, le Tribunal fédéral prononce :
1.
Le recours est rejeté.
2.
Les frais judiciaires, arrêtés à 5'000 fr., sont mis à la charge de la défenderesse.
3.
La défenderesse versera à la demanderesse une indemnité de 6'000 fr. à titre de dépens.
4.
La requête d'assistance judiciaire de la demanderesse est sans objet.
5.
Le présent arrêt est communiqué aux mandataires des parties et à la Cour d'appel civile du Tribunal cantonal du canton de Neuchâtel.
Lausanne, le 20 juin 2016
Au nom de la Ire Cour de droit civil
du Tribunal fédéral suisse
La Présidente: Kiss
La Greffière: Monti