UP | HOME

🔮 Stock Analysis

How to use Common Lisp for Stock Analysis

Introduction

So this Common Lisp program, in essence, is like a Sherlock Holmes for stock market data. It’s super cool how it works.

Basically, it’s having a chit-chat with this thing called the Alpha Vantage API - a fancy service that gives you all sorts of info on stocks. To make this chat happen smoothly, it uses this tool named Drakma, which is like an interpreter that helps our program speak the “Internet language.”

Once it gets this data, it creates these things called “equity instances.” Each of these is like a miniature dossier on a particular stock, holding its symbol, historical prices, and all sorts of nifty info. The program then has this cool feature where it can zoom in on specific price points for each stock.

Imagine it like focusing a microscope on just the part you want to see - like the closing prices, for example. Now, here’s where it gets even more exciting. The program can also do math on this data. It can figure out the average or “mean” price of a stock, which is like knowing the stock’s usual price ballpark.

But wait, there’s more. It can also calculate how much the price changes over time, kind of like tracking the stock’s mood swings. This can give you a sense of how wild or calm the stock is.

So, all in all, this program is like your personal stock market detective, crunching numbers, and finding out everything there is to know about specific stocks. It’s a great example of how you can use programming to pull in real-world data and make sense of it. And it’s all done in Common Lisp, which is one of those old-but-gold programming languages that’s super powerful once you get the hang of it.

General Settings

(in-package :cl-user)
(defpackage :stock-analysis (:use :cl))
(in-package :stock-analysis)

If you are not setting JSON as text format, drakma will handle it as binary format and will show it as bytes. Before you start using drakma as HTTP client for RESTful APIs you should add ’(“application” . “json”) to “drakma:*text-content-types*”.

(push '("application" . "json") drakma:*text-content-types*)
((application . json) (text))

Maybe you want to add this to your .sbclrc file:

cat ~/.sbclrc
(sb-ext:set-sbcl-source-location "~/git/sbcl/")
(defun print-condition-hook (condition hook)
  "Print this error message (condition) and abort the current operation."
  (declare (ignore hook))
  (princ condition)
  (clear-input)
  (abort))
*debugger-hook*
(setf *debugger-hook* #'print-condition-hook)
;;; The following lines added by ql:add-to-init-file:
#-quicklisp
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (when (probe-file quicklisp-init)
    (load quicklisp-init)))

(ql:update-dist "quicklisp")
(ql:quickload '(:dexador :drakma :cl-json :jonathan))
(push '("application" . "json") drakma:*text-content-types*)

Define Classes and Internal API

Alphavantage Class

This code provides the basic setup for interacting with the Alpha Vantage API using an object-oriented approach in Common Lisp. With this setup, you can easily extend the alphavantage class or add new methods to the generic functions for more specialized behavior.

(defun getenv (key)
  "Returns 'demo' if alpha vantage environment variable is null"
  (let ((value (uiop:getenv key)))
    (if value
        value
        "demo")))

API keys are typically stored as environment variables. In order to access the API key, you need to read the respective environment variable. You have the flexibility to choose the variable’s name - in this case, I’ve used “ALPHAVANTAGE”. When an instance is created, the function ’getenv’ is invoked to retrieve the API key and assign it to the new instance. If the environment variable is not present, ’getenv’ defaults to providing a demo API key, which can still access the Alpha Vantage API, but is restricted to the IBM symbol.

(defclass alphavantage ()
  ((api-key :initform (getenv "ALPHAVANTAGE") :initarg :api-key)
   (base-url :initform "https://www.alphavantage.co/query")
   (function :initform nil :initarg :function)
   (datatype :initform "json" :initarg :datatype)))
(defgeneric make-api-url (client)
  (:documentation "Constructs and returns the full URL for the Alpha Vantage API
request."))
(defgeneric call-api-url (client)
  (:documentation "Calls the Alpha Vantage API and returns the parsed JSON data
as a hash table."))
(defgeneric get-json-key (client)
  (:documentation "Determines the JSON key to use when parsing the API response
based on the properties of the given client instance."))
(defmethod make-api-url ((client alphavantage))
  (concatenate 'string
               (slot-value client 'base-url)
               "?function=" (slot-value client 'function)
               "&datatype=" (slot-value client 'datatype)
               "&apikey=" (slot-value client 'api-key)))

Timeseries Class

The Timeseries Class emulates the timeseries function of the Alpha Vantage API. It allows you to create unique instances for specific timeseries needs, which can then be used to make custom API calls determined by each instance’s properties.

(defclass timeseries (alphavantage)
  ((function :initform "TIME_SERIES"
             :initarg :function
             :documentation "The time series of your choice.")
   (time-unit :initform "DAILY"
              :initarg :time-unit
              :documentation "The unit of time for the time series.")
   (outputsize :initform "compact"
               :initarg :outputsize
               :documentation "The size of the output.")
   (adjusted :initform nil
             :initarg :adjusted
             :documentation "A flag indicating whether the data is adjusted.")
   (symbol :initform "IBM"
           :initarg :symbol
           :accessor timeseries-symbol
           :documentation "The name of the equity of your choice."))
  (:documentation "Time series of stock market data."))

The ’make-api-url’ method constructs the necessary URL for retrieving JSON data from the Alpha Vantage API, utilizing the properties of a given timeseries instance.

(defmethod make-api-url ((client timeseries))
  "Generate the appropriate API call URL based on the properties of the
'timeseries' instance."
  (concatenate 'string
               (slot-value client 'base-url)
               "?function=" (slot-value client 'function) "_"
               (slot-value client 'time-unit)
               (cond ((and (string= (slot-value client 'time-unit) "INTRADAY")
                           (slot-value client 'adjusted)) "&adjusted=true")
                     ((slot-value client 'adjusted) "_ADJUSTED"))
               (when (string= (slot-value client 'time-unit) "DAILY")
                 (concatenate 'string "&outputsize=" (slot-value client 'outputsize)))
               "&symbol=" (slot-value client 'symbol)
               "&apikey=" (slot-value client 'api-key)))

The ’call-api-url’ method interfaces with the Alpha Vantage API via the Drakma HTTP client, executing the task and subsequently returning a new ’equity’ class instance.

(defmethod call-api-url ((client timeseries))
  "Make an API call using the generated URL and return an 'equity' instance with
the retrieved data."
  (let* ((response (drakma:http-request (make-api-url client)))
         (data (jonathan:parse response :as :hash-table)))
    (if (= (hash-table-count data) 1)
        (maphash (lambda (key value) (format t "~A~%~A~%" key value)) data)
        (make-instance 'equity
                       :symbol (timeseries-symbol client)
                       :data data
                       :json-key (get-json-key client)))))
(defmethod get-json-key ((client timeseries))
  "Determine the appropriate JSON key for data extraction based on the 'timeseries' instance's properties."
  (let ((time-unit (slot-value client 'time-unit))
        (adjusted (slot-value client 'adjusted)))
         (cond ((string= time-unit "DAILY")
                "Time Series (Daily)")
               ((and (string= time-unit "WEEKLY")
                     (not adjusted))
                "Weekly Time Series")
               ((and (string= time-unit "WEEKLY")
                     adjusted)
                "Weekly Adjusted Time Series")
               ((and (string= time-unit "MONTHLY")
                     (not adjusted))
                "Monthly Time Series")
               ((and (string= time-unit "MONTHLY")
                     adjusted)
                "Monthly Adjusted Time Series"))))
(defun read-equities-table (lst)
  (let ((symbol (first (rest (member :symbol lst))))
        (time-unit (first (rest (member :time-unit lst)))))
    (make-instance 'timeseries :symbol symbol :time-unit time-unit)))

Date Class

Goal of the Date Class is to optimize working with date and time. It enables you to program against a Date API, which is more comfortable than working with date and time as strings.

(defconstant days-in-month
  #(-1 31 28 31 30 31 30 31 31 30 31 30 31))
(defun leap-year-p (year)
  "Check if a given YEAR is a leap year according to the Gregorian calendar rules."
  (and (= (mod year 4) 0)
       (or (not (= (mod year 100) 0))
           (= (mod year 400) 0))))
(defclass date ())

Equity Class

(defclass equity ()
  ((symbol :initarg :symbol)
   (data :initarg :data :accessor equity-data)
   (json-key :initarg :json-key :accessor equity-json-key)))
(defgeneric extract-prices (equity price &optional with-symbol))
(defmethod extract-prices ((e equity) price &optional with-symbol)
  (let ((time-series (gethash (slot-value e 'json-key) (slot-value e 'data)))
        (values '()))
    (when time-series
      (maphash (lambda (k v) (push (cons k (gethash price v)) values))
               time-series))
    (if with-symbol
        (list (read-from-string (slot-value e 'symbol)) values)
        values)))
(defmethod extract-close-prices ((e equity))
  (extract-prices e "4. close" t))

Calculations

Extract Prices from Equity

To connect to the Alpha Vantage API and retrieve timeseries data, start by defining a new timeseries instance. If you don’t specify an equity symbol, it will automatically default to ’IBM’. The Alpha Vantage API allows access without an API key, as long as you’re using the ’IBM’ symbol, making it ideal for testing and familiarizing yourself with the API’s functionalities. However, if you wish to extract data for other equities, it’s necessary to obtain an API key.

(defparameter *ts-monthly-ibm*
  (make-instance 'timeseries :time-unit "MONTHLY"))
(describe *ts-monthly-ibm*)
#<TIMESERIES {1006B3A233}>
  [standard-object]

Slots with :INSTANCE allocation:
  API-KEY                        = "demo"
  BASE-URL                       = "https://www.alphavantage.co/query"
  FUNCTION                       = "TIME_SERIES"
  DATATYPE                       = "json"
  TIME-UNIT                      = "MONTHLY"
  OUTPUTSIZE                     = "compact"
  ADJUSTED                       = NIL
  SYMBOL                         = "IBM"
(make-api-url *ts-monthly-ibm*)
https://www.alphavantage.co/query?function=TIME_SERIES_MONTHLY&symbol=IBM&apikey=demo
(defparameter *equity-ibm* (call-api-url *ts-monthly-ibm*))
(describe *equity-ibm*)
#<EQUITY {10027BF2F3}>
  [standard-object]

Slots with :INSTANCE allocation:
  SYMBOL                         = "IBM"
  DATA                           = #<HASH-TABLE :TEST EQUAL :COUNT 2 {10026AD1A3}>
  JSON-KEY                       = "Monthly Time Series"

Calculate the Mean Price

(defun parse-float (string)
  "Return a float read from string, and the index to the remainder of string.
https://groups.google.com/g/comp.lang.lisp/c/-W1FeuHq0DI/m/Wnr4iSOT1UkJ"
  (multiple-value-bind (integer i)
      (parse-integer string :junk-allowed t)
    (multiple-value-bind (fraction j)
        (parse-integer string :start (+ i 1) :junk-allowed t)
      (values (float (+ integer (/ fraction (expt 10 (- j i 1))))) j))))

Using Iteration

(defun mean-price-it (data)
  (let ((sum 0)
        (count 0))
    (dolist (item data)
      (incf sum (parse-float (cdr item)))
      (incf count))
    (/ sum count)))
(mean-price-it (extract-prices (call-api-url *ts-monthly-ibm*) "4. close"))
129.44922

Using Functional Programming

(defun mean-price-fp (data)
  (let ((numbers (mapcar #'rest data)))
    (/ (reduce #'+ (mapcar #'parse-float numbers)) (length numbers))))
(mean-price-fp (extract-prices (call-api-url *ts-monthly-ibm*) "4. close"))
129.44922

Calculate Price Changes

(defun price-changes (data)
  (let ((prev-price (parse-float (rest (first data))))
        (changes '()))
    (dolist (item data)
      (let ((price (parse-float (rest item)))
            (date (first item)))
        (push (cons date (- price prev-price)) changes)
        (setf prev-price price)))
    (nreverse changes)))
(price-changes (extract-prices (call-api-url *ts-monthly-ibm*) "4. close"))
(("1999-12-31" . 0.0) ("2000-01-31" . 4.3799973) ("2000-02-29" . -9.5)
 ("2000-03-31" . 15.620003) ("2000-04-28" . -6.8700027)
 ("2000-05-31" . -4.1900024) ("2000-06-30" . 2.25) ("2000-07-31" . 2.6900024)
 ("2000-08-31" . 19.770004) ("2000-09-29" . -19.400002)
 ("2000-10-31" . -14.120003) ("2000-11-30" . -5.0) ("2000-12-29" . -8.5)
 ("2001-01-31" . 27.0) ("2001-02-28" . -12.099998) ("2001-03-30" . -3.7200012)
 ("2001-04-30" . 18.96) ("2001-05-31" . -3.3399963) ("2001-06-29" . 1.699997)
 ("2001-07-31" . -8.290001) ("2001-08-31" . -5.260002)
 ("2001-09-28" . -8.229996) ("2001-10-31" . 16.349998)
 ("2001-11-30" . 7.5199966) ("2001-12-31" . 5.3700027) ("2002-01-31" . -13.07)
 ("2002-02-28" . -9.769997) ("2002-03-28" . 5.8799973)
 ("2002-04-30" . -20.239998) ("2002-05-31" . -3.3100052)
 ("2002-06-28" . -8.449997) ("2002-07-31" . -1.5999985)
 ("2002-08-30" . 4.9799957) ("2002-09-30" . -17.069996)
 ("2002-10-31" . 20.630001) ("2002-11-29" . 7.9799957)
 ("2002-12-31" . -9.419998) ("2003-01-31" . 0.69999695) ("2003-02-28" . -0.25)
 ("2003-03-31" . 0.48000336) ("2003-04-30" . 6.470001)
 ("2003-05-30" . 3.1399994) ("2003-06-30" . -5.540001) ("2003-07-31" . -1.25)
 ("2003-08-29" . 0.76000214) ("2003-09-30" . 6.3199997)
 ("2003-10-31" . 1.1500015) ("2003-11-28" . 1.0599976)
 ("2003-12-31" . 2.1399994) ("2004-01-30" . 6.550003)
 ("2004-02-27" . -2.7300034) ("2004-03-31" . -4.6600037)
 ("2004-04-30" . -3.6699982) ("2004-05-28" . 0.41999817)
 ("2004-06-30" . -0.4399948) ("2004-07-30" . -1.0800018)
 ("2004-08-31" . -2.3799973) ("2004-09-30" . 1.0499954)
 ("2004-10-29" . 4.010002) ("2004-11-30" . 4.489998) ("2004-12-31" . 4.340004)
 ("2005-01-31" . -5.1600037) ("2005-02-28" . -0.83999634)
 ("2005-03-31" . -1.2000046) ("2005-04-29" . -15.0) ("2005-05-31" . -0.8299942)
 ("2005-06-30" . -1.3500061) ("2005-07-29" . 9.260002)
 ("2005-08-31" . -2.8399963) ("2005-09-30" . -0.40000153)
 ("2005-10-31" . 1.659996) ("2005-11-30" . 7.0200043)
 ("2005-12-30" . -6.7000046) ("2006-01-31" . -0.8999939)
 ("2006-02-28" . -1.0600052) ("2006-03-31" . 2.2300034)
 ("2006-04-28" . -0.13000488) ("2006-05-31" . -2.4399948)
 ("2006-06-30" . -3.0800018) ("2006-07-31" . 0.59000397)
 ("2006-08-31" . 3.5599976) ("2006-09-29" . 0.9700012)
 ("2006-10-31" . 10.389999) ("2006-11-30" . -0.41000366)
 ("2006-12-29" . 5.2300034) ("2007-01-31" . 2.0) ("2007-02-28" . -6.209999)
 ("2007-03-30" . 1.3199997) ("2007-04-30" . 7.949997)
 ("2007-05-31" . 4.3899994) ("2007-06-29" . -1.3499985)
 ("2007-07-31" . 5.4000015) ("2007-08-31" . 6.040001)
 ("2007-09-28" . 1.1100006) ("2007-10-31" . -1.6800003)
 ("2007-11-30" . -10.940002) ("2007-12-31" . 2.9199982)
 ("2008-01-31" . -0.98999786) ("2008-02-29" . 6.75) ("2008-03-31" . 1.2799988)
 ("2008-04-30" . 5.5599976) ("2008-05-30" . 8.729996)
 ("2008-06-30" . -10.899994) ("2008-07-31" . 9.450005) ("2008-08-29" . -6.25)
 ("2008-09-30" . -4.7700043) ("2008-10-31" . -23.989998)
 ("2008-11-28" . -11.370003) ("2008-12-31" . 2.5600052)
 ("2009-01-30" . 7.489998) ("2009-02-27" . 0.37999725)
 ("2009-03-31" . 4.8600006) ("2009-04-30" . 6.3199997)
 ("2009-05-29" . 3.0699997) ("2009-06-30" . -1.8600006)
 ("2009-07-31" . 13.510002) ("2009-08-31" . 0.12000275)
 ("2009-09-30" . 1.5599976) ("2009-10-30" . 1.0) ("2009-11-30" . 5.739998)
 ("2009-12-31" . 4.5499954) ("2010-01-29" . -8.5099945)
 ("2010-02-26" . 4.7700043) ("2010-03-31" . 1.0899963) ("2010-04-30" . 0.75)
 ("2010-05-28" . -3.7399979) ("2010-06-30" . -1.7799988)
 ("2010-07-30" . 4.9199905) ("2010-08-31" . -5.2699966)
 ("2010-09-30" . 11.010002) ("2010-10-29" . 9.460007)
 ("2010-11-30" . -2.1399994) ("2010-12-31" . 5.299988)
 ("2011-01-31" . 15.2400055) ("2011-02-28" . -0.11999512)
 ("2011-03-31" . 1.1900024) ("2011-04-29" . 7.5099945)
 ("2011-05-31" . -1.6500092) ("2011-06-30" . 2.6200104)
 ("2011-07-29" . 10.300003) ("2011-08-31" . -9.940002)
 ("2011-09-30" . 2.9599915) ("2011-10-31" . 9.76001) ("2011-11-30" . 3.369995)
 ("2011-12-30" . -4.119995) ("2012-01-31" . 8.720001)
 ("2012-02-29" . 4.1299896) ("2012-03-30" . 11.919998)
 ("2012-04-30" . -1.5699921) ("2012-05-31" . -14.180008)
 ("2012-06-29" . 2.680008) ("2012-07-31" . 0.3999939)
 ("2012-08-31" . -1.1299896) ("2012-09-28" . 12.599991)
 ("2012-10-31" . -12.919998) ("2012-11-30" . -4.4599915)
 ("2012-12-31" . 1.4799957) ("2013-01-31" . 11.520004)
 ("2013-02-28" . -2.2400055) ("2013-03-28" . 12.470001)
 ("2013-04-30" . -10.76001) ("2013-05-31" . 5.480011)
 ("2013-06-28" . -16.910004) ("2013-07-31" . 3.9299927)
 ("2013-08-30" . -12.769989) ("2013-09-30" . 2.9099884)
 ("2013-10-31" . -5.969986) ("2013-11-29" . 0.46998596)
 ("2013-12-31" . 7.8900146) ("2014-01-31" . -10.890015)
 ("2014-02-28" . 8.4900055) ("2014-03-31" . 7.3200073)
 ("2014-04-30" . 3.9799957) ("2014-05-30" . -12.110001)
 ("2014-06-30" . -3.0899963) ("2014-07-31" . 10.399994)
 ("2014-08-29" . 0.6300049) ("2014-09-30" . -2.4700012)
 ("2014-10-31" . -25.430008) ("2014-11-28" . -2.2299957)
 ("2014-12-31" . -1.7299957) ("2015-01-30" . -7.130005)
 ("2015-02-27" . 8.630005) ("2015-03-31" . -1.4400024)
 ("2015-04-30" . 10.789993) ("2015-05-29" . -1.6399994)
 ("2015-06-30" . -6.98999) ("2015-07-31" . -0.66999817)
 ("2015-08-31" . -14.100006) ("2015-09-30" . -2.9199982)
 ("2015-10-30" . -4.8899994) ("2015-11-30" . -0.66000366)
 ("2015-12-31" . -1.800003) ("2016-01-29" . -12.829994)
 ("2016-02-29" . 6.239998) ("2016-03-31" . 20.419998)
 ("2016-04-29" . -5.5099945) ("2016-05-31" . 7.800003)
 ("2016-06-30" . -1.9600067) ("2016-07-29" . 8.839996)
 ("2016-08-31" . -1.7399902) ("2016-09-30" . -0.02999878)
 ("2016-10-31" . -5.1600037) ("2016-11-30" . 8.529999)
 ("2016-12-30" . 3.7700043) ("2017-01-31" . 8.529999) ("2017-02-28" . 5.300003)
 ("2017-03-31" . -5.680008) ("2017-04-28" . -13.850006)
 ("2017-05-31" . -7.6599884) ("2017-06-30" . 1.199997)
 ("2017-07-31" . -9.160004) ("2017-08-31" . -1.6399994)
 ("2017-09-29" . 2.050003) ("2017-10-31" . 8.979996)
 ("2017-11-30" . -0.08999634) ("2017-12-29" . -0.55000305)
 ("2018-01-31" . 10.279999) ("2018-02-28" . -7.869995)
 ("2018-03-29" . -2.4000092) ("2018-04-30" . -8.469986)
 ("2018-05-31" . -3.6500092) ("2018-06-29" . -1.6100006)
 ("2018-07-31" . 5.2299957) ("2018-08-31" . 1.550003) ("2018-09-28" . 4.730011)
 ("2018-10-31" . -35.780006) ("2018-11-30" . 8.839996)
 ("2018-12-31" . -10.599998) ("2019-01-31" . 20.75) ("2019-02-28" . 3.7100067)
 ("2019-03-29" . 2.9700012) ("2019-04-30" . -0.83000183)
 ("2019-05-31" . -13.280006) ("2019-06-28" . 10.909996)
 ("2019-07-31" . 10.340012) ("2019-08-30" . -12.710007)
 ("2019-09-30" . 9.889999) ("2019-10-31" . -11.690002)
 ("2019-11-29" . 0.7200012) ("2019-12-31" . -0.41000366)
 ("2020-01-31" . 9.690002) ("2020-02-28" . -13.580002)
 ("2020-03-31" . -19.219994) ("2020-04-30" . 14.629997)
 ("2020-05-29" . -0.65999603) ("2020-06-30" . -4.130005)
 ("2020-07-31" . 2.1700058) ("2020-08-31" . 0.36999512)
 ("2020-09-30" . -1.6399994) ("2020-10-30" . -10.0099945)
 ("2020-11-30" . 11.859993) ("2020-12-31" . 2.3600006)
 ("2021-01-29" . -6.7699966) ("2021-02-26" . -0.1800003)
 ("2021-03-31" . 14.329994) ("2021-04-30" . 8.62001) ("2021-05-28" . 1.8600006)
 ("2021-06-30" . 2.8499908) ("2021-07-30" . -5.6299896)
 ("2021-08-31" . -0.6200104) ("2021-09-30" . -1.4100037)
 ("2021-10-29" . -13.829994) ("2021-11-30" . -8.0) ("2021-12-31" . 16.560005)
 ("2022-01-31" . -0.08999634) ("2022-02-28" . -11.060005)
 ("2022-03-31" . 7.510002) ("2022-04-29" . 2.1900024)
 ("2022-05-31" . 6.6299896) ("2022-06-30" . 2.350006)
 ("2022-07-29" . -10.400009) ("2022-08-31" . -2.3399963)
 ("2022-09-30" . -9.639999) ("2022-10-31" . 19.479996)
 ("2022-11-30" . 10.610001) ("2022-12-30" . -8.0099945)
 ("2023-01-31" . -6.1600037) ("2023-02-28" . -5.4299927)
 ("2023-03-31" . 1.7899933) ("2023-04-28" . -4.6799927)
 ("2023-05-19" . 0.8499985))

Get Data of Many Equities

(defparameter *table-of-equities*
  '((:name "Siemens AG" :symbol "SIE.DEX" :time-unit "MONTHLY")
    (:name "Siemens Energy" :symbol "ENR.DEX" :time-unit "MONTHLY")
    (:name "Siemens Energy" :symbol "ENR.DEX" :time-unit "WEEKLY")
    (:name "Infineon AG" :symbol "IFX.DEX" :time-unit "MONTHLY")))
(defparameter *ts-equities*
  (mapcar #'read-equities-table *table-of-equities*))
(defparameter *call-response* (mapcar #'call-api-url *ts-equities*))
(mapcar #'extract-close-prices *call-response*)
((SIE.DEX
  (("2005-02-28" . "51.7400") ("2005-03-31" . "53.3298")
   ("2005-04-29" . "49.4688") ("2005-05-31" . "51.8448")
   ("2005-06-30" . "52.7096") ("2005-07-29" . "55.6010")
   ("2005-08-31" . "53.7579") ("2005-09-30" . "55.9941")
   ("2005-10-31" . "54.2121") ("2005-11-30" . "56.2038")
   ("2005-12-30" . "63.2445") ("2006-01-31" . "65.5682")
   ("2006-02-28" . "67.2628") ("2006-03-31" . "67.2978")
   ("2006-04-28" . "65.5158") ("2006-05-31" . "58.6322")
   ("2006-06-30" . "59.4272") ("2006-07-31" . "55.1293")
   ("2006-08-31" . "57.8111") ("2006-09-29" . "60.0998")
   ("2006-10-31" . "61.5848") ("2006-11-30" . "62.7816")
   ("2006-12-29" . "65.6380") ("2007-01-31" . "73.8231")
   ("2007-02-28" . "69.6651") ("2007-03-30" . "69.9009")
   ("2007-04-30" . "77.9201") ("2007-05-31" . "85.5548")
   ("2007-06-29" . "93.0935") ("2007-07-31" . "81.7375")
   ("2007-08-31" . "80.5320") ("2007-09-28" . "84.2271")
   ("2007-10-31" . "81.8685") ("2007-11-30" . "90.6039")
   ("2007-12-28" . "95.0939") ("2008-01-31" . "75.2820")
   ("2008-02-29" . "74.6181") ("2008-03-31" . "59.9688")
   ("2008-04-30" . "66.0137") ("2008-05-30" . "63.6988")
   ("2008-06-30" . "61.6023") ("2008-07-31" . "68.8003")
   ("2008-08-29" . "64.8693") ("2008-09-30" . "57.4355")
   ("2008-10-31" . "40.5848") ("2008-11-28" . "41.1177")
   ("2008-12-30" . "46.0183") ("2009-01-30" . "38.4184")
   ("2009-02-27" . "35.2300") ("2009-03-31" . "37.5711")
   ("2009-04-30" . "44.5769") ("2009-05-29" . "44.9351")
   ("2009-06-30" . "42.9434") ("2009-07-31" . "48.9184")
   ("2009-08-31" . "52.8057") ("2009-09-30" . "55.2778")
   ("2009-10-30" . "53.6967") ("2009-11-30" . "57.0074")
   ("2009-12-30" . "56.0902") ("2010-01-29" . "56.8065")
   ("2010-02-26" . "55.0245") ("2010-03-31" . "64.7732")
   ("2010-04-30" . "64.9392") ("2010-05-31" . "64.6597")
   ("2010-06-30" . "64.6597") ("2010-07-30" . "65.3323")
   ("2010-08-31" . "62.7029") ("2010-09-30" . "67.6385")
   ("2010-10-29" . "71.7004") ("2010-11-30" . "73.6310")
   ("2010-12-30" . "80.9775") ("2011-01-31" . "81.7899")
   ("2011-02-28" . "85.2491") ("2011-03-31" . "84.4804")
   ("2011-04-29" . "85.7994") ("2011-05-31" . "81.2395")
   ("2011-06-30" . "82.7246") ("2011-07-29" . "78.0773")
   ("2011-08-31" . "62.7903") ("2011-09-30" . "59.5058")
   ("2011-10-31" . "66.5815") ("2011-11-30" . "65.5070")
   ("2011-12-30" . "64.5898") ("2012-01-31" . "63.0174")
   ("2012-02-29" . "65.3935") ("2012-03-30" . "66.0311")
   ("2012-04-30" . "61.1218") ("2012-05-31" . "58.0994")
   ("2012-06-29" . "57.7762") ("2012-07-31" . "60.3618")
   ("2012-08-31" . "65.8826") ("2012-09-28" . "67.7957")
   ("2012-10-31" . "67.7346") ("2012-11-30" . "69.2720")
   ("2012-12-28" . "71.8053") ("2013-01-31" . "70.6172")
   ("2013-02-28" . "69.5515") ("2013-03-28" . "73.4038")
   ("2013-04-30" . "69.2720") ("2013-05-31" . "71.2899")
   ("2013-06-28" . "67.8306") ("2013-07-31" . "74.1991")
   ("2013-08-30" . "72.1979") ("2013-09-30" . "80.2840")
   ("2013-10-31" . "84.8995") ("2013-11-29" . "87.6219")
   ("2013-12-30" . "89.5059") ("2014-01-31" . "84.7011")
   ("2014-02-28" . "87.2252") ("2014-03-31" . "88.0726")
   ("2014-04-30" . "85.6387") ("2014-05-30" . "87.8562")
   ("2014-06-30" . "86.9458") ("2014-07-31" . "83.2949")
   ("2014-08-29" . "85.9452") ("2014-09-30" . "85.0707")
   ("2014-10-31" . "81.0502") ("2014-11-28" . "85.7829")
   ("2014-12-30" . "84.5118") ("2015-01-30" . "83.8357")
   ("2015-02-27" . "89.9837") ("2015-03-31" . "90.7770")
   ("2015-04-30" . "87.9013") ("2015-05-29" . "86.3418")
   ("2015-06-30" . "81.4469") ("2015-07-31" . "87.8382")
   ("2015-08-31" . "79.7431") ("2015-09-30" . "72.0627")
   ("2015-10-30" . "82.4835") ("2015-11-30" . "88.4692")
   ("2015-12-30" . "81.0232") ("2016-01-29" . "79.4907")
   ("2016-02-29" . "77.0387") ("2016-03-31" . "83.9710")
   ("2016-04-29" . "82.1410") ("2016-05-31" . "87.2523")
   ("2016-06-30" . "82.7630") ("2016-07-29" . "87.5497")
   ("2016-08-31" . "96.5012") ("2016-09-30" . "93.9321")
   ("2016-10-31" . "93.2560") ("2016-11-30" . "96.0956")
   ("2016-12-30" . "105.2905") ("2017-01-31" . "104.7947")
   ("2017-02-28" . "110.6992") ("2017-03-31" . "115.7474")
   ("2017-04-28" . "118.6321") ("2017-05-31" . "114.5304")
   ("2017-06-30" . "108.4907") ("2017-07-31" . "103.4425")
   ("2017-08-31" . "98.9803") ("2017-09-29" . "107.4540")
   ("2017-10-30" . "110.4288") ("2017-11-30" . "102.9467")
   ("2017-12-29" . "104.7045") ("2018-01-31" . "110.1223")
   ("2018-02-28" . "97.7543") ("2018-03-29" . "93.3191")
   ("2018-04-30" . "95.2302") ("2018-05-31" . "100.5127")
   ("2018-06-29" . "102.0632") ("2018-07-31" . "108.8603")
   ("2018-08-31" . "100.9454") ("2018-09-28" . "99.4670")
   ("2018-10-31" . "91.6965") ("2018-11-30" . "92.3095")
   ("2018-12-28" . "87.7841") ("2019-01-31" . "86.3418")
   ("2019-02-28" . "86.6573") ("2019-03-29" . "86.4860")
   ("2019-04-30" . "96.2218") ("2019-05-31" . "91.4441")
   ("2019-06-28" . "94.2927") ("2019-07-31" . "89.2355")
   ("2019-08-30" . "81.9877") ("2019-09-30" . "88.5684")
   ("2019-10-31" . "93.1929") ("2019-11-29" . "105.5789")
   ("2019-12-30" . "105.0561") ("2020-01-31" . "100.6389")
   ("2020-02-28" . "84.0160") ("2020-03-31" . "69.8361")
   ("2020-04-30" . "76.3356") ("2020-05-29" . "88.8208")
   ("2020-06-30" . "94.4369") ("2020-07-31" . "97.6461")
   ("2020-08-31" . "104.2628") ("2020-09-30" . "107.8800")
   ("2020-10-30" . "100.7000") ("2020-11-30" . "112.0000")
   ("2020-12-30" . "117.5200") ("2021-01-29" . "127.9400")
   ("2021-02-26" . "127.9800") ("2021-03-31" . "140.0000")
   ("2021-04-30" . "138.8200") ("2021-05-31" . "132.6400")
   ("2021-06-30" . "133.6200") ("2021-07-30" . "131.5800")
   ("2021-08-31" . "140.8400") ("2021-09-30" . "141.9200")
   ("2021-10-29" . "140.2800") ("2021-11-30" . "141.2800")
   ("2021-12-30" . "152.6800") ("2022-01-31" . "139.8800")
   ("2022-02-28" . "126.6600") ("2022-03-31" . "125.6600")
   ("2022-04-29" . "117.7800") ("2022-05-31" . "122.4400")
   ("2022-06-30" . "97.0900") ("2022-07-29" . "108.5400")
   ("2022-08-31" . "101.0800") ("2022-09-30" . "101.2000")
   ("2022-10-31" . "110.6400") ("2022-11-30" . "131.2200")
   ("2022-12-30" . "129.6400") ("2023-01-31" . "142.9000")
   ("2023-02-28" . "144.7000") ("2023-03-31" . "149.2600")
   ("2023-04-28" . "148.9000") ("2023-05-19" . "159.7800")))
 (ENR.DEX
  (("2020-10-30" . "18.8000") ("2020-11-30" . "24.9000")
   ("2020-12-30" . "30.0000") ("2021-01-29" . "30.5800")
   ("2021-02-26" . "31.2500") ("2021-03-31" . "30.6100")
   ("2021-04-30" . "27.8000") ("2021-05-31" . "26.0000")
   ("2021-06-30" . "25.4200") ("2021-07-30" . "22.9400")
   ("2021-08-31" . "24.5800") ("2021-09-30" . "23.2300")
   ("2021-10-29" . "24.8200") ("2021-11-30" . "23.4400")
   ("2021-12-30" . "22.4900") ("2022-01-31" . "19.7600")
   ("2022-02-28" . "21.4300") ("2022-03-31" . "20.7200")
   ("2022-04-29" . "18.4300") ("2022-05-31" . "17.9350")
   ("2022-06-30" . "13.9850") ("2022-07-29" . "16.1850")
   ("2022-08-31" . "14.6750") ("2022-09-30" . "11.3850")
   ("2022-10-31" . "11.8150") ("2022-11-30" . "15.8100")
   ("2022-12-30" . "17.5750") ("2023-01-31" . "19.1200")
   ("2023-02-28" . "18.9700") ("2023-03-31" . "20.2400")
   ("2023-04-28" . "22.1800") ("2023-05-19" . "24.2400")))
 (ENR.DEX
  (("2020-10-09" . "21.0400") ("2020-10-16" . "21.2000")
   ("2020-10-23" . "20.4200") ("2020-10-30" . "18.8000")
   ("2020-11-06" . "20.2500") ("2020-11-13" . "22.8700")
   ("2020-11-20" . "25.0200") ("2020-11-27" . "24.9200")
   ("2020-12-04" . "24.9000") ("2020-12-11" . "25.1000")
   ("2020-12-18" . "26.4200") ("2020-12-23" . "28.2100")
   ("2020-12-30" . "30.0000") ("2021-01-08" . "33.4300")
   ("2021-01-15" . "30.6300") ("2021-01-22" . "31.8900")
   ("2021-01-29" . "30.5800") ("2021-02-05" . "30.9700")
   ("2021-02-12" . "31.3100") ("2021-02-19" . "32.3200")
   ("2021-02-26" . "31.2500") ("2021-03-05" . "28.5000")
   ("2021-03-12" . "32.2000") ("2021-03-19" . "29.9400")
   ("2021-03-26" . "30.0900") ("2021-04-01" . "31.1000")
   ("2021-04-09" . "30.3900") ("2021-04-16" . "29.5000")
   ("2021-04-23" . "29.1500") ("2021-04-30" . "27.8000")
   ("2021-05-07" . "26.2300") ("2021-05-14" . "25.2000")
   ("2021-05-21" . "25.9200") ("2021-05-28" . "26.1200")
   ("2021-06-04" . "25.3900") ("2021-06-11" . "24.3900")
   ("2021-06-18" . "25.5600") ("2021-06-25" . "25.3700")
   ("2021-07-02" . "26.0100") ("2021-07-09" . "25.8800")
   ("2021-07-16" . "22.7000") ("2021-07-23" . "22.7300")
   ("2021-07-30" . "22.9400") ("2021-08-06" . "23.6400")
   ("2021-08-13" . "23.8900") ("2021-08-20" . "23.5600")
   ("2021-08-27" . "24.2800") ("2021-09-03" . "25.2800")
   ("2021-09-10" . "22.7800") ("2021-09-17" . "22.9000")
   ("2021-09-24" . "23.3000") ("2021-10-01" . "22.7100")
   ("2021-10-08" . "22.0100") ("2021-10-15" . "23.9100")
   ("2021-10-22" . "23.9100") ("2021-10-29" . "24.8200")
   ("2021-11-05" . "22.8200") ("2021-11-12" . "24.4500")
   ("2021-11-19" . "24.3000") ("2021-11-26" . "24.1800")
   ("2021-12-03" . "22.8600") ("2021-12-10" . "22.6600")
   ("2021-12-17" . "22.4300") ("2021-12-23" . "22.7800")
   ("2021-12-30" . "22.4900") ("2022-01-07" . "22.5900")
   ("2022-01-14" . "22.3200") ("2022-01-21" . "19.1250")
   ("2022-01-28" . "19.3900") ("2022-02-04" . "19.2950")
   ("2022-02-11" . "18.8250") ("2022-02-18" . "18.4200")
   ("2022-02-25" . "19.4350") ("2022-03-04" . "19.1450")
   ("2022-03-11" . "21.3800") ("2022-03-18" . "21.4500")
   ("2022-03-25" . "20.6000") ("2022-04-01" . "20.9100")
   ("2022-04-08" . "19.5900") ("2022-04-14" . "19.0250")
   ("2022-04-22" . "18.7400") ("2022-04-29" . "18.4300")
   ("2022-05-06" . "17.1650") ("2022-05-13" . "16.4500")
   ("2022-05-20" . "16.9350") ("2022-05-27" . "17.6200")
   ("2022-06-03" . "18.2850") ("2022-06-10" . "16.8450")
   ("2022-06-17" . "15.3100") ("2022-06-24" . "15.7000")
   ("2022-07-01" . "14.2200") ("2022-07-08" . "14.8400")
   ("2022-07-15" . "14.1750") ("2022-07-22" . "15.2850")
   ("2022-07-29" . "16.1850") ("2022-08-05" . "16.5400")
   ("2022-08-12" . "16.3550") ("2022-08-19" . "15.9000")
   ("2022-08-26" . "15.3500") ("2022-09-02" . "14.1500")
   ("2022-09-09" . "14.0000") ("2022-09-16" . "12.3000")
   ("2022-09-23" . "11.4500") ("2022-09-30" . "11.3850")
   ("2022-10-07" . "10.7900") ("2022-10-14" . "10.8700")
   ("2022-10-21" . "11.0250") ("2022-10-28" . "11.7150")
   ("2022-11-04" . "12.2700") ("2022-11-11" . "14.3350")
   ("2022-11-18" . "14.6750") ("2022-11-25" . "16.1350")
   ("2022-12-02" . "16.2300") ("2022-12-09" . "16.9350")
   ("2022-12-16" . "16.5750") ("2022-12-23" . "17.3550")
   ("2022-12-30" . "17.5750") ("2023-01-06" . "18.3300")
   ("2023-01-13" . "18.7900") ("2023-01-20" . "18.8800")
   ("2023-01-27" . "18.8950") ("2023-02-03" . "19.0950")
   ("2023-02-10" . "18.9150") ("2023-02-17" . "19.2000")
   ("2023-02-24" . "18.7450") ("2023-03-03" . "19.9050")
   ("2023-03-10" . "19.8600") ("2023-03-17" . "18.3250")
   ("2023-03-24" . "18.5400") ("2023-03-31" . "20.2400")
   ("2023-04-06" . "20.8000") ("2023-04-14" . "21.7000")
   ("2023-04-21" . "21.2800") ("2023-04-28" . "22.1800")
   ("2023-05-05" . "22.5200") ("2023-05-12" . "21.6600")
   ("2023-05-19" . "24.2400")))
 (IFX.DEX
  (("2005-02-28" . "7.8800") ("2005-03-31" . "7.4000")
   ("2005-04-29" . "6.4300") ("2005-05-31" . "7.1200")
   ("2005-06-30" . "7.7200") ("2005-07-29" . "8.1300")
   ("2005-08-31" . "7.5700") ("2005-09-30" . "8.1800")
   ("2005-10-31" . "7.8000") ("2005-11-30" . "7.6000")
   ("2005-12-30" . "7.7300") ("2006-01-31" . "7.7500")
   ("2006-02-28" . "7.7400") ("2006-03-31" . "8.5100")
   ("2006-04-28" . "9.6900") ("2006-05-31" . "8.8100")
   ("2006-06-30" . "8.7100") ("2006-07-31" . "8.3600")
   ("2006-08-31" . "9.1700") ("2006-09-29" . "9.3500")
   ("2006-10-31" . "9.5400") ("2006-11-30" . "9.6800")
   ("2006-12-29" . "10.6800") ("2007-01-31" . "10.9700")
   ("2007-02-28" . "11.6000") ("2007-03-30" . "11.6500")
   ("2007-04-30" . "11.4600") ("2007-05-31" . "11.5200")
   ("2007-06-29" . "12.3100") ("2007-07-31" . "12.1600")
   ("2007-08-31" . "11.4200") ("2007-09-28" . "12.0900")
   ("2007-10-31" . "10.1300") ("2007-11-30" . "8.1500")
   ("2007-12-28" . "8.0700") ("2008-01-31" . "6.7700")
   ("2008-02-29" . "5.3600") ("2008-03-31" . "4.4500")
   ("2008-04-30" . "6.0100") ("2008-05-30" . "5.7900")
   ("2008-06-30" . "5.5300") ("2008-07-31" . "4.8950")
   ("2008-08-29" . "5.8500") ("2008-09-30" . "3.9150")
   ("2008-10-31" . "2.4550") ("2008-11-28" . "1.8500")
   ("2008-12-30" . "0.9600") ("2009-01-30" . "0.7000")
   ("2009-02-27" . "0.4750") ("2009-03-31" . "0.8700")
   ("2009-04-30" . "2.0150") ("2009-05-29" . "2.2200")
   ("2009-06-30" . "2.5750") ("2009-07-31" . "2.8900")
   ("2009-08-31" . "3.6650") ("2009-09-30" . "3.8550")
   ("2009-10-30" . "3.0650") ("2009-11-30" . "3.1900")
   ("2009-12-30" . "3.8800") ("2010-01-29" . "4.0190")
   ("2010-02-26" . "4.0070") ("2010-03-31" . "5.1390")
   ("2010-04-30" . "5.3430") ("2010-05-31" . "4.6610")
   ("2010-06-30" . "4.8180") ("2010-07-30" . "5.1790")
   ("2010-08-31" . "4.4010") ("2010-09-30" . "5.0810")
   ("2010-10-29" . "5.6560") ("2010-11-30" . "6.8460")
   ("2010-12-30" . "6.9630") ("2011-01-31" . "7.7210")
   ("2011-02-28" . "7.9280") ("2011-03-31" . "7.2350")
   ("2011-04-29" . "7.6640") ("2011-05-31" . "8.0410")
   ("2011-06-30" . "7.7520") ("2011-07-29" . "7.0070")
   ("2011-08-31" . "5.9370") ("2011-09-30" . "5.5880")
   ("2011-10-31" . "6.5290") ("2011-11-30" . "6.1420")
   ("2011-12-30" . "5.8160") ("2012-01-31" . "6.9760")
   ("2012-02-29" . "7.5910") ("2012-03-30" . "7.6660")
   ("2012-04-30" . "7.5210") ("2012-05-31" . "6.3880")
   ("2012-06-29" . "5.3320") ("2012-07-31" . "5.9290")
   ("2012-08-31" . "5.4950") ("2012-09-28" . "4.9380")
   ("2012-10-31" . "5.2500") ("2012-11-30" . "5.8960")
   ("2012-12-28" . "6.1290") ("2013-01-31" . "6.6450")
   ("2013-02-28" . "6.5610") ("2013-03-28" . "6.1600")
   ("2013-04-30" . "5.9950") ("2013-05-31" . "6.5500")
   ("2013-06-28" . "6.4300") ("2013-07-31" . "6.6340")
   ("2013-08-30" . "6.8600") ("2013-09-30" . "7.3950")
   ("2013-10-31" . "7.1290") ("2013-11-29" . "7.4700")
   ("2013-12-30" . "7.7600") ("2014-01-31" . "7.6560")
   ("2014-02-28" . "8.2200") ("2014-03-31" . "8.6620")
   ("2014-04-30" . "8.3790") ("2014-05-30" . "9.0990")
   ("2014-06-30" . "9.1290") ("2014-07-31" . "8.2750")
   ("2014-08-29" . "8.8450") ("2014-09-30" . "8.1930")
   ("2014-10-31" . "7.7410") ("2014-11-28" . "7.8780")
   ("2014-12-30" . "8.8450") ("2015-01-30" . "9.9770")
   ("2015-02-27" . "10.3450") ("2015-03-31" . "11.1300")
   ("2015-04-30" . "10.5800") ("2015-05-29" . "11.8700")
   ("2015-06-30" . "11.1300") ("2015-07-31" . "10.2050")
   ("2015-08-31" . "9.7540") ("2015-09-30" . "10.0550")
   ("2015-10-30" . "11.1950") ("2015-11-30" . "14.0300")
   ("2015-12-30" . "13.5050") ("2016-01-29" . "12.2800")
   ("2016-02-29" . "11.2650") ("2016-03-31" . "12.5050")
   ("2016-04-29" . "12.4250") ("2016-05-31" . "13.4800")
   ("2016-06-30" . "12.9750") ("2016-07-29" . "14.8000")
   ("2016-08-31" . "15.0950") ("2016-09-30" . "15.8800")
   ("2016-10-31" . "16.3550") ("2016-11-30" . "15.7800")
   ("2016-12-30" . "16.5100") ("2017-01-31" . "16.9900")
   ("2017-02-28" . "16.8000") ("2017-03-31" . "19.1450")
   ("2017-04-28" . "19.0000") ("2017-05-31" . "19.6900")
   ("2017-06-30" . "18.4850") ("2017-07-31" . "18.3850")
   ("2017-08-31" . "19.3700") ("2017-09-29" . "21.2700")
   ("2017-10-30" . "23.5050") ("2017-11-30" . "23.2000")
   ("2017-12-29" . "22.8350") ("2018-01-31" . "23.4100")
   ("2018-02-28" . "22.4000") ("2018-03-29" . "21.7400")
   ("2018-04-30" . "21.2800") ("2018-05-31" . "23.4900")
   ("2018-06-29" . "21.8300") ("2018-07-31" . "22.6600")
   ("2018-08-31" . "21.9200") ("2018-09-28" . "19.5700")
   ("2018-10-31" . "17.7100") ("2018-11-30" . "18.4950")
   ("2018-12-28" . "17.3650") ("2019-01-31" . "19.4150")
   ("2019-02-28" . "19.3050") ("2019-03-29" . "17.6850")
   ("2019-04-30" . "21.0250") ("2019-05-31" . "16.0840")
   ("2019-06-28" . "15.5500") ("2019-07-31" . "17.0200")
   ("2019-08-30" . "15.7480") ("2019-09-30" . "16.5120")
   ("2019-10-31" . "17.3780") ("2019-11-29" . "19.3880")
   ("2019-12-30" . "20.3100") ("2020-01-31" . "19.5760")
   ("2020-02-28" . "18.7940") ("2020-03-31" . "13.4300")
   ("2020-04-30" . "16.9500") ("2020-05-29" . "18.8560")
   ("2020-06-30" . "20.8750") ("2020-07-31" . "21.1300")
   ("2020-08-31" . "23.1600") ("2020-09-30" . "24.1150")
   ("2020-10-30" . "23.9000") ("2020-11-30" . "29.5200")
   ("2020-12-30" . "31.3900") ("2021-01-29" . "33.1250")
   ("2021-02-26" . "36.0000") ("2021-03-31" . "36.1550")
   ("2021-04-30" . "33.5650") ("2021-05-31" . "33.2650")
   ("2021-06-30" . "33.8200") ("2021-07-30" . "32.1350")
   ("2021-08-31" . "36.0650") ("2021-09-30" . "35.5250")
   ("2021-10-29" . "40.3950") ("2021-11-30" . "39.9300")
   ("2021-12-30" . "40.7600") ("2022-01-31" . "36.3350")
   ("2022-02-28" . "30.7450") ("2022-03-31" . "30.9850")
   ("2022-04-29" . "27.4500") ("2022-05-31" . "28.9400")
   ("2022-06-30" . "23.0900") ("2022-07-29" . "26.5500")
   ("2022-08-31" . "24.3000") ("2022-09-30" . "22.7100")
   ("2022-10-31" . "24.6400") ("2022-11-30" . "31.5200")
   ("2022-12-30" . "28.4300") ("2023-01-31" . "32.9150")
   ("2023-02-28" . "33.5150") ("2023-03-31" . "37.6800")
   ("2023-04-28" . "32.9050") ("2023-05-19" . "35.9550"))))
(defparameter *equities-data*
   (mapcar #'extract-close-prices *call-response*))
(defun mean-price-table (equities-table)
  (let ((symbol (first equities-table))
        (data (cadr equities-table)))
    (cons symbol (mean-price-fp data))))
(mapcar #'mean-price-table *equities-data*)
((SIE.DEX . 84.74001) (ENR.DEX . 21.603592) (IFX.DEX . 13.725464))

Author: Marcus Kammer

Email: marcus.kammer@mailbox.org

Date: Sat, 18 May 2024 15:07 +0200

Emacs 29.1.90 (Org mode 9.6.11)

License: CC BY-SA 3.0