avatar of 发明者量化-小小梦 发明者量化-小小梦
tập trung vào tin nhắn riêng tư
4
tập trung vào
1271
Người theo dõi

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

Được tạo ra trong: 2021-03-26 17:09:32, cập nhật trên: 2024-12-05 21:56:39
comments   5
hits   2295

[TOC]

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

bản tóm tắt

Dữ liệu là nguồn của giao dịch định lượng. Làm thế nào để quản lý hiệu quả khối lượng dữ liệu lớn là một mắt xích quan trọng. Cơ sở dữ liệu là một trong những giải pháp tốt nhất. Ngày nay, ứng dụng cơ sở dữ liệu đã trở thành cấu hình chuẩn định lượng cho nhiều giao dịch trong ngày, giao dịch tần suất cao và các chiến lược khác. . Trong bài viết này, chúng ta sẽ tìm hiểu về cơ sở dữ liệu tích hợp của Inventor Quantitative (FMZ.COM), 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 chiếu dữ liệu và cách áp dụng vào thực tế chiến đấu.

Làm thế nào để chọn một cơ sở dữ liệu

Những ai quen thuộc với Inventor Quantitative Platform nên biết rằng trước đó, nếu bạn muốn lưu dữ liệu cục bộ để sử dụng lại, bạn chỉ có thể sử dụng hàm _G(). Mỗi lần bạn dừng chiến lược,_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 dữ liệu được định dạng phức tạp hơn,_Rõ ràng hàm G() không thực sự hữu ích nên nhiều người nghĩ đến việc xây dựng cơ sở dữ liệu riêng để giải quyết vấn đề này.

Khi nói đến cơ sở dữ liệu tự xây dựng, có lẽ mọi người đều nghĩ đến Oracle, MySQL, KDB, OneTick, NoSQL… Đây đều là những ứng dụng tuyệt vời dành cho doanh nghiệp, với các chức năng và hiệu suất rất mạnh mẽ. Tuy nhiên, nó cũng gặp phải một số vấn đề: khó bắt đầu, cấu hình cồng kềnh và bảo trì phiền hà. Đối với các nhà giao dịch định lượng bán lẻ, điều này giống như sử dụng đại bác để giết ruồi. Ngay cả khi họ bắt đầu, họ sẽ chỉ sử dụng một phần nhỏ các chức năng.

Cơ sở dữ liệu tích hợp định lượng của Inventor

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

Ngoài ra, chi phí học ngôn ngữ SQLite rất thấp và hầu hết công việc thực hiện trên cơ sở dữ liệu đều được thực hiện bằng các câu lệnh SQLite. Việc quen thuộc với cú pháp cơ bản có thể đáp ứng hầu hết các nhu cầu. Sau đây là cú pháp cơ bản của SQLite.

Cú pháp cơ bản

Cú pháp SQLite không phân biệt chữ hoa chữ thường, nhưng một số lệnh phân biệt chữ hoa chữ thường, chẳng hạn như GLOB và glob, có ý 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., tương ứng có nghĩa là: 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 và xóa bảng dữ liệu. Mọi câu lệnh đều kết thúc bằng dấu chấm phẩy. Sau đây là thao tác tạo, thêm, xóa, sửa đổi, truy vấn và các thao tác khác của cơ sở dữ liệu đơn giản:

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 tên. Cần lưu ý rằng các bảng được hệ thống dành riêng là: kvdb, cfg, log, profit, chart. Nghĩa là, khi tạo bảng, bạn nên tránh sử dụng tên hệ thống dành riêng. Hãy chạy đoạn mã trên, nó sẽ in ra nội dung sau: Sử dụng SQLite để xây dựng cơ sở dữ liệu định lượng của nhà phát minh

Ví dụ về chiến lược

Bây giờ chúng ta đã biết cú pháp cơ bản của SQLite, chúng ta có thể sử dụng cơ sở dữ liệu tích hợp của InventorQuant để tạo ví dụ về việc thu thập và sử dụng dữ liệu Tick.

Bước 1: Cập nhật máy chủ của bạn Trước tiên, hãy đảm bảo bạn đang sử dụng phiên bản mới nhất của máy chủ. Nếu bạn đã tải xuống và sử dụng máy chủ trước đó, trước tiên bạn cần xóa nó và sau đó tải xuống lại và triển khai nó trên https://www.fmz.com/ trang m/add-node.

Bước 2: Tạo 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: Chạy chiến lược Lấy Windows làm ví dụ, sau khi chạy chính sách, một thư mục có tên theo số robot sẽ được tạo trong thư mục “\logs\storage” của thư mục máy chủ. Mở thư mục và sẽ có một tệp có hậu tố “.db3 “trong đó., tệp này là tệp cơ sở dữ liệu tích hợp được định lượng của nhà phát minh. Như thể hiện trong hình sau: Sử dụng SQLite để xây dựng cơ sở dữ liệu định lượng của nhà phát minh Đoạn mã trên trước tiên tạo một bảng dữ liệu có tên là “tick”, sau đó thêm một trường dữ liệu tick vào bảng, sau đó lấy dữ liệu tick từ trao đổi trong một vòng lặp và chèn dữ liệu này vào bảng dữ liệu “tick”. Nếu lượng dữ liệu trong bảng dữ liệu vượt quá 10, vòng lặp sẽ bị nhảy ra ngoài. Cuối cùng, năm lệnh SQLite được sử dụng để truy vấn, xóa và sửa đổi dữ liệu trong bảng dữ liệu. Và in nó ra trong nhật ký, như thể hiện trong hình sau: Sử dụng SQLite để xây dựng cơ sở dữ liệu định lượng của nhà phát minh Bước 4: Tạo thanh trạng thái Cuối cùng, chúng tôi thêm một số mã để tạo thanh trạng thái cho chiến lược bằng cách lấy dữ liệu từ Cơ sở dữ liệu định lượng Inventor để hiển thị dữ liệu trực quan hơn. Mã mới được thêm vào như sau:

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

Đoạn mã trên tạo ra bảng “Dữ liệu Binance Tick” bằng cách sử dụng dữ liệu trong cơ sở dữ liệu. Trường “cột” trong cơ sở dữ liệu biểu thị “hàng” trên thanh trạng thái và trường “giá trị” biểu thị “cột” trên thanh trạng thái. Như thể hiện trong hình sau: Sử dụng SQLite để xây dựng cơ sở dữ liệu định lượng của nhà phát minh

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ết này https://www.fmz.com/strategy/388963 để sao chép mã chiến lược đầy đủ.

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

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

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

Tóm tắt

Cơ sở dữ liệu không chỉ có thể chứa một lượng dữ liệu khổng lồ mà còn có thể hiện thực hóa giấc mơ lượng tử của nhiều người đam mê giao dịch định lượng. Việc sử dụng cơ sở dữ liệu không chỉ giới hạn ở các ví dụ trong bài viết này. Để biết thêm các phương pháp sử dụng, vui lòng tham khảo hướng dẫn SQLite và loạt bài viết tiếp theo do Inventor Quantitative phát hành.