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

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

  • 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 考虑对冲产品可能包含融券持仓

相关推荐
u0103055275 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055275 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝7 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055277 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055277 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552710 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552710 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552711 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u01030552712 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节
u01030552713 天前
使用BufferedReader读取控制台输入
人工智能·1024程序员节