Scrittura Market Assessment [Python]

Un tutorial su come scrivere step by step le serie temporali Market Assessment in Artesian con l'SDK Python.

Artesian ti permette non solo di avere un accesso semplice allo storico dei dati ma anche di poterne scrivere di nuovi al suo interno.

Vediamo passo passo come procedere.

Obiettivo

Scrivere i nostri dati in un Market Assessment Time Serie Market Data.

I dati e i link di riferimento sono fittizi, creati appositamente per questo case. In Artesian è possibile scrivere qualsiasi dato che sia riconducibile a una Time Serie, quindi è idoneo per salvare i tuoi dati di produzione.

Vediamo passo per passo come procedere.

Importazione delle librerie e configurazione di Artesian

Per poter scrivere la nostra Time Serie Write in Python, abbiamo bisogno di importare “from Artesian”: ArtesianConfig, Granularity e MarketData.

Per poter scrivere le Time Series ed utilizzare la TimeZone, dobbiamo importare “datetime” dalla libreria datetime e  “tz” dalla libreria dateutil. 

Una volta importate le librerie necessarie, possiamo configurare Artesian, inserendo il link necessario e l’api-key.

Per poter estrarre questi due dati importanti, si può far riferimento al tutorial di riferimento “Come Configure Artesian Python SDK“. 

Terminata la configurazione di Artesian, possiamo configurare il MarketData Service

				
					from Artesian import ArtesianConfig, Granularity, MerketData
from Artesian import datetime
from dateutil import tz

cfg = ArtesianConfig("https://arkive.artesian.cloud/{tenantName}/", "{api-key}")
mkservice = MarketData.MarketDataService(cfg)
				
			


Il MarketData Identifier e i dati necessari per la scrittura del Market Assessment TimeSeries

Una volta configurato Artesian e il MarketData Service, possiamo definire il MarketData Identifier, ovvero possiamo dare un nome al nostro MarketData.

Il nome del Provider, in questo caso sarà “PythonSDK”, mentre il nome del Market Data sarà “MarketAssessmentWrite”. Una volta definiti questi nomi, ci sarà più facile trovarli sul portale, sia sotto la voce ProviderName, sia successivamente quando avremo più MarketData sotto lo stesso provider, come nel caso di questi tutorials.

Definiti i nomi del market data e del provider, possiamo passare al decidere le caratteristiche di base della nostra Time Serie, come il tipo di Granularità, il tipo della Time Serie, la TimeZone, l’eventuale Aggregation Rule e le Tags.

Artesian può supportare diverse granularità come: 10min, 15min, 30min, Hour, Day, Week, Month, Quarter, Season e Year.

Nel momento in cui decidiamo il tipo di granularità del nostro market data, lo dobbiamo scrivere di conseguenza, indicandone i valori. Nel caso di Granularity.Day, i dati corrisponderanno a un determinato giorno, di un determinato mese, di un determinato anno. Nel caso di Granularity.Hour, i dati corrisponderanno a una determinata ora (minuto e secondo) di uno stesso determinato giorno in  un determinato anno.

Il tipo della Time Serie, in questo caso è Market Assessment, ma potrebbe essere anche Actual, Versioned, BidAsk oppure Auction. Vedi gli altri tutorial.

Le TimeZone più comunemente usate in Artesian sono la “UTC” e “CET”, volendo il sistema può supportare anche “WET”, “EET”, “Europe/Istanbul” e “Europe/Moscow”.

Le Tags non sono obbligatorie, possono però essere utili nel categorizzare i nostri dati per poi permetterci di ritrovarli più rapidamente, scorrendo il menù del portale. In questo nostro specifico caso, setteremo le tags come “TutorialSDKPython”, con all’interno “PythonValue3” per questo nostro market data.

				
					mkdir = MarketData.MarketDataIdentifier("PythonSDK","MarketAssessmentWrite")

mkd = MarketData.MarketDataEntityInput(
    providerName=mkdir.provider,
    marketDataName=mkdir.name,
    originalGranularity=Granularity.Day,
    type=MarketData.MarketDataType.MarketAssessment,
    originalTimezone="UTC",
    tags=
    {
        "TutorialSDKPython": ["PythonValue3"]
    }
)
				
			


Controllo e registrazione del MarketData

Una volta settata la base del MarketData, bisogna controllare se questa Time Serie esista già. Per farlo dobbiamo passare il nome del provider e del market data, che sono degli identifier unici, e vedere se c’è un riscontro in Artesian. Nel caso ci sia un riscontro, i dati non potranno essere sovrascritti perchè già esistenti e salvati precedentemente. Nel caso non vi sia alcun riscontro, i nostri dati potranno essere salvati all’interno di Artesian, attraverso il comando “registerMarketData”.

 

				
					registered = mkservice.readMarketDataRegistryByName(mkdir.provider, mkdir.name)
if(registered is None):
    registered = mkservice.registerMarketData(mkd)
				
			


Scrittura dei valori del MarketData

Effettuato questo controllo, possiamo passare all’inserire i valori nel market data, per farlo dobbiamo usare l’identifier definito precedentemente. L’Original Timezone dei valori che inseriremo dovrà essere scritta in “CET”.

Nella definizione dei rows del nostro MarketAssessment TimeSerie sono un dictionary di tuple contenenti come chiavi del dictionary il datetime della time serie mentre i valori, in questo caso, sono un esempio di ciò che possiamo inserire.

E’ obbligatorio scrivere almeno un valore all’interno dei dictionaries, in modo che il bid ask salvato su Artesian.

Tra i valori da inserire, e  suggeriti dall’IntelliSense”, ci sono: “Open”, “Close”, “High”, “Low”, “Settlement”, “VolumePaid”, “VolumeGiven”, “” and “VolumeTotal”. In questo caso terremo in considerazione solo open e close.

Bisogna tenere presente che se stiamo scrivendo una time serie in una granularità inferiore al giorno, le datetime devono essere convertite in “UTC”, mentre se è giornaliera o superiore, può essere anche “CET”, questo perché il sistema si aspetta i dati scritti in questo modo. 

Nel caso di una granularità giornaliera, il market data conterrà valori per il primo e secondo Gennaio.

Nel caso di una granularità oraria, invece, guidati anche dall’IntelliSense, possiamo inserire dei valori per ogni ora di uno stesso giorno in un determinato mese di un determinato anno. 

Un altro campo obbligatorio da scrivere è il: “DownloadedAt“, un’informazione di tipo metadata che rappresenta quando il dato è stato generato.

Una volta inseriti i valori e definito il momento di generazione dei dati, possiamo caricare e salvare il Market Assessment Time Serie che abbiamo appena scritto nel sistema, attraverso il comando “upsertData“.

				
					marketAssessment = MarketData.UpsertData(MarketData.MarketDataIdentifier(mkdir, 'CET', 
  marketAssessment=
  {
      datetime(2020,1,1):
      {
         "Feb-20": MarketData.MarketAssessmentValue(open=10.0, close=11.0),
         "Mar-20": MarketData.MarketAssessmentValue(open=20.0, close=21.0)
      },
          datetime(2020,1,2):
          {
              "Feb-20": MarketData.MarketAssessmentValue(open=11.0, close=12.0),
              "Mar-20": MarketData.MarketAssessmentValue(open=21.0, close=22.0)
          }
  },
  downloadedAt=datetime(2020,1,3).replace(tzinfo=tz.UTC)
  )

mkservice.upsertData(marketAssessment)
				
			


Visualizzazione del nuovo MarketData nel portale Artesian

A meno che non ci siano errori da segnalare, nel terminal non apparirà nulla. Possiamo però, tornando sul portale di Artesian, verificare che la nostra TimeSerie appaia sotto la categoria ProviderName con il nome, datole precedentemente, di “PythonSDK”. Scorrendo il menù, possiamo anche notare la voce “TutorialSDKPython”, che non è altro che il nostro tag.

 

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.