Utilisation de SQLite pour créer une base de données quantitative d'inventeurs

Créé le: 2021-03-26 17:09:32, Mis à jour le: 2024-12-05 21:56:39
comments   5
hits   1771

[TOC]

Utilisation de SQLite pour créer une base de données quantitative d’inventeurs

résumé

Les données sont la source du trading quantitatif. La gestion efficace de grandes quantités de données est un élément essentiel. La base de données est l’une des meilleures solutions. De nos jours, l’application de la base de données est devenue une configuration standard quantitative pour divers trading intraday, trading haute fréquence et d’autres stratégies. . Dans cet article, nous étudierons la base de données intégrée d’Inventor Quantitative (FMZ.COM), notamment : comment créer des tables de données, stocker des données, modifier des données, supprimer des données, référencer des données et comment les appliquer en combat réel.

Comment choisir une base de données

Ceux qui connaissent la plateforme quantitative Inventor doivent savoir qu’avant cela, si vous souhaitez enregistrer des données localement pour les réutiliser, vous ne pouvez utiliser que la fonction _G(). Chaque fois que vous arrêtez la stratégie,_La fonction G() enregistrera automatiquement les informations requises. Mais si vous souhaitez enregistrer des données formatées plus complexes,_La fonction G() n’est évidemment pas très applicable, donc de nombreuses personnes ont pensé à créer leur propre base de données pour résoudre ce problème.

Quand il s’agit de bases de données auto-construites, tout le monde pense probablement à Oracle, MySQL, KDB, OneTick, NoSQL… Ce sont toutes d’excellentes applications de niveau entreprise, avec des fonctions et des performances très puissantes. Cependant, il est également confronté à plusieurs problèmes : il est difficile de le démarrer, la configuration est lourde et la maintenance est pénible. Pour les traders quantitatifs de détail, c’est un peu comme utiliser un canon pour tuer une mouche. Même s’ils commencent, ils vont devoir n’utilisez qu’une petite partie des fonctions.

Base de données quantitative intégrée Inventor

Ensuite, examinons la base de données légère intégrée à InventorQuant. DBExec est une interface de système de gestion de données relationnelles intégrée à InventorQuant. Elle est développée sur la base de SQLite et est écrite en C. Elle est non seulement de petite taille et consomme peu de ressources , mais aussi La vitesse de traitement est rapide et il est très adapté aux passionnés d’analyse quantitative financière pour mettre en œuvre la gestion des données localement, car différents « objets » (tels que les échanges, les sources de données, les prix) peuvent être divisés en différentes tables et des relations peuvent être définies entre les tables. De plus, les utilisateurs n’ont pas besoin de l’installer et de le configurer séparément, ils peuvent l’utiliser directement en appelant la fonction DBExec() !

De plus, le coût d’apprentissage du langage SQLite est très faible et la plupart du travail effectué sur la base de données est effectué par des instructions SQLite. La connaissance de la syntaxe de base peut répondre à la plupart des besoins. Voici la syntaxe de base de SQLite.

Syntaxe de base

La syntaxe SQLite n’est pas sensible à la casse, mais certaines commandes le sont, telles que GLOB et glob, qui ont des significations différentes. Les instructions SQLite peuvent commencer par n’importe quel mot-clé, tel que SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, etc., qui signifient respectivement : extraire des données, insérer des données, mettre à jour des données, supprimer des données, modifier la base de données et supprimer la table de données. Toutes les déclarations se terminent par un point-virgule. Voici une simple création, ajout, suppression, modification, requête et autres opérations de base de données :

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"));
}

Une base de données contient généralement une ou plusieurs tables. Chaque table porte un nom. Il convient de noter que les tables réservées au système sont : kvdb, cfg, log, profit, chart. Autrement dit, lors de la création d’une table, vous devez éviter les noms réservés au système. Exécutons le code ci-dessus, qui imprimera ce qui suit : Utilisation de SQLite pour créer une base de données quantitative d’inventeurs

Exemples de stratégie

Maintenant que nous connaissons la syntaxe de base de SQLite, nous pouvons utiliser la base de données intégrée d’InventorQuant pour créer un exemple de collecte et d’utilisation des données Tick.

Étape 1 : Mettez à jour votre hébergeur Tout d’abord, assurez-vous que vous utilisez la dernière version de l’hôte. Si vous avez déjà téléchargé et utilisé l’hôte, vous devez d’abord le supprimer, puis le télécharger à nouveau et le déployer sur https://www.fmz.com/ page m/ajouter-node.

Étape 2 : Créer une stratégie

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);
}

Étape 3 : Exécuter la stratégie En prenant Windows comme exemple, après avoir exécuté la politique, un dossier nommé d’après le numéro du robot sera généré dans le répertoire « \logs\storage » du répertoire hôte. Ouvrez le dossier et vous verrez un fichier avec le suffixe « .db3 » “ dans celui-ci. , ce fichier est le fichier de la base de données intégrée quantifiée de l’inventeur. Comme le montre la figure suivante : Utilisation de SQLite pour créer une base de données quantitative d’inventeurs Le code ci-dessus crée d’abord une table de données nommée « tick », puis ajoute un champ de données de tick à la table, puis obtient les données de tick de l’échange dans une boucle et insère ces données dans la table de données « tick ». Si la quantité de données dans le tableau de données dépasse 10, la boucle sera sautée. Enfin, cinq commandes SQLite sont utilisées pour interroger, supprimer et modifier les données de la table de données. Et imprimez-le dans le journal, comme indiqué dans la figure suivante : Utilisation de SQLite pour créer une base de données quantitative d’inventeurs Étape 4 : Créer la barre d’état Enfin, nous ajoutons du code pour créer une barre d’état pour la stratégie en obtenant des données de la base de données quantitative Inventor afin d’afficher les données de manière plus intuitive. Le code nouvellement ajouté est le suivant :

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

Le code ci-dessus crée une table « Binance Tick Data » en utilisant les données de la base de données. Le champ « colonnes » de la base de données représente les « lignes » dans la barre d’état, et le champ « valeurs » représente les « colonnes » dans la barre d’état. Comme le montre la figure suivante : Utilisation de SQLite pour créer une base de données quantitative d’inventeurs

Code de stratégie complet

/*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) + '`');
}

Cliquez sur ce lien https://www.fmz.com/strategy/388963 pour copier le code de stratégie complet.

Base de données en mémoire

Si vous ne souhaitez pas enregistrer les données de manière permanente sur le disque, vous pouvez ajouter:Les symboles peuvent être exploités dans la base de données mémoire et les données sont réinitialisées après le redémarrage du robot

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

Résumer

La base de données peut non seulement contenir des quantités massives de données, mais également porter les rêves quantitatifs de nombreux passionnés de trading quantitatif. L’utilisation des bases de données ne se limite pas aux exemples de cet article. Pour plus de méthodes d’utilisation, veuillez vous référer au didacticiel SQLite et à la série d’articles ultérieure publiée par Inventor Quantitative.