1. 引言
随着互联网时代的发展,基金行业已成为金融行业中的重要组成部分。在基金的运营管理过程中,净值管理是最核心也是最重要的部分之一。传统的净值管理方式方式受限于人工干预,效率低,存在一定的风险,并且容易出现错误。因此,基于MSSQL数据库的基金净值智能管理系统应运而生,有望解决传统净值管理中出现的问题。本文着重讨论基金净值智能管理的实现方法以及具体步骤。
2. 基金净值管理的难点
2.1 受人为干扰的管理方式
传统的净值管理方式受限于人工干预,容易生产人为的错误,降低数据的准确性和可靠性。如果净值管理人员出现疏忽或操作不当,就可能会导致净值数值的失误,甚至出现财产损失。
2.2 净值计算较为繁琐
净值计算需要对基金的大量数据进行处理和计算,包括证券交易信息,成本核算信息,资产减值信息以及估价信息等,计算效率也不够高。传统净值计算需要人工干预,易出现失误,难以达到精准的净值计算结果。
3. 基金净值智能管理系统的实现
3.1 MSSQL作为基金数据的存储平台
在数据存储方面,我们可以采用MSSQL数据库作为基金数据的存储平台,该数据库系统具有较高的数据处理能力和高效的数据存储能力,能够满足基金数据管理需要。同时MSSQL数据库还支持事务处理,确保在基金数据计算和更新过程中的数据一致性性与数据完整性。
对于实时数据的采集,可以选用flume+kafka的结构方案完成数据采集。将采集得到的数据,实时导入到MSSQL数据中,形成完整的计算数据集合,有利于后续数据的组织和管理。以下是MSSQL数据库中净值管理表的存储结构样例:
CREATE TABLE [dbo].[t_fund_net](
[ACCTID] [varchar](20) NOT NULL,
[VALUEDATE] [datetime] NOT NULL,
[NAV_UNIT] [float] NULL,
[NAV_ACCUM] [float] NULL,
[ADJ_PREV_NAV_UNIT] [float] NULL,
[ADJ_PREV_NAV_ACCUM] [float] NULL,
[UPDATE_DATE] [datetime] NULL,
[UPDATE_TIME] [time](7) NULL
) ON [PRIMARY]
3.2 基金净值自动计算
基于MSSQL数据库实现基金净值的自动计算需要编写存储过程(Stored Procedures),在SQLServerAgent上定时进行计算。具体的计算过程如下所示:
1. 读取最新的基金持仓信息
2. 计算基金的单位净值、累计净值、每股净资产等
3. 更新数据库中的净值信息
在此基础上,我们还需要设计和实现一个检测程序,自动检测计算结果,如果计算结果不合法,就自动报警,并进行相关数据的回滚处理。以下是插入净值信息的存储过程:
CREATE PROCEDURE dbo.addFundNetValue
@acctid VARCHAR(20),
@valuedate DATETIME,
@nav_unit FLOAT,
@update_date DATETIME,
@update_time TIME(7)
AS
SET NOCOUNT ON
BEGIN TRY
BEGIN TRAN
DECLARE @lastUpdateDate DATETIME
SELECT @lastUpdateDate = MAX(UPDATE_DATE)
FROM t_fund_net
WHERE ACCTID = @acctid
AND VALUEDATE = @valuedate
IF @lastUpdateDate IS NOT NULL
RAISERROR ('净值信息已存在', 16, 1);
ELSE
INSERT INTO t_fund_net(ACCTID, VALUEDATE, NAV_UNIT, UPDATE_DATE, UPDATE_TIME) VALUES (@acctid, @valuedate, @nav_unit, @update_date, @update_time);
COMMIT TRAN;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
DECLARE
@ErrMsg NVARCHAR(4000),
@ErrSeverity INT;
SELECT @ErrMsg = ERROR_MESSAGE(), @ErrSeverity = ERROR_SEVERITY();
RAISERROR (@ErrMsg, @ErrSeverity, 1)
END CATCH
3.3 基金净值数据展示
基于基金净值智能管理系统,我们可以对基金净值进行实时数据展示,方便管理人员进行实时监测。同时也可以在展示界面上添加其他基金信息,如基金的投资组合和风险评估信息等,帮助管理人员进行基金投资决策。以下是基金净值数据展示页面的效果:
CREATE PROCEDURE dbo.getFundNetValue
@acctid VARCHAR(20),
@valuedate DATETIME,
@markets_wide VARCHAR(5)
AS
BEGIN
SELECT
VALUEDATE,
NAV_UNIT
FROM
t_fund_net
WHERE ACCTID = ISNULL(@acctid, ACCTID)
AND VALUEDATE = ISNULL(@valuedate, VALUEDATE)
ORDER BY
VALUEDATE ASC
DECLARE @marketData TABLE (
MARKETNAME VARCHAR(50),
LAST_IDX NUMERIC(18, 9)
)
INSERT INTO @marketData
EXECUTE [dbo].[sp_basic_market_info] @markets_wide
SELECT
cl.ACCTNAME,
fi.FUNDID,
f.TNAME,
SHARES / 1000000 SHARES,
SHARES * f.F_UNITAMT / 1000000 SHRV,
price.LAST_IDX PRICE,
CONVERT(INT, SHARES) * price.LAST_IDX VALUE
FROM
(SELECT ACCOUNTID, COUNT(*) ACCTQTY, SUM(SHARES) SHARES FROM t_client_position WHERE ACCTID = ISNULL(@acctid, ACCTID) GROUP BY ACCOUNTID) cp
JOIN t_client cl
ON cl.ACCOUNTID = cp.ACCOUNTID
JOIN t_fund_account fa
ON fa.CLIENTID = cl.CLIENTID
AND fa.ACCOUNTID = cp.ACCOUNTID
JOIN t_fund_info fi
ON fi.CURRENCYID = fa.CURRENCYID
AND fi.ACCOUNTID = ISNULL(@acctid, fa.ACCOUNTID)
JOIN t_fund f
ON f.FUNDID = fi.FUNDID
JOIN t_macro_ptprice price
ON price.SYMBOL = f.SYMBOL
AND price.PTID = 'AVG'
UNION ALL
SELECT
''
, ''
, marketData.MARKETNAME
, ''
, ''
, marketData.LAST_IDX
, ''
FROM
@marketData marketData
END
4. 总结
基金净值管理对基金公司的运营管理具有重要意义。通过实现基于MSSQL数据库的基金净值智能管理系统,可以解决传统净值管理方式中存在的问题,提高数据的准确性和可靠性,提高工作效率。在管理基金净值的过程中,各种数据采集和数据计算技术都是非常关键的。当然,这一切都建立在一个稳定和可靠的数据存储和管理平台之上。如何建立一个可靠和稳定的数据库体系,并且发挥它的性能,是基金净值智能管理的关键之一。