06 版系统算法维护手册
目录
1 前言
本文档用于介绍 06 版柜台交易系统的一些主要算法的说明和举例,提供工
程、维护人员、证券公司信息技术人员实际应用中作为参考。
2 成本价和盈亏额算法
算法相关表的主要字段说明
1)股票表算法相关字段说明(stock)
字段名 字段含义
STOCK_CODE 股票代码
CURRENT_AMOUNT 当前数量
……
SUM_BUY_AMOUNT 累计买入数量
SUM_BUY_BALANCE 累计买入金额
SUM_SELL_AMOUNT 累计卖出数量
SUM_SELL_BALANCE 累计卖出金额
COST_PRICE 成本价
2)股票变动表算法相关字段说明(stockreal)
字段名 字段含义
STOCK_CODE 股票代码
……
ENTRUST_SELL_AMOUNT 委托卖出数量
REAL_BUY_AMOUNT 回报买入数量
REAL_SELL_AMOUNT 回报卖出数量
REAL_BUY_BALANCE 回报买入金额
REAL_SELL_BALANCE 回报卖出金额
成本和赢亏说明
成本价的算法目前共有三种,分别为买入均价、持仓成本、保本价,有关成本价的一些知识
说明如下:
1、 成本价计算模式支持到个人,即每个客户都可以通过“资金-帐户修改-资产帐户修改”
对成本价计算模式进行设置和调整(_flag)。如果客户的成本价类型
(profit_flag)为空,则取系统的成本价类型,即 1002 开关设置的值。
2、 后台每条股份记录( stock)都具有四个字段: sum_buy_amount 累计买入数量、
sum_buy_balance 累计买入金额、sum_sell_amount 累计卖出数量、sum_sell_balance 累
计卖出金额。这四个字段对于计算累计买卖后的成本价和盈亏金额非常有用,通常在日
终清算时对这四个字段进行相关处理。
3、 当日发生交易,产生股份变动记录(stockreal),也具有四个字段:real_buy_amount 成
交 买 入 数 量 、 real_buy_balance 成 交 买 入 金 额 、 real_sell_amount 成 交 卖 出 数 量 、
real_sell_balance 成交卖出金额。这四个字段对于计算当日买卖后的成本价和盈亏金额
非常有用,通常在回报成交时对这四个字段进行相关处理。
4、 每天股份记录同时还有一个成本价字段 cost_price,是日终清算时自动根据买入均价计
算得到的,对于成本类型为 0 的客户,成本价直接取自该字段。
5、 系统后台本身不记录股份盈亏金额,查询的时候通过同一个算法(不论当前客户是哪种
成本价计算模式)计算出股份盈亏金额 income_balance。
6、 当费用比率通过前台程序进行进行修改时,as 上缓存的费用(支持设置在内存数据库的
那些表)会自动进行同步,不需要重启 AS。目前基准费用设置需要重启 AS。
7、 3107 开关设置的多冻结的值,会对计算当天买入卖出的费用计算和盈亏中的费用部分产
生一定的但较小的影响。
成本价算法
类型 0 买入均价
成本价由日终来计算,白天实时成交买入和卖出不影响成本价,不考虑卖出费用;
在 200708 的基线包前,cost_price 包含了买入费用,以后不再包含买入费用。
【公 式】
后台
成本价 日终后处理时对成本价字段进行自动设置。
前台显示
成本价 = 后台股票表的成本价
cost_price=_price
类型 1 持仓成本
成本价实时计算,考虑白天实时成交买入,但不考虑白天实时成交卖出;该成本价包含了买
入费用,但不考虑卖出费用。
【公 式】
后台
成本价 日终后处理时对成本价相关字段进行自动设置。
前台显示
成本价 =(累计买入金额+回报买入金额)/(累计买入数量+回报买入数量)
=(sum_buy_balance + real_buy_balance) / (sum_buy_amount+
real_buy_amount)
类型 2 保本价
成本价实时计算,考虑白天实时成交买入和卖出,所以白天买入卖出均影响成本价,同时该
成本价包含了买入卖出费用;且采用步进算法,计算时步长以 1 厘为单位。
【公 式】
后台
成本价 日终后处理时对成本价相关字段进行自动设置。
前台显示
1) 成本价需要分步进行步进计算,首先得到一个不包含卖出费用的成本价的起始值
cost_price
= (累计买入金额+回报买入金额-累计卖出金额-回报卖出金额)
/ (累计买入数量+回报买入数量-累计卖出数量-回报卖出数量)
=(sum_buy_balance+real_buy_balance-sum_sell_balance-real_sell_balance)/
(sum_buy_amount+real_buy_amount-sum_sell_amount- real_sell_amount);
2)计算卖出费用 temp_fare,需根据 4125 配置不同进行计算
4125=1,则为估算方式,费用比例取 4126 设置
temp_fare = (current_amount + real_buy_amount - real_sell_amount) * last_price *
* 4126 的配置值
cost_price=(sum_buy_balance+real_buy_balance-sum_sell_balance-real_sell_balance)/(1-
*4126 的 配 置 值 )/(current_amount+real_buy_amount-
real_sell_amount)
4125=2,则为预算方式,费用比例取自后台设置的标准费用类别计算得到
temp_fare。
4125=0,则为实算方式,费用比例取自后台设置的客户实际费用类别计算得到 temp_fare。
3)按步长单位进行计算
如 果 temp_mis= ( current_amount + real_buy_amount - real_sell_amount ) *
cost_price-(sum_buy_balance+real_buy_balance-sum_sell_balance-real_sell_balance)-
temp_fare < 0
则按成本价步长 1 厘进行逼近计算,直到 temp_mis>= ,计算结束,
此时 cost_price 即为保本价。
盈亏算法
无论选择何种成本价类型,盈亏算法一样,区别在于卖出费用计算部分(针对不同的 4125
设置),其中标准券 888886 和 200000 不计盈亏:
盈亏金额 = 证券市值-累计买入金额-回报买入金额+累计卖出金额+回报卖出金额-卖
出费用
=market_value-(sum_buy_balance+real_buy_balance-sum_sell_balance
-real_sell_balance) –temp_fare
其中 temp_fare 的计算按 price 表的最新价(last_price)计算且依赖于开关 4125:
开关 4125 为 2, 卖出费用进行预算,则按标准费用类别(bfare0)计算后台计算得到
temp_fare
开关 4125=0,或 1 则为实算方式,费用比例取自后台设置的客户实际费用类别计算
得到 temp_fare。
成本赢亏的举例
1) 某个客户某天买入 000008,10000 股,成交价格 10 元,假设客户对应费用类别的费用
比例为 ,预算费用比例 4126 设置为 ,标准费用比例为 (此费用不是
9999 的费用),目前行情最新价已为 11 元,则白天成交后,后台 stock 和 stockreal 表中
和成本盈亏相关的字段情况。
白天成交后的 stock 和 stockreal 表中和成本盈亏相关的字段情况如下:
Stock:
Current_amo Sum_buy_bala Sum_buy_amo Sum_sell_amo Sum_sell_bala Cost_pri
unt nce unt unt nce ce
0 0 0 0 0 0
Stockreal:
Real_buy_balance real_buy_amount real_sell_amount real_sell_balance
100400 10000 0 0
则选择不同成本类型时的成本价如下:
0 成交均价:成本价=cost_price= 0
1 持 仓 成 本 : 成 本 价 = ( sum_buy_balance + real_buy_balance) / (sum_buy_amount+
real_buy_amount)=100400/10000=
2 保本价:
4125=1
则 成 本 价 =
(sum_buy_balance+real_buy_balance-sum_sell_balance-real_sell_balance)/()/(cu
rrent_amount+real_buy_amount- real_sell_amount)=100400/()/10000=
4125=2 ,成本价在初始的 基础上,按步长进行步进计算,直到 temp_mis=
( current_amount + real_buy_amount - real_sell_amount ) *
cost_price-(sum_buy_balance+real_buy_balance-sum_sell_balance-real_s
ell_balance)- temp_fare =10000×成本价-100400-110000×》=
0 为止,得到成本价=
盈亏:=market_value-(sum_buy_balance+real_buy_balance-sum_sell_balance
-real_sell_balance) –temp_fare
4125=2, 盈亏=10000×11-100400-10000×11× =8940
4125=0 或 1, 盈亏=10000×11-100400 -10000×11×=9160
日终清算后的 stock 和 stockreal 表中和成本盈亏相关的字段情况如下:
Stock:
Current_amo
unt
Sum_buy_bala
nce
Sum_buy_amo
unt
Sum_sell_amo
unt
Sum_sell_bala
nce
Cost_pri
ce
10000 100400 10000 0 0 10
Stockreal:
Real_buy_balance real_buy_amount real_sell_amount real_sell_balance
0 0 0 0
0 成交均价:成本价=cost_price= 10
1 持仓均价:成本价=
2 保本价:4125=1 则成本价=
4125=2 则成本价=
盈亏:4125=2, 盈亏=8940
4125=0 或 1, 盈亏=9160
2) 假如第二天客户以 12 元的价格卖出了 5000 股 000008,假设客户对应费用类别的费用
比例为 ,预算费用比例 4126 设置为 ,标准费用比例为 (此费用不是 9999
的费用),目前行情最新价已为 12 元,则白天成交后,后台 stock 和 stockreal 表中和成本盈
亏相关的字段情况如下:
Stock:
Current_amo
unt
Sum_buy_bala
nce
Sum_buy_amo
unt
Sum_sell_amo
unt
Sum_sell_bala
nce
Cost_pri
ce
10000 100400 10000 0 0 10
Stockreal:
Real_buy_balance real_buy_amount real_sell_amount real_sell_balance
0 0 5000 59760
则选择不同成本类型时的成本价如下:
0 成交均价:成本价=cost_price= 10
1 持仓均价:成本价=
2 保本价:
4125=1
则成本价=(100400-59760)/()/5000=
4125=2 ,成本价在初始的 基础上,按步长进行步进计算,直到 temp_mis=
( current_amount + real_buy_amount - real_sell_amount ) *
cost_price-(sum_buy_balance+real_buy_balance-sum_sell_balance-real_sell
_balance)- temp_fare》= 0 为止,得到成本价=
盈亏:=market_value-(sum_buy_balance+real_buy_balance-sum_sell_balance
-real_sell_balance) –temp_fare
4125=2, 盈亏=5000*12-(100400-59760)-5000×12×=19000
4125=0 或 1, 盈亏=5000*12-(100400-59760)-5000×12×=19120
日终清算后的 stock 和 stockreal 表中和成本盈亏相关的字段情况如下:
Stock:
Current_amo
unt
Sum_buy_bala
nce
Sum_buy_amo
unt
Sum_sell_amo
unt
Sum_sell_bala
nce
Cost_pri
ce
5000 100400 10000 5000 59760 10
Stockreal:
Real_buy_balance real_buy_amount real_sell_amount real_sell_balance
0 0 0 0
0 成交均价:成本价=cost_price= 10
1 持仓均价:成本价=
2 保本价:
4125=1
则成本价=(100400-59760)/()/5000=
4125=2 ,成本价在初始的 基础上,按步长进行步进计算,直到 temp_mis=
( current_amount + real_buy_amount - real_sell_amount ) *
cost_price-(sum_buy_balance+real_buy_balance-sum_sell_balance-real_sell
_balance)- temp_fare》= 0 为止,得到成本价=
盈亏:=market_value-(sum_buy_balance+real_buy_balance-sum_sell_balance
-real_sell_balance) –temp_fare
4125=2, 盈亏=5000*12-(100400-59760)-5000×12×=19000
4125=0 或 1, 盈亏=5000*12-(100400-59760)-5000×12×=19120
日终业务对成本的影响
日终系统根据不同的业务计算 sum_buy_amount,sum_sell_amount,sum_buy_balance,
sum_sell_balance,cost_price 值,并更新 stock 表。
a、 证券买卖等:
business_type in ('0', 'U', 'F', 'D') 的 业 务 , 如 果 occur_balance > , 则
sum_sell_balance 增 加 occur_balance , 否 则 , sum_buy_balance 增 加 abs
( occur_balance ); 如 果 occur_amount > 0 , 则 sum_buy_amount 增 加
occur_amount,否则 sum_sell_amount 增加 abs(occur_amount)。
b、 申购中签 、配售确认等:
business_type in ('1', 'E', 'O')业务,sum_buy_balance 增加 abs(occur_balance),
sum_buy_amount 增加 abs(occur_amount)。
c、 红股入帐:
business_type = '3'业务,sum_buy_amount 增加 abs(occur_amount)。
d、 新股入帐和配股入帐:
business_type in ('2', '4') 业 务 , 其 中 对 lof 上 市 stock_type=’K’ 除 外 , 其 他
sum_buy_balance 增 加 occur_amount × business_price , sum_buy_amount 增 加
occur_amount。
e、股息入帐:
business_type = '6'业务,sum_sell_balance 增加 abs(occur_balance)。
f、 证券托管、转托和余额入帐:
business_type in ('7', '8', 'B') 业 务 , 以 price 的 收 盘 价 asset_price 作 为 成 交 价
business_price 计 算 成 本 , 如 果 occur_amount > 0 , 则 sum_buy_balance 增 加
business_price × occur_amount , 则 sum_buy_amount 增 加 occur_amoun ; 否 则
sum_sell_balance 增加 business_price×abs(occur_amount),sum_sell_amount 增加
abs(occur_amount)。
g、 指定交易:
business_type = 'A'且 7511<>1(不是上海新接口),则置 sum_buy_balance = 0,
sum_sell_balance = 0,sum_buy_amount = 0,sum_sell_amount = 0,cost_price = 0,
如为上海新接口,则成本字段不作变化。
h、 开基申赎:
business_flag = 4073 业 务 , sum_buy_balance 增 加 abs ( occur_balance ),
sum_buy_amount 增 加 abs ( occur_amount ); business_flag = 4074 业 务 ,
sum_sell_balance 增 加 abs(business_balance) , sum_sell_amount 增 加
abs(occur_amount)。
i、 置买入均价:
根据上面的结算结果,对于 sum_buy_balance 的增加量》0,如果证券后余额
post_amount 为 0 的,置 cost_price = ,
否则,cost_price=【(post_amount - _occur_amount)×cost_price+sum_buy_balance
的增加量】/【post_amount】
3 资金算法
表和相关字段的说明
资金表相关字段说明(fund)
字段名 字段含义
fund_account 资金帐号
begin_balance 期初余额
current_balance 当前余额
cash_balance 现金余额
check_balance 支票余额
frozen_balance 冻结资金
unfrozen_balance 解冻资金
uncome_buy_balance 未回买入金额
uncome_sell_balance 未回卖出金额
uncome_correct_balance 未回买卖净额
correct_balance 资产修正金额
foregift_balance 禁取资金
mortgage_balance 禁取资产
bail_balance 交易产生的可用资金
具体算法计算
在系统中,将用到几种不同含义的资金余额:期初余额、当前余额、可取金额、可用金
额等。
期初余额(begin_balance)
指当天初始化后的最初余额,往往等同与前一天的最终余额。
当前余额(current_balance)
当前余额 = 期初余额 + 存入金额 - 取出金额 + 蓝补金额 - 红冲金额
可用资金(enable_balance)
可用金额 = 当前金额 - 冻结金额 + 解冻金额 + 交易解冻和冻结的差
Enable_balance=_balance-_balance+_balance
+_balance
其中 _balance 是交易产生的解冻和冻结之差,通过以下实时计算得到
_balanc=sum(business_unfrozen_balance-business_frozen_balance)
可取金额(fetch_balance)
1)可取金额 = 当前金额 -冻结金额 + sum(交易解冻-交易冻结) -max(临时资金,0)-
禁取资金 -未回卖出金额
注 1 : sum( 交 易 解 冻 - 交 易 冻 结 = bail_balance = sum(business_unfrozen_balance -
business_frozen_balance)为交易解冻和交易冻结的差,现在实时体现在 FUND 表
bail_balance 字段上,
注 2:临时资金=未回差额(uncome_correct_balance) + sum(交易解冻-交易冻结),即临时
资 金 = uncome_correct_balance + bail_balance , 其 中 未 回 差 额
uncome_correct_balance 在 fund 表 里 每 日 初 始 化 会 根 据 undeliver 算 得 一 个
uncome_correct_balance 字段。
2)如果 2019 设置为当天存入不允许取出,则
可取资金=可取资金-当日存入不许取的发生额
其中当日存入不允许取的发生额为 fundjour 中现金类业务标志包含 2001,2003,2041
的累计发生额和支票类业务标志为 2405 的累计发生额。
3)如果客户有禁取资产且(总资产-禁取资产)>0,
a. 当可取资金>总资产-禁取资产时,
则可取资金=总资产-禁取资产,
b. 当可取资金<总资产-禁取资产时
可取资金=0。
可取现金(fetch_cash)
1)如果 2018 设置允许支票自动套现:则可取现金 fetch_cash = 可取资金 fetch_balance。
2)如果 2018 设置不允许支票自动套现:
如当前余额 current_balance-支票金额 check_balance<现金余额 cash_balance 时,
则可取现金 fetch_cash =现金余额 cash_balance;
如当前余额 current_balance-支票金额 check_balance>可取资金 fetch_balance 时,
则可取现金 fetch_cash = 可取资金 fetch_balance。
4 资产和市值算法
表和相关字段的说明
证券表相关字段说明(stock)
字段名 字段含义
fund_account 资金帐号
……
Stock_code 证券代码
current_amount 当前数量
correct_amount 资产修正数量
证券变动表相关字段说明(stockreal)
字段名 字段含义
fund_account 资金帐号
……
Stock_code 证券代码
real_buy_amount 回报买入数量
real_sell_amount 回报卖出数量
行情表相关字段说明(price)
字段名 字段含义
Stock_code 证券代码
……
Asset_price 市值计算价
Last_price 最新价
市值计算
因为 06 版系统上海和深圳的证券按不同的用户存放,所以在实际的计算中通过分别计
算上海的市值计算和深圳的市值计算后相加得到,具体算法如下:
证券市值=(当前数量+修正数量+回报买入数量-回报卖出数量)×行情价格
market_value = Sum ( _amount + _amount +stockreal.
real_buy_amount – _sell_amount)* _price
资产计算
资产值包含四部分,一部分为资金部分的资产,一部分为证券市值部分的资产,分别为
上海、深圳的市值,一部分为基金市值,三者相加即为资产总值 asset=资金资产 fund_asset
+证券市值 market_value(secu/secusz)+基金市值 opfund_market_value,具体算法如下:
资金资产=当前金额+资产修正金额-回报买入金额+回报卖出金额
fund_asset=
_balance + fund. correct_balance - sum(_buy_balance) +
sum(_sell_balance)
证券市值=(当前数量+修正数量+回报买入数量-回报卖出数量)×行情价格,按证
券代码计算汇总(secu/secusz)
market_value = Sum ( _amount + _amount + stockreal.
real_buy_amount -_sell_amount)* _price
基金市值= 份额×净值
(ofstock .current_share –ofstock .back_share)*