.NET中实现金融股票的一些简单算法(精简处理)(波动率,收益率,年化,夏普比率等算法简化)

最近接手一个关于股票的系统,显示端需要显示一些庞大且可分析性的比率数据,其中就用到了一些简单且实用的算法(标题中的各个公式,不论是书上还是其他朋友总结出来总会有一些出入,这里只参考工作日情况**非自然日算式方式 **)

这个算法普伦是夏普或者波动都和不同的场景有一些出入,根据个人的实际情况,可以进行适当修改

首先,公式中有用到西格玛(∑,σ)前者大写,后者小写,和sqrt
不了解西格玛的同学可以先了解一下这个的基本知识

σ:小写σ是希腊字母,英文表达sigma,汉语译音为“西格玛”。术语σ用来描述任一过zhi程参数的平均值的分布dao或离散程度;σ(n)表示整数n的所有正因数的和。

对商务或制造过程而言,σ值可以测量过程完成无缺陷作业的能力,是指示过程作业状况良好程度的标尺。σ值越低,则过程状况越好

:大写∑用于数学上的总和符号du,比如:∑Pi,其中i=1,2,…,T,即为求P1 + P2 + … + PT的和。zhi

求和符号∑是希腊dao字母西格玛的大写,表示将它右边的所有数,这里是1/n2,加在一起。∑下面的“n=1”表示我们从n=1开始加起,而根据惯例,n是依次增加的正整数。

项目中用到的正是∑的含义:动态上下标和access数值的迭代产生的结果;通俗理解(有限迭代算法)

下面展示用到的原公式(我把公式拆成一个个小部分来封装,更便于理解和阅读,其实是存在嵌套关系的):

年化利率(工作日为基准)

最大回撤率

夏普比率(与波动率紧连)

波动率

下面展示本人封装的方法和简化后的计算方法(实际数据测试ed)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Pro_Tools
{public class Data_Algorithm{public int Round { get; set; }public Data_Algorithm(){Round = 0;}/// <summary>/// 声明一个∑西格玛计算委托/// </summary>/// <param name="up">上标</param>/// <param name="down">下标</param>/// <param name="access">待处理的基数</param>/// <returns></returns>public delegate decimal DoMath(int up, int down, decimal access);/// <summary>/// 声明一等待执行委托/// </summary>/// <param name="function">方法名称</param>/// <param name="up">上标</param>/// <param name="down">下标</param>/// <param name="access">待处理的基数</param>/// <returns></returns>public decimal DoMaths(DoMath function, int up, int down, decimal access) => function(up, down, access);/// <summary>/// 计算收益/// </summary>/// <param name="SellUnitPrice">卖出单价</param>/// <param name="SellCount">卖出数量</param>/// <param name="BuyUnitPrice">买入单价</param>/// <param name="BuyCount">买入数量</param>/// <returns></returns>public decimal Profit(decimal SellUnitPrice, decimal SellCount, decimal BuyUnitPrice, decimal BuyCount){decimal end = SellUnitPrice * SellCount;//最终总价值decimal start = BuyCount * BuyUnitPrice;//最初总价值decimal result = end - start;return result;}/// <summary>/// 计算收益率/// </summary>/// <param name="SellUnitPrice">卖出单价</param>/// <param name="SellCount">卖出数量</param>/// <param name="BuyUnitPrice">买入单价</param>/// <param name="BuyCount">买入数量</param>/// <returns></returns>public decimal Yield(decimal SellUnitPrice, decimal SellCount, decimal BuyUnitPrice, decimal BuyCount){decimal end = SellUnitPrice * SellCount;//最终总价值decimal start = BuyCount * BuyUnitPrice;//最初总价值decimal result = (end - start) / start;//做出收益率return result;}/// <summary>/// 年化收益/// </summary>/// <param name="P">收益率</param>/// <param name="EntDays">执行天数</param>/// <returns></returns>public decimal AnnualizedIncome(decimal P, int EntDays){decimal TheFla = (1 + P);try{decimal AnnualizedIncomes = Convert.ToInt32(Math.Pow(Convert.ToDouble(TheFla), 250 / EntDays) - 1);///该处可能损失浮点,但是不会导致异常或报错!!!return AnnualizedIncomes;}catch (Exception ex){return 0m;///表示异常,溢出throw;}}/// <summary>/// 计算夏普比率/// </summary>/// <param name="Rp">收益率</param>/// <param name="Rf">无风险利率(有默认值)</param>/// <param name="σp">策略收益波动率</param>/// <returns></returns>public decimal Sharpe_Ratio(decimal Rp, decimal σp, decimal Rf = 0.04m){decimal result = (Rp - Rf) / σp;return Math.Round(result,2);}/// <summary>/// 计算策略收益波动率 σp/// </summary>/// <param name="Rp">收益率</param>/// <param name="Rpav">策略收益率的平均值</param>/// <param name="EnterDays">执行天数</param>/// <returns></returns>public decimal Volatility(decimal Rp, decimal Rpav, int EnterDays){decimal FirstData = Convert.ToDecimal(Math.Pow(Convert.ToDouble((Rp - Rpav)), 2));///该处计算可能算是浮点,但是不会报错或抛出异常!!!//decimal SecondData = SigmaAddition(EnterDays, 1, FirstData);///迭代算式1decimal SecondData = DoMaths(SigmaAddition, EnterDays, 1, FirstData);///迭代算式2decimal ThirdData = SecondData * (250 / EnterDays - 1);decimal result = Convert.ToDecimal(Math.Sqrt(Convert.ToDouble(ThirdData)));///该处可能丢失浮点,但是不会报错或者抛出异常!!!return result;}/// <summary>/// 策略收益率的平均值(包含数乘性)/// </summary>/// <param name="SubScript">∑西格玛下标(公式里的i,这里改为动态下标)</param>/// <param name="Rp">收益率</param>/// <param name="EnterDays">执行天数(∑上标)</param>/// <returns></returns>public decimal The_Average_Daily_Return_Of_The_Strategy(int SubScript, decimal Rp, int EnterDays){Data_Algorithm Da = new Data_Algorithm();decimal result = 0;//for (int i = SubScript; i <= EnterDays; i++)//{//    result += Rp * i;//}///∑西格玛运算result += DoMaths(SigmaMultiplication, SubScript, EnterDays, Rp);///迭代计算result = result * (1 / EnterDays);//平均值return result;}/// <summary>/// 最大回撤率/// </summary>/// <param name="Px">过去式(策略某日股票和现金总价值)</param>/// <param name="Py">现在或将来(策略某日股票和现金总价值)</param>/// <returns></returns>public decimal Max_DrowDown(decimal Px, decimal Py) => (Px - Py) / Px;/// <summary>/// 西格玛连加计算(不含数乘)/// </summary>/// <param name="up">上标</param>/// <param name="down">下标</param>/// <param name="access">待处理的基数</param>/// <returns></returns>private decimal SigmaAddition(int up, int down, decimal access){decimal result = 0;for (int i = down; i <= up; i++){result += access;}return result;}/// <summary>/// 西格玛加乘混合计算/// </summary>/// <param name="up">上标</param>/// <param name="down">下标</param>/// <param name="access">待处理的基数</param>/// <returns></returns>private decimal SigmaMultiplication(int up, int down, decimal access){decimal result = 0;for (int i = down; i < up; i++){result += access * i;}return result;}/// <summary>/// 胜率/// </summary>/// <param name="Number_Of_Profitable_Transactions">盈利交易次数</param>/// <param name="Number_Of_Transactions">总交易次数</param>/// <returns></returns>public decimal Winning_Probability(int Number_Of_Profitable_Transactions, int Number_Of_Transactions) => Number_Of_Profitable_Transactions / Number_Of_Transactions;}
}

好,以上就是最简单的几个基本算法和代码逻辑的部分实现过程,作为本人算法的进步记录和经验分享

如有不足请同志积极指正,共同学习!

.NET 夏普比率,波动率的公式讲解和代码实现运算相关推荐

  1. matlab计算夏普比率,用凯利公式计算最优配置

    我们选取三只特定行业的ETF,来看看在它们之间如何进行资本配置,从而获得投资组合的最大增长率.这三只ETF是:OIH (原油服务), RKH(区域银行)和RTH(零售).每日价格可从推虎财经下载,在e ...

  2. python金融分析小知识(34)——年化收益率、年化波动率以及夏普比率的计算

    Hello 大家好,我是一名新来的金融领域打工人,日常分享一些python知识,都是自己在学习生活中遇到的一些问题,分享给大家,希望对大家有一定的帮助! 大家好呀 好久不见!最近忙的事情太多了 没来得 ...

  3. 【量化金融】收益率、对数收益率、年华收益、波动率、夏普比率、索提诺比率、阿尔法和贝塔、最大回撤

    [量化金融]收益率.对数收益率.年华收益.波动率.夏普比率.索提诺比率.阿尔法和贝塔.最大回撤 1 收益率 在学术界,建模一般不直接使用资产价格,而是使用资产收益率(Returns).因为收益率比价格 ...

  4. 基金里投资风险指标的计算工具类(夏普比率,波动率,Var值,最大回撤率)

    去年在项目里写了一个计算投资风险指标的计算工具类,包含夏普比率,波动率,Var值,最大回撤率四个指标. 计算全部采用BigDecimal类型,开方计算采用牛顿迭代法计算. 其计算公式如下: 工具类实现 ...

  5. 计算风险指标:最大回撤、计算风险收益指标:夏普比率、利用最大回撤和夏普比筛选基金、比较3只股票的夏普指数

    接着上一次获取股票数据[实时更新股票数据.创建你的股票数据].计算交易指标[买入.卖出信号.计算持仓收益.计算累计收益率] - cexo - 博客园的量化交易往下学习. 计算风险指标:最大回撤 什么是 ...

  6. 量化交易中用到的回测评估指标(策略收益、基准收益、Alpha比率、Beta比率、夏普比率、索提诺比率)详解

    前言 近日在做A股的过程中接触到了量化交易.通过一个月时间的了解发现并非全自动印钞机,也有可能有全自动接盘侠的潜质.故现阶段以学习量化交易的知识为主,多学多问总是没错的嘛~ 现阶段使用Python爬取 ...

  7. 夏普比率和最大回撤计算方法

    一.夏普比率的计算 夏普比例(TheSharpe ratio)=(预期收益率 - 无风险利率)/投资组合标准差,也叫报酬与波动性比率,可能是最常用的投资组合管理度量标准.它采用的方法是,组合中超过无风 ...

  8. 回撤率 python_求问怎么用python求夏普比率和最大回撤率呢

    作者:知乎用户 链接:https://www.zhihu.com/question/27264526/answer/147672695 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  9. python价值算法_第十课-Python金融学基础——夏普比率(Sharpe-ratio)和资产组合价值(portfolio-value)...

    前面的课程主要是在研究Pandas的时序分析实现,以及利用statsmodel对时序数据进行ARIMA以及有权重的ARIMA模型的建模,并尝试预测未来的走向.从这节课开始,我们正式进入Python金融 ...

最新文章

  1. 在 Python 中妙用短路机制
  2. android sdcard 不存在,在android中显示sdcard上不存在的文件的提醒
  3. LearnOpenCV学习——平均脸faceAverage.py
  4. Thread.Sleep(0) vs Sleep(1) vs Yeild
  5. 树莓派模拟量输入范围_使用 RPi.GPIO 模块的输入(Input)功能
  6. [转]ELF文件结构简述
  7. SAP tcode CMS_SI 里的transaction type
  8. 这个公式竟然堪称数学界的画家......
  9. 计算机科学计算方面分为,计算机方面的专业分为哪些类?【资讯与计算科学】和【电脑科学与技术专业】有什么不同?...
  10. lanmp之二 (奇葩问题)
  11. java kafka 分区_Java kafka如何实现自定义分区类和拦截器
  12. argparse、glob、findall
  13. Open Graphics Library初步_搭建环境_GLUT
  14. js selector设计及实现(一) 实现思路
  15. 【ACwing 95】费解的开关——枚举 + 搜索
  16. SPSS 偏相关分析【SPSS 024期】
  17. 韩语在线翻译图片识别_Text Scanner for Mac(ocr文字识别工具)
  18. 2021Android高级面试题总结,挥泪整理面经
  19. 同步时钟、异步时钟----概念解析
  20. 刷题总结——宠物收养所(bzoj1208)

热门文章

  1. 红旗linux和其他版本区别,Ubuntu Linux与红旗Linux系列的差别
  2. 2019学unity3d游戏开发必看
  3. 2022网络安全学习路线 非常详细 推荐学习
  4. 描述统计 | 学习笔记 (全)
  5. 计算机网络 - 网络层
  6. c语言编程镖局运镖,打点
  7. Semantic UI 之 图标 icon
  8. h5嵌入android的视频播放器
  9. linux自动启动 oracle
  10. Android-Accessibility(辅助功能/无障碍,自动安装APP)