Un tutorial su come estrarre passo dopo passo le serie temporali Versioned con l'SDK C#.
Artesian ti permette di avere un accesso semplice allo storico dei dati .
Vediamo passo passo come procedere.
Obiettivo
Estrarre i dati di una Versioned Time Serie Market Data.
I dati e i link di riferimento sono fittizi, creati appositamente per questo case. In Artesian è possibile estrarre qualsiasi dato che sia riconducibile a una Time Serie.
Vediamo passo per passo come procedere.

Importazione delle librerie e configurazione di Artesian

La prima cosa da fare per poter utilizzare tutte le funzionalità di Artesian è quella di scaricare l’SDK Artesian dai NuGet.
Una volta installato, ed importate le librerie necessarie (linee1-3), possiamo configurare Artesian, inserendo il link necessario e l’api-key (linea 5).
Per poter estrarre questi due dati importanti, si può far riferimento al tutorial “Come Configurare Artesian C# SDK”.
Possiamo, eventualmente, impostare anche una Policy Configuration personalizzata, questa è utile nel caso si voglia definire un differente comportamento dal default per i retry o il numero di chiamate in parallelo che l’SDK effettua.
La configurazione di default è di per se l’ottimale quindi si consiglia di non modificarla.
Terminata la configurazione di Artesian e dell’eventuale Policy, possiamo configurare il Query Service (linea 15).
using Artesian.SDK.Dto;
using Artesian.SDK.Service;
using NodaTime;
ArtesianServiceConfig cfg = new ArtesianServiceConfig(
new Uri("https://arkive.artesian.cloud/{tenantName}/"), "{api-key}");
ArtesianPolicyConfig policy = new ArtesianPolicyConfig();
#policy
# .RetryPolicyConfig(retryCount: 3, retryWaitTime: 200)
# .CircuitBreakerPolicyConfig(maxExceptions: 2, durationOfBreak: 3)
# .BulkheadPolicyConfig(maxParallelism: 10, maxQueuingActions: 15);
var qs = new QueryService(cfg, policy);
La creazione dell'estrazione Versioned
Una volta configurato Artesian e il Query Service, possiamo iniziare a pensare a quali dati vogliamo estrarre e a come li vogliamo estrarre.
L’informazione di base da avere per poter effettuare una estrazione da Artesian è l’ID o una lista di ID relativa ai Market Data di interesse, questa può essere facilmente ottenuta tramite la UI.
Parametri fondamentali da decidere
Una volta ottenuti gli ID che ci interessa estrarre possiamo iniziare a valutare come li vogliamo estrarre. I parametri fondamentali da decidere sono:
Il Time Range di estrazione, Artesian mette a disposizione varie possibilità, per ognuna di esse va considerato che il riferimento temporale di fine estrazione è sempre esclusivo. Per questo specifico esempio, consideriamo l’AbsoluteDateRange(“2022-05-01”, “2022-05-03”).
La TimeZone di estrazione del dato può essere selezionata a seconda del proprio interesse, Artesian si occuperà di convertire i dati se necessario.
Il Tipo di Versione per i market data. Artesian supporta varie tipologie di estrazioni per le versioni, nell’esempio sotto useremo il comando “forMUV” in modo da avere il dato più aggiornato, ma in fondo all’articolo è possibile trovare una spiegazione di tutte le possibili opzioni.
La Granularità di estrazione del dato, questa può essere coincidente a quella del dato originale o differente a patto che sia stata configurata una Aggregation Rule sulla curva di interesse.
L’Aggregation Rule è quella funzionalità di Artesian che permette di estrarre i dati anche a granularità differenti da quella originale. L’operazione di aggregazione/disaggregazione applicata ai dati è definita tramite la valorizzazione di questa proprietà. Le possibili opzioni sono “Undefined”, “SumAndDivide” oppure “AverageAndReplicate”. Nel caso di “Undefined” non sarà ovviamente possibile estrarre i dati a granularità differenti dall’originale.
Una volta stabiliti i parametri di base della nostra estrazione, la si può lanciare e visionare i dati ottenuti.
var versionedTimeSeries = await qs.CreateVersioned()
.ForMarketData(new int[] { 100000492 })
.InAbsoluteDateRange(new LocalDate(2018,05,01),new LocalDate(2018,05,03))
.InGranularity(Granularity.Day)
.ExecuteAsync();
return versionedTimeSeries.ToList();
Altre opzioni per l'estrazione dei dati
Relativamente alla selezione dei range di estrazione, Artesian supporta le seguenti opzioni:
“AbsoluteDateRange” è un arco di tempo determinato assoluto (es.: dal “2018-08-01” al “2018-08-13” ti permetterà di estrarre i dati dal “2018-08-01” al “2018-08-12”).
“RelativePeriod” rappresenta un arco di tempo relativo, precedente o successivo ad oggi (es.: Considerando che oggi sia il “2021-03-31” richiedere il period “P-5D” significherà estrarre i dati dal “2021-03-26” al “2021-03-30”. Richiedendo il period “P5D” significherà estrarre i dati dal “2021-03-31” al “2021-04-04”). Per la sintassi è possibile fare riferimento allo standard ISO8601, oltre al semplice “RelativePeriod” è possibile usare il “RelativePeriodRange” (es: da “P-5D” a “P5D” estrarrà i dati dal “2021-03-26” al “2021-04-04”).
“RelativeInterval” è un arco di tempo “rolling” a dimensione fissa. Le possibili opzioni sono: “RollingWeek”, “RollingMonth”, “RollingQuarter” o “RollingYear” ovvero gli ultimi 7, 30, 90, 365 giorni di dati (con il giorno in corso incluso); “WeekToDate”, “MonthToDate”, “QuarterToDate” o “YearToDate” ovvero considerando dal giorno in corso a inizio settimana, mese o anno.
.InAbsoluteDateRange(new LocalDate(2018,08,01),new LocalDate(2018,08,10)
.InRelativeInterval(RelativeInterval.RollingMonth)
.InRelativePeriod(Period.FromDays(5))
.InRelativePeriodRange(Period.FromWeeks(2), Period.FromDays(20))
Nella selezione della versione Artesian supporta i seguenti casi:
“MUV” : estrae per ogni istante temporale, il dato con la versione più recente
“LastNVersions” : estrae le ultime N (con N numero che viene passato come parametro alla chiamata) versioni che hanno almeno un valore nel range di date di estrazione
“LastOfDays” : estrae l’ultima versione disponibile per ogni giorno, nel range di giorni o nel range di period che gli viene passato come parametro
“LastOfMonths” : estrae l’ultima versione disponibile per ogni mese, nel range di giorni o nel range di period che gli viene passato come parametro
“Version” : estrae una versione specifica, in base al timestamp passato come parametro alla chiamata. Tale valore deve essere identico a quello salvato in Artesian per il Market Data estratto
“MostRecent” : estrae la versione più recente nel range di date, data ora o period che gli viene passato
.ForVersion(new LocalDateTime(2018, 07, 19, 12, 0, 0, 123))
.ForLastOfDays(new LocalDate(2018, 6, 22), new LocalDate(2018, 7, 23))
.ForLastNVersions(3)
.ForMostRecent(Period.FromMonths(-1), Period.FromDays(20))
.ForMUV()
/// optional paramater to limit version
.ForMUV(new LocalDateTime(2019, 05, 01, 2, 0, 0))
Oltre a quelle menzionate precedentemente, Artesian offre anche la possibilità di applicare un filling ai dati in modo da gestire eventuali dati mancanti. Le possibili opzioni sono:
FillNull() : un’operazione di default che ritorna nell’estrazione anche i valori vuoti (null).
FillNone() : un’operazione che non ritorna nell’estrazione i valori vuoti (null).
FillLatestValue(“P5D”) : un’operazione che ritorna nell’estrazione l’ultimo valore disponibile rispetto al periodo indicato nella chiamata, in questo caso “5” giorni indietro.
FillCustomValue() : un’operazione che applica nell’estrazione un valore custom al posto dei valori mancanti (null). Questi valori verranno applicati al settlement, al prezzo di apertura e/o chiusura, al prezzo più alto e/o più basso, al volume pagato, al volume effettivamente venduto e/o al volume.
.WithFillNull()
.WithFillNone()
.WithLFillLatestValue(Period.FromDays(7))
.WithFillCustomValue(123)
Alternativa all'estrazione in SDK
In alternativa all’estrazione in SDK, possiamo estrarre i dati direttamente da portale in formato Excell.

Basta eseguire l’operazione una sola volta per poi averla completamente riproducibile e automatizzata nel nostro workflow.
Questo non solo permette di risparmiare tempo, ma permette anche di ridurre al minimo gli errori umani dati dall’eseguire operazioni ripetute su grandi moli di dati o su diversi file Excel.
Un vantaggio innegabile che ci consente di focalizzarci sull’analisi del dato invece che sulla sua gestione e ottimizzazione.