Verwenden von SQLite zum Erstellen einer quantitativen Erfinderdatenbank

Erstellt in: 2021-03-26 17:09:32, aktualisiert am: 2024-12-05 21:56:39
comments   5
hits   1771

[TOC]

Verwenden von SQLite zum Erstellen einer quantitativen Erfinderdatenbank

Zusammenfassung

Daten sind die Quelle des quantitativen Handels. Wie man große Datenmengen effizient verwaltet, ist ein kritischer Zusammenhang. Datenbanken sind eine der besten Lösungen. Heutzutage ist die Anwendung von Datenbanken zu einer quantitativen Standardkonfiguration für verschiedene Intraday-Handels- und Hochfrequenzhandelsgeschäfte geworden. und andere Strategien. . In diesem Artikel untersuchen wir die integrierte Datenbank von Inventor Quantitative (FMZ.COM), unter anderem: wie man Datentabellen erstellt, Daten speichert, ändert, löscht und auf Daten verweist und wie man sie im tatsächlichen Kampf anwendet.

So wählen Sie eine Datenbank aus

Wer mit der Inventor Quantitative Platform vertraut ist, sollte wissen, dass man vorher nur die Funktion _G() verwenden kann, wenn man Daten lokal zur Wiederverwendung speichern möchte. Jedes Mal, wenn man die Strategie stoppt,_Die Funktion G() speichert die benötigten Informationen automatisch. Wenn Sie jedoch komplexer formatierte Daten speichern möchten,_Da die Funktion G() offensichtlich nicht sehr anwendbar ist, dachten viele Leute darüber nach, zur Lösung dieses Problems eine eigene Datenbank zu erstellen.

Wenn es um selbst erstellte Datenbanken geht, denkt wahrscheinlich jeder an Oracle, MySQL, KDB, OneTick, NoSQL … Dies alles sind hervorragende Anwendungen auf Unternehmensebene mit sehr leistungsstarken Funktionen und Leistung. Es gibt jedoch auch mehrere Probleme: Der Einstieg ist schwierig, die Konfiguration ist umständlich und die Wartung ist mühsam. Für quantitative Einzelhändler ist dies ein bisschen so, als würde man mit einer Kanone eine Fliege töten. Selbst wenn sie anfangen, werden sie nur einen kleinen Teil der Funktionen nutzen.

Integrierte Inventor Quantitative-Datenbank

Als nächstes werfen wir einen Blick auf die in InventorQuant integrierte, leichtgewichtige Datenbank. DBExec ist eine in InventorQuant integrierte Schnittstelle für relationale Datenverwaltungssysteme. Sie basiert auf SQLite und ist in C geschrieben. Sie ist nicht nur klein und ressourcenschonend , aber auch Die Verarbeitungsgeschwindigkeit ist schnell und es eignet sich sehr gut für Enthusiasten der quantitativen Finanzanalyse, um das Datenmanagement lokal zu implementieren, da verschiedene “Objekte” (wie Börsen, Datenquellen, Preise) in verschiedene Tabellen aufgeteilt und Beziehungen definiert werden können zwischen den Tischen. Darüber hinaus müssen Benutzer es nicht separat installieren und konfigurieren, sondern können es direkt durch Aufrufen der Funktion DBExec() verwenden!

Darüber hinaus sind die Lernkosten für die SQLite-Sprache sehr gering und die meiste Arbeit an der Datenbank wird durch SQLite-Anweisungen erledigt. Die meisten Anforderungen lassen sich erfüllen, wenn man mit der grundlegenden Syntax vertraut ist. Nachfolgend finden Sie die grundlegende Syntax von SQLite.

Grundlegende Syntax

Bei der SQLite-Syntax wird die Groß-/Kleinschreibung nicht beachtet. Bei einigen Befehlen, wie beispielsweise „GLOB“ und „glob“, die unterschiedliche Bedeutungen haben, ist dies jedoch der Fall. SQLite-Anweisungen können mit einem beliebigen Schlüsselwort beginnen, beispielsweise SELECT, INSERT, UPDATE, DELETE, ALTER, DROP usw., die jeweils bedeuten: Daten extrahieren, Daten einfügen, Daten aktualisieren, Daten löschen, Datenbank ändern und Datentabelle löschen. Alle Anweisungen enden mit einem Semikolon. Nachfolgend finden Sie eine einfache Beschreibung der Vorgänge zum Erstellen, Hinzufügen, Löschen, Ändern, Abfragen und für andere Datenbanken:

function main() {
    // 创建:如果“users”表不存在就创建一个,“id”是整数且自动增加,“name”是文本形式且不为空
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // 增加:
    Log(DBExec("INSERT INTO users(name) values('张三')"));
    Log(DBExec("INSERT INTO users(name) values('李四')"));
    
    // 删除:
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // 修改
    Log(DBExec("UPDATE users SET name='王五' WHERE id=2"));
    
    // 查询
    Log(DBExec('select 2, ?, ?, ?, ?', 'ok', true,9.8,null));
    Log(DBExec('select * from kvdb'));
    Log(DBExec('select * from cfg'));
    Log(DBExec('select * from log'));
    Log(DBExec('select * from profit'));
    Log(DBExec('select * from chart'));
    Log(DBExec("selEct * from users"));
}

Eine Datenbank enthält normalerweise eine oder mehrere Tabellen. Jede Tabelle hat einen Namen. Es ist zu beachten, dass die vom System reservierten Tabellen folgende sind: kvdb, cfg, log, profit, chart. Das heißt, beim Erstellen einer Tabelle sollten Sie systemreservierte Namen vermeiden. Lassen Sie uns den obigen Code ausführen, der Folgendes ausgibt: Verwenden von SQLite zum Erstellen einer quantitativen Erfinderdatenbank

Strategiebeispiele

Nachdem wir nun die grundlegende Syntax von SQLite kennen, können wir die integrierte Datenbank von InventorQuant verwenden, um ein Beispiel für das Sammeln und Verwenden von Tick-Daten zu erstellen.

Schritt 1: Aktualisieren Sie Ihren Host Stellen Sie zunächst sicher, dass Sie die neueste Version des Hosts verwenden. Wenn Sie den Host bereits heruntergeladen und verwendet haben, müssen Sie ihn zuerst löschen und dann erneut herunterladen und auf https://www.fmz.com/ bereitstellen. m/add-node-Seite.

Schritt 2: Erstellen Sie eine Strategie

function main() {
    // 订阅合约
    _C(exchange.SetContractType, 'swap');
    
    // 创建数据表
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,', 
        'Low FLOAT not NULL,', 
        'Sell FLOAT not NULL,', 
        'Buy FLOAT not NULL,', 
        'Last FLOAT not NULL,', 
        'Volume INTEGER not NULL,', 
        'Time INTEGER not NULL);'
    ));
    
    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // 查询所有数据
    Log(DBExec('select * from tick'));
    
    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));
    
    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));
    
    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

Schritt 3: Führen Sie die Strategie aus Am Beispiel von Windows wird nach dem Ausführen der Richtlinie ein Ordner mit dem Namen der Roboternummer im Verzeichnis „\logs\storage“ des Hostverzeichnisses erstellt. Öffnen Sie den Ordner und es wird eine Datei mit der Endung „.db3“ angezeigt. “ darin. , diese Datei ist die Datei der quantifizierten integrierten Datenbank des Erfinders. Wie in der folgenden Abbildung dargestellt: Verwenden von SQLite zum Erstellen einer quantitativen Erfinderdatenbank Der obige Code erstellt zunächst eine Datentabelle mit dem Namen „Tick“, fügt dann ein Tick-Datenfeld zur Tabelle hinzu, ruft dann in einer Schleife Tick-Daten von der Börse ab und fügt diese Daten in die Datentabelle „Tick“ ein. Wenn die Datenmenge in der Datentabelle den Wert 10 überschreitet, wird die Schleife übersprungen. Abschließend werden fünf SQLite-Befehle zum Abfragen, Löschen und Ändern der Daten in der Datentabelle verwendet. Und drucken Sie es im Protokoll aus, wie in der folgenden Abbildung gezeigt: Verwenden von SQLite zum Erstellen einer quantitativen Erfinderdatenbank Schritt 4: Erstellen Sie die Statusleiste Zum Schluss fügen wir Code hinzu, um eine Statusleiste für die Strategie zu erstellen, indem wir Daten aus der Inventor Quantitative Database abrufen, um die Daten intuitiver anzuzeigen. Der neu hinzugefügte Code lautet wie folgt:

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

Der obige Code erstellt unter Verwendung der Daten in der Datenbank eine „Binance Tick Data“-Tabelle. Das Feld „Spalten“ in der Datenbank stellt die „Zeilen“ in der Statusleiste dar und das Feld „Werte“ stellt die „Spalten“ in der Statusleiste dar. Wie in der folgenden Abbildung dargestellt: Verwenden von SQLite zum Erstellen einer quantitativen Erfinderdatenbank

Vollständiger Strategiecode

/*backtest
start: 2020-07-19 00:00:00
end: 2020-08-17 23:59:00
period: 15m
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"LTC_USDT"}]
*/

function main() {
    Log(DBExec('DROP TABLE tick;'));
    // 订阅合约
    _C(exchange.SetContractType, 'swap');

    // 创建数据表
    DBExec('CREATE TABLE IF NOT EXISTS "tick" (id INTEGER PRIMARY KEY AUTOINCREMENT,'.concat(
        'High FLOAT not NULL,',
        'Low FLOAT not NULL,',
        'Sell FLOAT not NULL,',
        'Buy FLOAT not NULL,',
        'Last FLOAT not NULL,',
        'Volume INTEGER not NULL,',
        'Time INTEGER not NULL);'
    ));

    // 获取10个tick数据
    while (true) {
        let tick = exchange.GetTicker();
        // 在tick表中增加数据
        DBExec(`INSERT INTO tick(High, Low, Sell, Buy, Last, Volume, Time) values(${tick.High}, ${tick.Low}, ${tick.Sell}, ${tick.Buy}, ${tick.Last}, ${tick.Volume}, ${tick.Time})`);
        // 查询所有数据
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // 查询所有数据
    Log(DBExec('select * from tick'));

    // 查询第一个数据
    Log(DBExec('select * from tick limit 1'));

    // 查询前两个数据
    Log(DBExec('select * from tick limit 0,2'));

    // 删除第一个数据
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // 修改第二个数据
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // 查询所有数据
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // 创建状态栏
    let table = {
        type: 'table',
        title: '币安Tick数据',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

Klicken Sie auf diesen Link https://www.fmz.com/strategy/388963, um den vollständigen Strategiecode zu kopieren.

In-Memory-Datenbank

Wenn Sie die Daten nicht dauerhaft auf der Festplatte speichern möchten, können Sie:Symbole können in der Speicherdatenbank bedient werden und die Daten werden nach dem Neustart des Roboters zurückgesetzt

DBExec(":select 1,2,3");

Zusammenfassen

Die Datenbank kann nicht nur riesige Datenmengen speichern, sondern auch die Quantenträume vieler Enthusiasten des quantitativen Handels. Die Verwendung von Datenbanken ist nicht auf die Beispiele in diesem Artikel beschränkt. Weitere Verwendungsmethoden finden Sie im SQLite-Tutorial und in der nachfolgenden Artikelserie von Inventor Quantitative.