発明者 定量化データベース 実戦

作者: リン・ハーン小さな夢開催日:2022年11月4日 19:12:34
タグ:

"つ目 概要

データは取引の量化源であり,大量のデータを効率的に管理する方法は非常に重要な要素であり,データベースは最高のソリューションの1つであり,現在,データベースの適用は,日中取引,高周波取引などの戦略の量化標準配置となっています.この記事では,発明者の量化について調べます.FMZ.COM) のデータベースが組み込まれています. このデータベースには,表を作成,データを保存,データを修正,データを削除,参照データ,および実戦での応用などが含まれています.

2 データベースの選び方

量化プラットフォームに慣れている発明者は,以前は,データをローカルリプティブルに保存しようとすると,_G() 関数のみを使用することが可能であり,ポリシーを停止するたびに,_G() 関数は自動的に必要な情報を保存する.しかし,より多くの複雑なフォーマットデータを保存したい場合は,_G() 関数は明らかにあまり適用されないので,多くの人々が自社データベースを構築することを考えました.

自作データベースの話題になると,Oracle,MySQL,KDB,OneTick,NoSQLなど,非常に優れたエンタープライズレベルのアプリケーションが考えられるでしょう. これらは機能や性能の両方において非常に強力です. しかし,いくつかの問題もあります. 操作が困難で,配置が繁忙で,維持が面倒です.

3 発明者による内蔵データベースの量化

次は,発明者による量化内蔵の軽量型データベース,DBExecを紹介します.DBExecは,発明者による量化内蔵のリレーショナルデータ管理システムインターフェースであり,SQLiteをベースに開発され,Cで書かれています. サイズが小さく,リソースが少なく,処理が速いだけでなく,金融量化分析を好む人々のために,データ管理を現地で実現するのに最適です. 異なるキットオブジェクトキット (例えば,取引所,データソース,価格) を異なるテーブルに分割し,テーブル間の関係を定義できます. さらに,ユーザーが個別にインストールして設定する必要はありません.

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

4 基本文法

SQLiteの語法では,文字のサイズが区別されないが,GLOBとglobのような文字のサイズに敏感な命令がある. SQLiteの文言は,SELECT,INSERT,UPDATE,DELETE,ALTER,DROPなどの任意のキーワードで開始できます.これらはそれぞれ:データ抽出,データ挿入,データ更新,データ削除,データベース修正,データ表削除などを表します.すべての文言は英語分数で終了します. 以下は,データベースを作成,追加,削除,閲覧などの簡単な操作です:

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

データベースは通常,1つまたは複数のテーブルを含んでおり,各テーブルには名前標識があります.注意すべきは,システム保存表のそれぞれである: kvdb, cfg, log, profit, chart です.つまり,テーブルを作成するときにシステム保存名を避けるべきです.上記のコードを実行して,以下のものを出力します:img

5. 戦略例

SQLiteの基本的な語法を知って,我々は発明者の構築されたデータベースを量化するために熱い鉄で利用し,Tickのデータを収集し,使用するインスタンスを作成しました.

ステップ1:管理者を更新まず,最新バージョンのホストを使用していることを確認します.https://www.fmz.cn/m/add-nodeページをダウンロードして再展開します.

2つ目のステップ: 戦略を作成する

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

3つ目:戦略を実行するWindowsの例では,実行後,管理者のディレクトリにある\logs\storageのディレクトリで,ロボット番号で命名されたフォルダを生成し,そのフォルダを開く.そのフォルダには,.db3のが後記されているファイルがあり,このファイルは発明者の内蔵データベースを量化するファイルです.以下の図で示されています:img上記のコードは,まず,と呼ばれるデータテーブルを作成し,そのテーブルに点データフィールドを追加し,その後,ループで取引所から点データを取得し,そのデータをデータテーブルに挿入し,そのデータ表のデータが10個以上であると判断すると,ループを飛び出す.最後に,5つのSQLiteコマンドでデータ表のデータを検索,削除,修正する.そしてログに印刷し,次の図のように示します:img ステップ4:ステータスバーを作成最後に,発明者のデータベースからデータを量化して,ステータスバーを作成し,データをより直感的に表示するコードを追加しました.

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

上記のコードは,データベース内のデータを使って,Tick のデータシートを作成します. データベース内の columns の欄は,状態欄の行列を,values の欄は,状態欄の列を代表します.img

6 戦略の完全なコード

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

このリンクをクリックしてくださいhttps://www.fmz.com/strategy/388963策略コードをコピーすることもできます.

7 概要

データベースは大量のデータだけでなく,多くの量化取引愛好家の夢にもなる. データベースの使用は,この記事の例に限らず,より多くの使用方法については,SQLiteのチュートリアルと,発明者の量化後の一連の記事を参照することができます.


/*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() {
    // 订阅合约
    _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) + '`');
}

もっと

zyc1997 についてPythonのバージョンはありますか?

小さな夢Python の関数への呼び出しと同じです.