.NET 夏普比率,波动率的公式讲解和代码实现运算
.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 夏普比率,波动率的公式讲解和代码实现运算相关推荐
- matlab计算夏普比率,用凯利公式计算最优配置
我们选取三只特定行业的ETF,来看看在它们之间如何进行资本配置,从而获得投资组合的最大增长率.这三只ETF是:OIH (原油服务), RKH(区域银行)和RTH(零售).每日价格可从推虎财经下载,在e ...
- python金融分析小知识(34)——年化收益率、年化波动率以及夏普比率的计算
Hello 大家好,我是一名新来的金融领域打工人,日常分享一些python知识,都是自己在学习生活中遇到的一些问题,分享给大家,希望对大家有一定的帮助! 大家好呀 好久不见!最近忙的事情太多了 没来得 ...
- 【量化金融】收益率、对数收益率、年华收益、波动率、夏普比率、索提诺比率、阿尔法和贝塔、最大回撤
[量化金融]收益率.对数收益率.年华收益.波动率.夏普比率.索提诺比率.阿尔法和贝塔.最大回撤 1 收益率 在学术界,建模一般不直接使用资产价格,而是使用资产收益率(Returns).因为收益率比价格 ...
- 基金里投资风险指标的计算工具类(夏普比率,波动率,Var值,最大回撤率)
去年在项目里写了一个计算投资风险指标的计算工具类,包含夏普比率,波动率,Var值,最大回撤率四个指标. 计算全部采用BigDecimal类型,开方计算采用牛顿迭代法计算. 其计算公式如下: 工具类实现 ...
- 计算风险指标:最大回撤、计算风险收益指标:夏普比率、利用最大回撤和夏普比筛选基金、比较3只股票的夏普指数
接着上一次获取股票数据[实时更新股票数据.创建你的股票数据].计算交易指标[买入.卖出信号.计算持仓收益.计算累计收益率] - cexo - 博客园的量化交易往下学习. 计算风险指标:最大回撤 什么是 ...
- 量化交易中用到的回测评估指标(策略收益、基准收益、Alpha比率、Beta比率、夏普比率、索提诺比率)详解
前言 近日在做A股的过程中接触到了量化交易.通过一个月时间的了解发现并非全自动印钞机,也有可能有全自动接盘侠的潜质.故现阶段以学习量化交易的知识为主,多学多问总是没错的嘛~ 现阶段使用Python爬取 ...
- 夏普比率和最大回撤计算方法
一.夏普比率的计算 夏普比例(TheSharpe ratio)=(预期收益率 - 无风险利率)/投资组合标准差,也叫报酬与波动性比率,可能是最常用的投资组合管理度量标准.它采用的方法是,组合中超过无风 ...
- 回撤率 python_求问怎么用python求夏普比率和最大回撤率呢
作者:知乎用户 链接:https://www.zhihu.com/question/27264526/answer/147672695 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
- python价值算法_第十课-Python金融学基础——夏普比率(Sharpe-ratio)和资产组合价值(portfolio-value)...
前面的课程主要是在研究Pandas的时序分析实现,以及利用statsmodel对时序数据进行ARIMA以及有权重的ARIMA模型的建模,并尝试预测未来的走向.从这节课开始,我们正式进入Python金融 ...
最新文章
- 在 Python 中妙用短路机制
- android sdcard 不存在,在android中显示sdcard上不存在的文件的提醒
- LearnOpenCV学习——平均脸faceAverage.py
- Thread.Sleep(0) vs Sleep(1) vs Yeild
- 树莓派模拟量输入范围_使用 RPi.GPIO 模块的输入(Input)功能
- [转]ELF文件结构简述
- SAP tcode CMS_SI 里的transaction type
- 这个公式竟然堪称数学界的画家......
- 计算机科学计算方面分为,计算机方面的专业分为哪些类?【资讯与计算科学】和【电脑科学与技术专业】有什么不同?...
- lanmp之二 (奇葩问题)
- java kafka 分区_Java kafka如何实现自定义分区类和拦截器
- argparse、glob、findall
- Open Graphics Library初步_搭建环境_GLUT
- js selector设计及实现(一) 实现思路
- 【ACwing 95】费解的开关——枚举 + 搜索
- SPSS 偏相关分析【SPSS 024期】
- 韩语在线翻译图片识别_Text Scanner for Mac(ocr文字识别工具)
- 2021Android高级面试题总结,挥泪整理面经
- 同步时钟、异步时钟----概念解析
- 刷题总结——宠物收养所(bzoj1208)