天天看點

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

量化開發期間,每次都擷取券商資料,總是一個麻煩事。是以搭建一個本地的資料庫進行存儲,可以節約很多不必要的性能和資源開銷。一般情況下,建議使用clickhouse資料庫來當做你的資料庫存儲。不過本文章為了快速入門,就以postgresql為例來做資料庫存儲。

本地postgresql我使用的debian系統進行安裝。使用debian的原因:debian的shell操作可以相容更多的Linux系列作業系統,例如Ubuntu系列、華為歐拉系列、麒麟作業系統系列等。

步驟 1: 更新系統

首先,確定你的系統是最新的。打開終端并執行:

sudo apt update              sudo apt upgrade           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

步驟 2: 安裝PostgreSQL

Debian的官方倉庫中包含了PostgreSQL。你可以直接安裝最新的PostgreSQL版本。運作以下指令來安裝:

sudo apt install postgresql           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

步驟 3: 啟動和啟用服務

安裝完成後,PostgreSQL服務通常會自動啟動。你可以檢查服務狀态:

sudo systemctl status postgresql           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

如果服務沒有運作,你可以啟動并設定開機啟動:

sudo systemctl start postgresql              sudo systemctl enable postgresql           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

步驟 4: 建立資料庫和使用者

安裝完畢後,你可以開始建立資料庫和使用者。首先,切換到postgres使用者:

sudo -i -u postgres           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

然後,你可以進入PostgreSQL指令行界面:

psql

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

在這裡,你可以建立一個新的使用者和資料庫,并授予使用者權限:

CREATE USER myuser WITH ENCRYPTED PASSWORD 'mypassword';              CREATE DATABASE mydb;              GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

授予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;           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

退出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 = '*'           

改變前:

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

改變後:

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

編輯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           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

重新開機PostgreSQL服務使更改生效:

sudo systemctl restart postgresql           
C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

然後可以使用一些用戶端工具來連接配接資料庫,例如DataGrip、Navicat、Dbeaver等等都可以。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

并且裡面沒有任何表結構等資訊。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

實作根據表名稱自動建立指定的表結構。用于存放所有大A的曆史資料。先建立一個實體類,并用來指定表字段名稱,用于統一生成所有股票的表結構。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

以及預留三個字段,存儲DIF、DEA、MACD資料

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

建立一個簡單的幫助類,用于操作資料庫使用。并且執行個體建立以後,預設提供一個擷取sqlsugarscope對象的方法,以及擷取已有表資訊的集合。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

最後提供一個建立表結構的方法,用于指定表結構所需要的實體類,以及表名稱。表名稱此處可以以股票代碼為表名稱

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

對之前擷取股票清單的地方,做一個建立表的操作。此處為了簡單操作,大佬們可以對幫助類做其他拓展,以便于支援依賴注入等。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

開始執行,可以看到表結構在持續性建立

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

展開任意一個表,可以看到字段都被成功建立了。後續這些表就會被用于存儲對應表名稱的股票代碼的所有曆史資料。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

執行完畢以後,可以看到總共5361個表。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

接下來,在資料庫操作幫助類裡面,新增CRUD有關操作

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

對擷取曆史資料的操作,做個改造,擷取曆史資料以後也計算DIF、DEA、MACD資料,并一起寫入資料庫:

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

執行擷取曆史任務job,可以看到刷刷刷的擷取記錄資訊。

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

打開資料庫表,檢視資料,可以看見資料寫入成功,并且dif、dea、macd資料也都記錄成功。和通達信等app上面的資料也一緻(app顯示的是四舍五入以後的資料)

C#/.NET量化開發實作财富自由【5】搭建屬于你自己的A谷資料庫

等待程式執行完畢,整個曆史資料就生成成功了。曆史資料可以用來友善計算你的政策的曆史模拟戰績,形成你的個人财富。

以上隻是抛磚引玉,大家還可以自行儲存分鐘資料、周資料、每個交易日收盤以後自動新增當天資料等進行維護,此處就不一一列舉了。

資料庫核心操作幫助類,供參考:

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

繼續閱讀