Sử dụng SQLite để xây dựng cơ sở dữ liệu định lượng nhà phát minh

Tác giả: , Tạo: 2021-03-26 17:09:32, Cập nhật: 2023-09-24 19:36:26

[TOC]

img

Tóm tắt

Dữ liệu là nguồn gốc của giao dịch định lượng, cách quản lý một lượng lớn dữ liệu hiệu quả là một liên kết rất quan trọng, cơ sở dữ liệu là một trong những giải pháp tốt nhất, hiện nay, ứng dụng cơ sở dữ liệu đã được cấu hình tiêu chuẩn định lượng cho các chiến lược như giao dịch trong ngày, giao dịch tần số cao.FMZ.COM) Cơ sở dữ liệu tích hợp, bao gồm: cách tạo bảng dữ liệu, lưu trữ dữ liệu, sửa đổi dữ liệu, xóa dữ liệu, tham khảo dữ liệu và cách áp dụng cho chiến đấu thực tế.

Cách chọn cơ sở dữ liệu

Những người quen thuộc với các nền tảng định lượng nên biết rằng trước đây, chỉ cần lưu dữ liệu để lặp lại cục bộ, bạn chỉ có thể sử dụng hàm _G(), mỗi khi ngừng chính sách, hàm _G() sẽ tự động lưu thông tin cần thiết. Nhưng nếu bạn muốn lưu trữ nhiều dữ liệu định dạng phức tạp hơn, hàm _G() rõ ràng không phù hợp, vì vậy nhiều người đã nghĩ đến việc tự xây dựng cơ sở dữ liệu để giải quyết vấn đề này.

Nói đến việc xây dựng cơ sở dữ liệu của riêng bạn, chắc chắn bạn sẽ nghĩ đến Oracle, MySQL, KDB, OneTick, NoSQL... đây là những ứng dụng cấp doanh nghiệp rất tốt, cả tính năng và hiệu suất đều rất mạnh mẽ. Nhưng cũng phải đối mặt với một số vấn đề: khó khăn trong việc sử dụng, cấu hình phức tạp và bảo trì rắc rối, điều này có một chút cảm giác pháo binh cho các nhà bán lẻ giao dịch định lượng, ngay cả khi người sử dụng chỉ sử dụng một phần nhỏ của các chức năng.

Các nhà phát minh định lượng cơ sở dữ liệu tích hợp

Tiếp theo, chúng ta hãy giới thiệu cơ sở dữ liệu hạng nhẹ được xây dựng theo định lượng của người phát minh, DBExec là một giao diện hệ thống quản lý dữ liệu tương quan được xây dựng theo định lượng của người phát minh, dựa trên SQLite, bản thân nó được viết bằng tiếng C, không chỉ có kích thước nhỏ, sử dụng ít tài nguyên, mà còn nhanh chóng xử lý, rất phù hợp với những người yêu thích phân tích định lượng tài chính để thực hiện quản lý dữ liệu tại địa phương, vì có thể phân chia các đối tượng khác nhau (ví dụ: sàn giao dịch, nguồn dữ liệu, giá cả) thành các bảng khác nhau và xác định mối quan hệ giữa các bảng. Ngoài ra, người dùng không cần cài đặt và cấu hình riêng biệt, chỉ cần gọi hàm DBExec ().

Ngoài ra, chi phí học của ngôn ngữ SQLite là rất thấp, và hầu hết các công việc được thực hiện trên cơ sở dữ liệu được thực hiện bằng các câu lệnh SQLite.

Ngôn ngữ cơ bản

Định nghĩa của SQLite không phân biệt kích thước, nhưng có một số lệnh nhạy cảm với kích thước, chẳng hạn như GLOB và glob đại diện cho ý nghĩa khác nhau. Các câu lệnh SQLite có thể bắt đầu bằng bất kỳ từ khóa nào, chẳng hạn như SELECT, INSERT, UPDATE, DELETE, ALTER, DROP, v.v. Chúng nói: trích xuất dữ liệu, chèn dữ liệu, cập nhật dữ liệu, xóa dữ liệu, sửa đổi cơ sở dữ liệu, xóa bảng dữ liệu.

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

Một cơ sở dữ liệu thường chứa một hoặc nhiều bảng, mỗi bảng có một biểu tượng tên, cần lưu ý là hệ thống lưu giữ bảng riêng biệt: kvdb, cfg, log, profit, chart;; nghĩa là khi tạo bảng, bạn nên tránh tên lưu trữ hệ thống.img

Ví dụ chiến lược

Với kiến thức về ngữ pháp cơ bản của SQLite, chúng tôi đã sử dụng công cụ nóng để tạo ra một ví dụ về việc thu thập và sử dụng dữ liệu Tick.

Bước 1: Cập nhật Trình quản trịTrước tiên, hãy đảm bảo rằng bạn đang sử dụng phiên bản mới nhất của trình quản lý, nếu bạn đã tải về một trình quản lý trước đây, bạn cần phải xóa trước và bạn sẽ phải sử dụng nó sau khi tải về.https://www.fmz.com/m/add-nodeTrang được tải về và triển khai lại.

Bước 2: Xây dựng chiến lược

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

Bước 3: Thực hiện chiến lượcVí dụ như trong Windows, sau khi chạy chính sách, sẽ tạo ra một thư mục được đặt tên bằng số robot trong thư mục \logs\storage của thư mục quản trị viên và mở thư mục này, trong đó có một tập tin với hậu tố .db3 , tập tin mà các nhà phát minh đã định lượng cơ sở dữ liệu tích hợp; hình dưới đây cho thấy:imgMã trên đầu tiên tạo ra một bảng dữ liệu có tên là tick tick, sau đó thêm một trường dữ liệu tick vào bảng, sau đó lấy dữ liệu tick từ sàn giao dịch trong vòng lặp, và chèn dữ liệu đó vào bảng dữ liệu tick tick, đồng thời quyết định số lượng dữ liệu trong bảng dữ liệu vượt quá 10 và thoát khỏi vòng lặp. Cuối cùng, truy vấn, xóa, sửa đổi dữ liệu trong bảng dữ liệu bằng 5 lệnh SQLite. Và in ra trong nhật ký, như hình dưới đây:img Bước 4: Tạo thanh trạng tháiCuối cùng, chúng tôi thêm một số mã để tạo ra một thanh trạng thái cho chính sách bằng cách lấy dữ liệu từ cơ sở dữ liệu định lượng của nhà phát minh để hiển thị dữ liệu một cách trực quan hơn.

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

Mã trên sử dụng dữ liệu trong cơ sở dữ liệu để tạo ra một bảng phím dữ liệu Tick. Trong đó các trường phím columns trong cơ sở dữ liệu đại diện cho các thanh phím trong thanh trạng thái, và các trường phímvalues đại diện cho các thanh phím trong thanh trạng thái.img

Mã chiến lược đầy đủ

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

Nhấp vào liên kếthttps://www.fmz.com/strategy/388963Có thể sao chép toàn bộ mã chính sách.

Cơ sở dữ liệu trong bộ nhớ

Nếu bạn không muốn lưu dữ liệu hoạt động vĩnh viễn vào đĩa, bạn có thể thêm trước câu lệnh SQL:Biểu tượng có thể được vận hành trong bộ nhớ cơ sở dữ liệu, và dữ liệu được đặt lại sau khi robot khởi động lại

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

Tóm lại

Các cơ sở dữ liệu không chỉ có thể chứa một lượng lớn dữ liệu mà còn là giấc mơ rộng rãi của nhiều người yêu thích giao dịch định lượng. Các ví dụ trong bài viết này không giới hạn việc sử dụng cơ sở dữ liệu.


Có liên quan

Thêm nữa

Dianwan99Tuyệt vời. Nhược điểm duy nhất là dữ liệu không thể được ghi lại trong ổ đĩa thực và địa phương.

williamfuCó phải cơ sở dữ liệu không hỗ trợ lặp lại không?

Chúa ơi.Thật tuyệt vời.

Hỗ trợ, bạn có thể thử cơ sở dữ liệu địa phương

Cảm ơn.