SQLite を使って FMZ 量子データベースを構成する

作者: リン・ハーンニナバダス作成日:2022-04-24 11:32:35 更新日:2022-04-24 16:21:38 更新日:2022-04-24 更新日:2022-04-24 更新日:2021-04-24 更新日:2022-04-24 更新日:2021-04-24 更新日:2022-04-24 更新日:2022-04-24 更新日:2021-04-24 更新日:2022-04-24 更新日:2022-04-24 更新日:2021-04-24 更新日:2022-04-24 更新日:2022-04-24 更新日:2022-04-24 更新日:2021-04-28 更新日:2021-04-24 更新日:2022-04-24 更新日:2020-04-24 更新日:2021-01-21

SQLite を使って FMZ 量子データベースを構成する [TOC]

抽象

データは定量取引の源である.大量のデータを効率的に管理することは非常に重要です.データベースは最良のソリューションの1つです.現在,データベースの適用は,さまざまな日取引,高周波取引,その他の戦略の標準的な定量構成となっています.この記事では,FMZ Quantの組み込みデータベースを研究します (FMZ.COM) において,データテーブルを作成し,データを保存し,データを修正し,データを削除し,参照データをどのように使用するか,また,それを実践する方法を説明します.

データベースを選択する方法

FMZ Quant Trading Platformをよく知っている人は,以前は,データを再利用するためにローカルに保存したい場合は, _G() 関数のみを使用することが知っていました. 戦略を停止するたびに, _G() 関数は自動的に必要な情報を保存します. しかし,より複雑なフォーマットされたデータを保存したい場合は, _G() 関数は明らかに不適切です. そのため,多くの人が問題を解決するために独自のデータベースを構築することを考えています.

自己構築データベースに関しては,誰もがOracle,MySQL,KDB,OneTick,NoSQLなどについて考えることができます. これらは機能とパフォーマンスの両方において優れたエンタープライズレベルのアプリケーションです. しかし,いくつかの問題もあります. 開始は困難で,設定と保守は困難です. 定量取引の小売投資家にとって,それは車輪上のハエを壊すようなものです. すでにこれらのアプリケーションを開始したとしても,それらの機能のほんの一部しか使用されません.

FMZ 量子内蔵データベース

次に,FMZ Quantの内蔵軽量データベースを学びましょう.DBExecは,FMZ Quantに組み込まれたリレーショナルデータ管理システムインターフェイスです.SQLiteをベースに開発され,Cで書かれています.サイズが小さく,リソースの占用が少ないだけでなく,処理速度も非常に速いです.金融量学分析の愛好家にとってデータ管理をローカルに実装するのに非常に適しています.それは異なるObject (プラットフォーム,データソース,価格など) を異なるテーブルに分割し,テーブル間の関係を定義できます.また,ユーザーは個別にインストールして設定する必要はありません.DBExecの関数を呼び出す限り,直接使用できます!

また,SQLite 言語の学習コストは非常に低く,データベース上の作業の大半は SQLite 文言によって行われます.基本的な文法を知ることでほとんどのニーズを満たすことができます.以下は SQLite の基本的な文法です.

基本文法

SQLiteの構文は小文字不敏感だが,GLOBやglobのようないくつかのコマンドは小文字不敏感で,それぞれ異なる意味を持つ.SQLiteのステートメントは,SELECT,INSERT,UPDATE,DELETE,ALTER,DROPなど,任意のキーワードで開始できる.これはそれぞれ:データ抽出,データ挿入,データ更新,データ削除,データベースを変更,データテーブルを削除することを意味する.すべてのステートメントはセミコロンで終了する.以下の操作は,単純なデータベースの作成,追加,削除,修正,クエリなどの操作である:

function main() {
    // create: if the table of "users" do not exist, create one; "id" is integer and increases automatically; "name" is in form of text and not null 
    Log(DBExec('CREATE TABLE IF NOT EXISTS "users" (id INTEGER PRIMARY KEY AUTOINCREMENT, name text not NULL);'));
    
    // add: 
    Log(DBExec("INSERT INTO users(name) values('A')"));
    Log(DBExec("INSERT INTO users(name) values('B')"));
    
    // delete: 
    Log(DBExec("DELETE FROM users WHERE id=1;"));
    
    // modify:
    Log(DBExec("UPDATE users SET name='C' WHERE id=2"));
    
    // query:
    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"));
}

データベースは通常,1つ以上のテーブルを含み,各テーブルには名前識別があります.システム予約されたテーブルは: kvdb, cfg, log, profit, chart です.つまり,テーブルを作成するときに,システム予約された名前を避けるべきです.上記のコードを実行します.img

戦略の例

SQLiteの基本的な構文を知った後,鉄が熱いままに攻撃しよう. FMZ Quant の量的な内蔵データベースを使用して,Tick データ収集と使用のインスタンスを作成しよう.

ステップ1: ドッカー更新先ず,Docker の最新バージョンを使用していることを確認してください.Docker をダウンロードして使用した場合は,まず削除し,ページにダウンロードして再展開する必要があります (https://www.fmz.com/m/add-node).

ステップ2: 戦略を策定する

function main() {
    // set contract 
    _C(exchange.SetContractType, 'swap');
    
    // create the data table 
    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);'
    ));
    
    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table 
        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})`);
        // query all data
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }
    
    // query all data 
    Log(DBExec('select * from tick'));
    
    // query the first data 
    Log(DBExec('select * from tick limit 1'));
    
    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));
    
    // delete the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));
    
    // modify the second data 
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));
    
    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);
}

ステップ3: 戦略を実行するWindows を例に挙げましょう. 戦略を実行した後,ボット ID と呼ばれるフォルダがドッカーディレクトリの辞書 \logs\storage で生成されます. フォルダを開くと,後尾として .db3 とのファイルが表示されます. このファイルは FMZ Quant の内蔵データベースのファイルです. 次の図のように:img

上記のコードは,まず,tickというデータテーブルを作成し,その後,テーブルに tick データフィールドを追加し,その後,ループ内のプラットフォームから tick データを取得し,このデータをtick データテーブルに挿入し,同時に,データテーブル内のデータの量が10を超えると判断された場合,ループから飛び出します.最後に,SQLite コマンド5つを使用して,データテーブル内のデータをクエリ,削除,修正します.そして,次の画像のようにログにプリントします:img

ステップ4: 状態バーを作成FMZ Quant データベースからデータを取得して,データをより直感的に表示することで,戦略のステータスバーを作成するコードを追加します.新しいコードは以下のとおりです:

    // create a status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');

上記のコードは,データベース内のデータからBinance Tick Dataテーブルを作成します.データベース内のkolumnsフィールドは,ステータスバーの水平列を表し,valuesフィールドはステータスバーの垂直列を表します.以下のように:img

戦略の完全なソースコード

/*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;'));
    // set contract 
    _C(exchange.SetContractType, 'swap');

    // establish the data table 
    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);'
    ));

    // obtain 10 tick data 
    while (true) {
        let tick = exchange.GetTicker();
        // add data in the tick table
        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})`);
        // query all data 
        let allDate = DBExec('select * from tick');
        if (allDate.values.length > 10) {
            break;
        }
        Sleep(1000);
    }

    // query all data 
    Log(DBExec('select * from tick'));

    // query the first data 
    Log(DBExec('select * from tick limit 1'));

    // query the first two data 
    Log(DBExec('select * from tick limit 0,2'));

    // delet the first data 
    Log(DBExec('DELETE FROM tick WHERE id=1;'));

    // modify the second data
    Log(DBExec('UPDATE tick SET High=10000 WHERE id=2'));

    // query all data 
    let allDate = DBExec('select * from tick')
    Log(allDate);

    // create the status bar 
    let table = {
        type: 'table',
        title: 'Binance Tick data',
        cols: allDate.columns,
        rows: allDate.values
    }
    LogStatus('`' + JSON.stringify(table) + '`');
}

リンクをクリックします:https://www.fmz.com/strategy/265906完全なソースコードをコピーできます.

インメモリ データベース

永久にディスクに保存したくない場合は,追加することができます:ボットが再起動したらデータがリセットされます.

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

結論

データベースは膨大なデータを運ぶだけでなく,多くの定量的な取引愛好家の夢も運ぶことができます.データベースの使用は,記事で言及された例に限られることはありません.より多くの使用方法については,SQLiteチュートリアルとFMZ Quantに後に投稿される一連の記事を参照できます.


もっと