量化開發期間,每次都擷取券商資料,總是一個麻煩事。是以搭建一個本地的資料庫進行存儲,可以節約很多不必要的性能和資源開銷。一般情況下,建議使用clickhouse資料庫來當做你的資料庫存儲。不過本文章為了快速入門,就以postgresql為例來做資料庫存儲。
本地postgresql我使用的debian系統進行安裝。使用debian的原因:debian的shell操作可以相容更多的Linux系列作業系統,例如Ubuntu系列、華為歐拉系列、麒麟作業系統系列等。
步驟 1: 更新系統
首先,確定你的系統是最新的。打開終端并執行:
sudo apt update sudo apt upgrade
步驟 2: 安裝PostgreSQL
Debian的官方倉庫中包含了PostgreSQL。你可以直接安裝最新的PostgreSQL版本。運作以下指令來安裝:
sudo apt install postgresql
步驟 3: 啟動和啟用服務
安裝完成後,PostgreSQL服務通常會自動啟動。你可以檢查服務狀态:
sudo systemctl status postgresql
如果服務沒有運作,你可以啟動并設定開機啟動:
sudo systemctl start postgresql sudo systemctl enable postgresql
步驟 4: 建立資料庫和使用者
安裝完畢後,你可以開始建立資料庫和使用者。首先,切換到postgres使用者:
sudo -i -u postgres
然後,你可以進入PostgreSQL指令行界面:
psql
在這裡,你可以建立一個新的使用者和資料庫,并授予使用者權限:
CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypassword'; CREATE DATABASE mydb; GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
授予public的權限
-- 給予特定使用者對schema 的使用權限
GRANT USAGE ON SCHEMA my_schema TO your_user;
-- 給予特定使用者對 schema 中所有表的所有權限
GRANT ALL ON ALL TABLES IN SCHEMA my_schema TO your_user;
-- 設定預設權限,以確定将來在 schema 中建立的所有新表都将自動給予特定使用者相應權限
ALTER DEFAULT PRIVILEGES IN SCHEMA my_schema GRANT ALL ON TABLES TO your_user;
退出psql使用\q,然後回到普通使用者使用exit。
步驟 5: 配置遠端通路
如果你需要遠端連接配接到你的PostgreSQL資料庫,你需要修改postgresql.conf和pg_hba.conf檔案。這些檔案通常位于/etc/postgresql/版本/main/目錄中。
【備注】我目前最新版本是15版本,如果以後你們下載下傳的可能不是15版本,請根據實際版本進行配置。例如配置預設路徑裡面的15是實際你自己的版本,例如16、17、18等等。
編輯postgresql.conf,設定listen_addresses為'*':
sudo vim /etc/postgresql/15/main/postgresql.conf
在檔案中找到listen_addresses并修改它:
listen_addresses = '*'
改變前:
改變後:
編輯pg_hba.conf,添加或修改規則以允許遠端連接配接:
sudo vim /etc/postgresql/15/main/pg_hba.conf
在合适的位置添加:
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
重新開機PostgreSQL服務使更改生效:
sudo systemctl restart postgresql
然後可以使用一些用戶端工具來連接配接資料庫,例如DataGrip、Navicat、Dbeaver等等都可以。
并且裡面沒有任何表結構等資訊。
實作根據表名稱自動建立指定的表結構。用于存放所有大A的曆史資料。先建立一個實體類,并用來指定表字段名稱,用于統一生成所有股票的表結構。
以及預留三個字段,存儲DIF、DEA、MACD資料
建立一個簡單的幫助類,用于操作資料庫使用。并且執行個體建立以後,預設提供一個擷取sqlsugarscope對象的方法,以及擷取已有表資訊的集合。
最後提供一個建立表結構的方法,用于指定表結構所需要的實體類,以及表名稱。表名稱此處可以以股票代碼為表名稱
對之前擷取股票清單的地方,做一個建立表的操作。此處為了簡單操作,大佬們可以對幫助類做其他拓展,以便于支援依賴注入等。
開始執行,可以看到表結構在持續性建立
展開任意一個表,可以看到字段都被成功建立了。後續這些表就會被用于存儲對應表名稱的股票代碼的所有曆史資料。
執行完畢以後,可以看到總共5361個表。
接下來,在資料庫操作幫助類裡面,新增CRUD有關操作
對擷取曆史資料的操作,做個改造,擷取曆史資料以後也計算DIF、DEA、MACD資料,并一起寫入資料庫:
執行擷取曆史任務job,可以看到刷刷刷的擷取記錄資訊。
打開資料庫表,檢視資料,可以看見資料寫入成功,并且dif、dea、macd資料也都記錄成功。和通達信等app上面的資料也一緻(app顯示的是四舍五入以後的資料)
等待程式執行完畢,整個曆史資料就生成成功了。曆史資料可以用來友善計算你的政策的曆史模拟戰績,形成你的個人财富。
以上隻是抛磚引玉,大家還可以自行儲存分鐘資料、周資料、每個交易日收盤以後自動新增當天資料等進行維護,此處就不一一列舉了。
資料庫核心操作幫助類,供參考:
public class DatabaseHelper { private DbTableInfo[] _initTables=new DbTableInfo[0]; private SqlSugarScope _sqlScope = ; public DatabaseHelper() { _sqlScope = GetDbScope(); GetTableList(_sqlScope); } /// <summary> /// 傳回表名稱 /// </summary> /// <returns></returns> public string[] GetStockTableNames() { return _initTables.Select(x => x.Name).ToArray(); } private SqlSugarScope GetDbScope() { var db = new SqlSugarScope(new ConnectionConfig() { ConnectionString = "Host=ip;Port=port;Username=username;Password=pwd;Database=dbname;", DbType = DbType.PostgreSQL, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute }); return db; } /// <summary> /// 擷取已有的資料庫表 /// </summary> /// <param name="db"></param> /// <param name="tableName"></param> /// <returns></returns> private void GetTableList(SqlSugarScope db) { _initTables = db.DbMaintenance.GetTableInfoList(false).ToArray(); } public void CreateTableWithCustomName<T>(string tableName) { try { if (!_initTables.Any(x => x.Name == tableName)) { _sqlScope.MappingTables.Add(typeof(T).Name, tableName); // 通過動态指定表名來初始化或遷移表結構 _sqlScope.CodeFirst.InitTables<T>(); // 解除映射 _sqlScope.MappingTables.Remove(new MappingTable() { EntityName = typeof(T).Name }); } else { Debug.WriteLine($"Table '{tableName}' already exists.");