指增和中性产品的申赎加减仓及资金调拨自动化伪代码思路

定义一些关键字代表的意义

  • STRUCT: 代表需要输入的格式化的信息

  • IMPORT: 代表需要输入的外部信息, 这些信息通常是客观的

  • SEARCH: 需要从某地比如数据库检索搜集信息

  • SUM: 一种宏观的加和操作, 比如两个股票户A+B=AB,微观上实际还是有差异

  • GROUP: 一种聚合操作,目的是把符合条件的对象聚合起来

  • FUNCTION: 代表可复用的函数

  • RAISE: 代表出现了致命错误需要人工处理

  • PRINT: 代表需要被注意的提醒

  • RETURN: 代表可以被函数外部接受的指令

    STRUCT 产品信息
    产品ID: 取值范围为正整数
    产品分类: 取值范围为[增强, 对冲, 杠杆对冲, 多空, 选股]
    END STRUCT

    STRUCT 股票账户
    产品ID:
    账户名:
    股票市值: 取值范围为正浮点数
    股票可用: 取值范围为正浮点数
    股票账户交易应留: 取值范围为正浮点数
    股票账户持仓IF: 取值范围为正整数
    股票账户持仓IC: 取值范围为正整数
    股票账户持仓IM: 取值范围为正整数
    END STRUCT

    STRUCT 期货账户
    产品ID:
    账户名:
    期货保证金: 取值范围为正浮点数
    期货保证金比例: 取值范围为[0.12,1)
    期货可用: 取值范围为正浮点数
    期货应留: 取值范围为正浮点数
    期货账户持仓IF: 取值范围为整数
    期货账户持仓IC: 取值范围为整数
    期货账户持仓IM: 取值范围为整数
    END STRUCT

    STRUCT 融券账户
    产品ID:
    账户名:
    货币基金市值: 取值范围为正浮点数
    可用资金: 取值范围为正浮点数
    融券负债: 取值范围为正浮点数
    融券账户持仓IF: 取值范围为负整数
    融券账户持仓IC: 取值范围为负整数
    融券账户持仓IM: 取值范围为负整数
    END STRUCT

    STRUCT 申赎信息
    申赎方向: 取值范围为[申购, 赎回]
    申赎金额: 取值范围为带符号浮点数
    申赎日期: 取值为日期
    资金到账日期: 取值为日期
    END STRUCT

    IMPORT 当前日期 // 输入当前日期
    IMPORT 期货含安全垫保证金占比 // 通常股指期货为0.12+0.1+0.12*0.1=0.232
    IMPORT 沪深300指数价格与乘数 // 取值范围为正浮点数
    IMPORT 中证500指数价格与乘数 // 取值范围为正浮点数
    IMPORT 中证1000指数价格与乘数 // 取值范围为正浮点数

    SEARCH & SUM 股票 // 汇总该产品所有股票账户
    SEARCH & SUM 期货 // 汇总该产品所有期货账户
    SEARCH & SUM 融券 // 汇总该产品所有融券账户
    SEARCH & GROUP 申赎 // 汇总每个产品产品当日涉及的所有申赎信息

    FUNCTION 检查指增产品是否存在暴露()
    未加仓资金 = 股票.股票可用 + 期货.期货保证金 + 期货.期货可用
    现对冲价值 = 期货.期货保证金 / 期货保证金比例
    暴露 = 未加仓资金 - 现对冲价值
    IF 暴露 > 指数价格 * 乘数 * 期货含安全垫保证金占比 * 0.5
    RAISE 有未处理的暴露, 请手动处理后再处理申赎
    END FUNCTION

    FUNCTION MAIN(产品, 申赎)
    IF 当前日期 == 申赎.申赎日期
    IF 产品.产品分类 == 增强
    IF 期货账户 == 无
    IF 申赎.申赎方向 == 赎回
    股票应减仓手数 = 向上取整(-申赎.申赎金额 / 指数价格 / 乘数)
    减仓后股票持仓手数 = 股票.股票账户持仓 - 股票应减仓手数
    IF 减仓后股票持仓手数 < 0
    RAISE 有超过持仓价值的赎回
    RETURN 股票应减仓手数
    ELSE
    检查指增产品是否存在暴露()
    申购后未加仓资金 = 股票.股票可用 + 期货.期货保证金 + 期货.期货可用 + 申赎.申赎金额
    期货现对冲价值 = 期货.期货保证金 / 期货保证金比例
    申购后暴露 = 预期未加仓资金 - 期货现对冲价值
    期货需加减仓手数 = 四舍五入(申购后暴露 / 指数价格 / 乘数)
    加减仓后期货持仓手数 = 期货.期货账户持仓 + 期货需加减仓手数
    期货户合计应保留资金 = 取绝对值(加减仓后期货持仓手数) * 指数价格 * 乘数 * 期货含安全垫保证金占比
    期货户需调入资金 = 期货户合计应保留资金 - 期货.期货保证金 - 期货.期货可用
    IF 期货户需调入资金 > 0
    IF 股票.股票可用 - 股票.股票账户交易应留 < 期货户需调入资金
    RAISE 股票需减仓{期货户需调入资金 - (股票.股票可用 - 股票.股票账户交易应留)}以补充期货户
    ELSE
    RETURN 期货需加减仓手数, 期货户需调入资金
    ELSE
    PRINT 期货资金有富余
    RETURN 期货需加减仓手数
    ELIF 当前日期 == 申赎.资金到账日期 - 1
    IF 产品.产品分类 == 增强 AND 申赎.申赎方向 == 赎回 AND 期货账户 == 有
    检查指增产品是否存在暴露()
    多空应减仓手数 = 向上取整(-申赎.申赎金额 / 指数价格 / 乘数 / (1 + 期货含安全垫保证金占比))
    减仓后股票持仓手数 = 股票.股票账户持仓 - 多空应减仓手数
    IF 减仓后股票持仓手数 < 0
    RAISE 有超过持仓价值的赎回
    减仓后期货持仓手数 = 期货.期货账户持仓 + 多空应减仓手数
    期货户合计应保留资金 = 取绝对值(减仓后期货持仓手数) * 指数价格 * 乘数 * 期货含安全垫保证金占比
    期货户需调入资金 = 期货户合计应保留资金 - 期货.期货保证金 - 期货.期货可用
    IF 期货户需调入资金 > 0
    IF 股票.股票可用 - 股票.股票账户交易应留 < 期货户需调入资金
    RAISE 股票需减仓{期货户需调入资金 - (股票.股票可用 - 股票.股票账户交易应留)}以补充期货户
    ELSE
    RETURN 多空应减仓手数, 期货户需调入资金
    ELSE
    PRINT 期货资金有富余
    RETURN 多空应减仓手数
    ELIF (产品.产品分类 == 对冲 OR 产品.产品分类 == 杠杆对冲) AND 申赎.申赎方向 == 赎回
    多空应减仓手数 = 向上取整(-申赎.申赎金额 / 指数价格 / 乘数 / (1 + 期货含安全垫保证金占比))
    减仓后股票持仓手数 = 股票.股票账户持仓 - 多空应减仓手数
    IF 减仓后股票持仓手数 < 0
    RAISE 有超过持仓价值的赎回
    减仓后期货持仓手数 = 期货.期货账户持仓 + 多空应减仓手数
    期货户合计应保留资金 = 取绝对值(减仓后期货持仓手数) * 指数价格 * 乘数 * 期货含安全垫保证金占比
    期货户需调入资金 = 期货户合计应保留资金 - 期货.期货保证金 - 期货.期货可用
    IF 期货户需调入资金 > 0
    IF 股票.股票可用 - 股票.股票账户交易应留 < 期货户需调入资金
    RAISE 股票需减仓{期货户需调入资金 - (股票.股票可用 - 股票.股票账户交易应留)}以补充期货户
    ELSE
    RETURN 多空应减仓手数, 期货户需调入资金
    ELSE
    PRINT 期货资金有富余
    RETURN 多空应减仓手数
    ELIF 当前日期 == 申赎.资金到账日期
    IF 产品.产品分类 == 增强
    IF 期货账户 == 无
    IF 申赎.申赎方向 == 赎回
    从股票户划出的赎回资金 = -申赎.申赎金额
    IF 股票.股票可用 - 股票.股票账户交易应留 < -申赎.申赎金额
    RAISE 股票户资金不足以划出, 应划出{-申赎.申赎金额}, 最大可划出{股票.股票可用}, 但应留{股票.股票账户交易应留}
    ELSE
    RETURN 从股票户划出的赎回资金
    ELSE
    划入股票户资金 = 申赎.申赎金额
    股票可加仓资金 = 划入股票户资金 + 股票.股票可用 - 股票.股票账户交易应留
    股票应加仓手数 = 向下取整(股票可加仓资金 / 指数价格 / 乘数)
    IF 股票应加仓手数 <= 0
    PRINT 资金紧张, 不建议加仓
    ELSE
    RETURN 股票应加仓手数, 划入股票户资金
    ELSE
    IF 申赎.申赎方向 == 赎回
    期货户合计应保留资金 = 取绝对值(期货.期货账户持仓) * 指数价格 * 乘数 * 期货含安全垫保证金占比
    期货户需调入资金 = 期货户合计应保留资金 - 期货.期货保证金 - 期货.期货可用
    IF 股票.股票可用 - 股票.股票账户交易应留 - 期货户需调入资金 < -申赎.申赎金额
    RAISE 资金不足以划出
    ELSE
    IF 期货户需调入资金 < 0
    从期货户划出的赎回资金 = -期货户需调入资金
    从股票户划出的赎回资金 = -申赎.申赎金额 - 从期货户划出的赎回资金
    RETURN 从期货户划出的赎回资金, 从股票户划出的赎回资金
    ELSE
    从股票户划入期货户资金 = -期货户需调入资金
    从股票户划出的赎回资金 = -申赎.申赎金额
    RETURN 从股票户划入期货户资金, 从股票户划出的赎回资金
    ELSE
    划入股票户资金 = 申赎.申赎金额
    股票可加仓资金 = 划入股票户资金 + 股票.股票可用 - 股票.股票账户交易应留
    股票应加仓手数 = 向下取整(股票可加仓资金 / 指数价格 / 乘数)
    期货减仓后持仓 = 期货.期货账户持仓 - 股票应加仓手数
    IF 股票应加仓手数 <= 0
    PRINT 资金紧张, 不建议加仓
    ELSE
    IF 期货减仓后持仓 < 0
    RAISE 期货持仓有误
    期货减仓释放资金 = 股票应加仓手数 * 指数价格 * 乘数 * 期货含安全垫保证金占比
    IF 四舍五入(期货减仓释放资金 / 指数价格 / 乘数) >= 1
    PRINT 本次申购加仓资金释放的期货资金较多, 需将这部分资金对冲掉
    RETURN 股票应加仓手数, 划入股票户资金
    ELIF 产品.产品分类 == 对冲 OR 产品.产品分类 == 杠杆对冲
    IF 申赎.申赎方向 == 赎回
    期货户合计应保留资金 = 取绝对值(期货.期货账户持仓) * 指数价格 * 乘数 * 期货含安全垫保证金占比
    期货户需调入资金 = 期货户合计应保留资金 - 期货.期货保证金 - 期货.期货可用
    IF 股票.股票可用 - 股票.股票账户交易应留 - 期货户需调入资金 < -申赎.申赎金额
    RAISE 资金不足以划出
    ELSE
    IF 期货户需调入资金 < 0
    从期货户划出的赎回资金 = -期货户需调入资金
    从股票户划出的赎回资金 = -申赎.申赎金额 - 从期货户划出的赎回资金
    RETURN 从期货户划出的赎回资金, 从股票户划出的赎回资金
    ELSE
    从股票户划入期货户资金 = -期货户需调入资金
    从股票户划出的赎回资金 = -申赎.申赎金额
    RETURN 从股票户划入期货户资金, 从股票户划出的赎回资金
    ELSE
    期货户合计应保留资金 = 取绝对值(期货.期货账户持仓) * 指数价格 * 乘数 * 期货含安全垫保证金占比
    期货户需补充资金 = 期货户合计应保留资金 - 期货.期货保证金 - 期货.期货可用
    股票户需补充资金 = 股票.股票账户交易应留 - 股票.股票可用
    多空加仓可用资金 = 申赎.申赎金额 - 期货户需补充资金 - 股票户需补充资金
    多空加仓手数 = 向下取整(多空加仓可用资金 / 指数价格 / 乘数 / (1 + 期货含安全垫保证金占比))
    IF 多空加仓手数 <= 0
    PRINT 资金紧张, 不建议加仓
    期货户加仓需要资金 = 多空加仓手数 * 指数价格 * 乘数 * 期货含安全垫保证金占比
    划入期货户的申购资金 = 期货户需补充资金 + 期货户加仓需要资金
    IF 划入期货户的申购资金 <= 0
    划入股票户的申购资金 = 申赎.申赎金额
    从期货户划入股票户的资金 = -划入期货户的申购资金
    RETURN 多空加仓手数, 从期货户划入股票户的资金, 划入股票户的申购资金
    ELIF 划入期货户的申购资金 <= 申赎.申赎金额
    划入股票户的申购资金 = 申赎.申赎金额 - 划入期货户的申购资金
    RETURN 多空加仓手数, 划入期货户的申购资金, 划入股票户的申购资金
    ELSE
    从股票户划入期货户的资金 = 划入期货户的申购资金 - 申赎.申赎金额
    划入期货户的申购资金 = 申赎.申赎金额
    RETURN 多空加仓手数, 划入期货户的申购资金, 从股票户划入期货户的资金
    ELSE
    ELSE
    PRINT 该产品当日无需处理该笔申赎
    END FUNCTION

    FOREACH 产品
    FOREACH 申赎
    MAIN(产品, 申赎)

    TODO 未处理"申赎.申赎日期==申赎.资金到账日期-1"的情况
    TODO 考虑杠杆对冲产品多头保证金带杠杆
    TODO 考虑对冲产品可能包含融券持仓

相关推荐
独行soc4 小时前
#渗透测试#SRC漏洞挖掘#深入挖掘XSS漏洞02之测试流程
web安全·面试·渗透测试·xss·漏洞挖掘·1024程序员节
XuanRanDev7 小时前
【每日一题】LeetCode - 三数之和
数据结构·算法·leetcode·1024程序员节
鹏大师运维13 小时前
【功能介绍】信创终端系统上各WPS版本的授权差异
linux·wps·授权·麒麟·国产操作系统·1024程序员节·统信uos
亦枫Leonlew14 小时前
微积分复习笔记 Calculus Volume 1 - 4.7 Applied Optimization Problems
笔记·数学·微积分·1024程序员节
小肥象不是小飞象14 小时前
(六千字心得笔记)零基础C语言入门第八课——函数(上)
c语言·开发语言·笔记·1024程序员节
一个通信老学姐1 天前
专业130+总400+武汉理工大学855信号与系统考研经验电子信息与通信工程,真题,大纲,参考书。
考研·信息与通信·信号处理·1024程序员节
力姆泰克1 天前
看电动缸是如何提高农机的自动化水平
大数据·运维·服务器·数据库·人工智能·自动化·1024程序员节
力姆泰克1 天前
力姆泰克电动缸助力农业机械装备,提高农机的自动化水平
大数据·服务器·数据库·人工智能·1024程序员节
程思扬1 天前
为什么Uptime+Kuma本地部署与远程使用是网站监控新选择?
linux·服务器·网络·经验分享·后端·网络协议·1024程序员节
转世成为计算机大神1 天前
网关 Spring Cloud Gateway
java·网络·spring boot·1024程序员节