arrow(c++)改写empyrical系列1---用arrow读取基金净值数据并计算夏普率

用arrow c++版本读取了csv中的基金净值数据,然后计算了夏普率,比较尴尬的是,arrow c++版本计算耗费的时间却比python的empyrical版本耗费时间多。。。
在这里插入图片描述
在这里插入图片描述

arrow新手上路,第一次自己去实现功能,实现的大概率并不是最高效的方式,但是我也踏出了用arrow c++改写backtrader的第一步。

  • 用arrow改写empyrical,就当练手了,目标是做成两个文件:empyrical.h和empyrical.cpp
  • 用arrow和qt改写pyfolio, 实现更美观的界面,做成两个文件:pyfolio.h 和pyfolio.cpp
  • 改写backtrader

c++版本的文件:

my_example.cc

#include <arrow/api.h>
#include <arrow/io/api.h>
#include "arrow/csv/api.h"
#include <arrow/compute/api.h>
#include <iostream>
#include <chrono>
//#include "../empyrical/empyrical.h"arrow::Status RunMain(){auto start_time = std::chrono::high_resolution_clock::now();// 首先,我们需要设置一个可读文件对象,它允许我们将读取器指向磁盘上的正确数据。我们将重复使用这个对象,并将其重新绑定到多个文件中。std::shared_ptr<arrow::io::ReadableFile> infile;// 绑定输入文件到 "test_in.csv"ARROW_ASSIGN_OR_RAISE(infile, arrow::io::ReadableFile::Open("/home/yun/Documents/fund_nav.csv"));// (文档部分:CSV 表格声明)std::shared_ptr<arrow::Table> csv_table;// CSV 读取器有多个对象,用于不同选项。现在,我们将使用默认值。ARROW_ASSIGN_OR_RAISE(auto csv_reader,arrow::csv::TableReader::Make(arrow::io::default_io_context(), infile, arrow::csv::ReadOptions::Defaults(),arrow::csv::ParseOptions::Defaults(), arrow::csv::ConvertOptions::Defaults()));// 读取表格。ARROW_ASSIGN_OR_RAISE(csv_table, csv_reader->Read());// 输出显示Table的元数据信息// std::cout << "Table Metadata:" << std::endl;// std::cout << "Number of columns: " << csv_table->num_columns() << std::endl;// std::cout << "Number of rows: " << csv_table->num_rows() << std::endl;// std::cout << "Schema: " << csv_table->schema()->ToString() << std::endl;// 输出显示Table的数据// for (int i = 0; i < csv_table->num_columns(); ++i) {//   std::shared_ptr<arrow::Array> column = csv_table->column(i);//   std::cout << "Column " << i << ": " << column->ToString() << std::endl;// }// 1. 显示table信息到std::cout的方法// std::shared_ptr<arrow::RecordBatch> record_batch;// arrow::Result<std::shared_ptr<arrow::RecordBatch>> result = csv_table->CombineChunksToBatch(); // 执行某个操作,返回Result// if (result.ok()) {//   record_batch = result.ValueOrDie();//   // 在这里使用 record_batch// } else {//   // 处理错误//   std::cerr << "Error: " << result.status().ToString() << std::endl;// }// //arrow::PrettyPrint(*record_batch, 2, &std::cout);// arrow::Status status = arrow::PrettyPrint(*record_batch, 2, &std::cout);// if (!status.ok()) {//   // 处理错误,例如打印错误信息//   std::cerr << "Error: " << status.ToString() << std::endl;// }// 2. 显示table信息到std::cout的方法// std::cout << csv_table->ToString() << std::endl;// 3. 显示table信息到std::cout的方法// arrow::Status status = arrow::PrettyPrint(*csv_table, 2, &std::cout);// if (!status.ok()) {//   // 处理错误,例如打印错误信息//   std::cerr << "Error: " << status.ToString() << std::endl;// }// 开始计算夏普率// std::cout << "一年的交易日有" << AnnualizationFactors::DAILY << "天" << std::endl;// std::cout << DAILY << std::endl;// 计算收益率arrow::Datum fund_returns;arrow::Datum fund_diff;std::shared_ptr<arrow::ChunkedArray> cum_nav = csv_table->GetColumnByName("复权净值");std::shared_ptr<arrow::ChunkedArray> now_cum_nav = cum_nav->Slice(1,cum_nav->length()-1);std::shared_ptr<arrow::ChunkedArray> pre_cum_nav = cum_nav->Slice(0,cum_nav->length()-1);ARROW_ASSIGN_OR_RAISE(fund_diff, arrow::compute::CallFunction("subtract", {now_cum_nav,pre_cum_nav}));ARROW_ASSIGN_OR_RAISE(fund_returns, arrow::compute::CallFunction("divide", {fund_diff,pre_cum_nav}));// // 获取结果数组// std::cout << "Datum kind: " << fund_returns.ToString()//           << " content type: " << fund_returns.type()->ToString() << std::endl;// // std::cout << fund_returns.scalar_as<arrow::DoubleScalar>().value << std::endl;// std::cout << fund_returns.chunked_array()->ToString() << std::endl;// 计算夏普率arrow::Datum avg_return;arrow::Datum avg_std;arrow::Datum daily_sharpe_ratio;arrow::Datum sharpe_ratio;arrow::Datum sqrt_year;// 创建 Arrow Double 标量double days_of_year_double = 252.0;std::shared_ptr<arrow::Scalar> days_of_year = arrow::MakeScalar(days_of_year_double);ARROW_ASSIGN_OR_RAISE(sqrt_year, arrow::compute::CallFunction("sqrt", {days_of_year}));ARROW_ASSIGN_OR_RAISE(avg_return, arrow::compute::CallFunction("mean", {fund_returns}));arrow::compute::VarianceOptions variance_options;variance_options.ddof = 1;ARROW_ASSIGN_OR_RAISE(avg_std, arrow::compute::CallFunction("stddev", {fund_returns},&variance_options));ARROW_ASSIGN_OR_RAISE(daily_sharpe_ratio, arrow::compute::CallFunction("divide", {avg_return,avg_std}));ARROW_ASSIGN_OR_RAISE(sharpe_ratio, arrow::compute::CallFunction("multiply", {daily_sharpe_ratio,sqrt_year}));std::cout << "计算得到的夏普率为 : " << sharpe_ratio.scalar_as<arrow::DoubleScalar>().value << std::endl;auto end_time = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);std::cout << "c++读取数据,然后计算夏普率一共耗费时间为: " << duration.count()/1000.0 << " ms" << std::endl;return arrow::Status::OK();}// (文档部分: 主函数)
int main() {arrow::Status st = RunMain();if (!st.ok()) {std::cerr << st << std::endl;return 1;}return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)project(MyExample)find_package(Arrow REQUIRED)
find_package(Parquet REQUIRED)
find_package(ArrowDataset REQUIRED)add_executable(my_example my_example.cc)
target_link_libraries(my_example PRIVATE Arrow::arrow_shared Parquet::parquet_shared ArrowDataset::arrow_dataset_shared)

在同一个文件夹下,运行

cmake -B build
cmake --build build
./build/my_example

python 运行代码如下:

import pandas as pd 
import empyrical as ep
import time 
a = time.perf_counter()
data = pd.read_csv("/home/yun/Documents/fund_nav.csv")
returns = data['复权净值'].pct_change().dropna()
sharpe_ratio = ep.sharpe_ratio(returns)
print("计算得到的sharpe_ratio : ", sharpe_ratio)
b = time.perf_counter()
print(f"python读取数据,然后计算夏普率一共耗费时间为: {(b-a)*1000.0} ms")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【(数据结构)— 双向链表的实现】

&#xff08;数据结构&#xff09;— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…

git切换远程仓库源步骤

git切换远程仓库源步骤&#xff1a; 第一步&#xff1a;git remote -v 查看当前远程仓库源&#xff1a; 第二步&#xff1a;git remote rm origin删除远程仓库源&#xff1b; 第三步&#xff1a;git remote add origin http://newURL.git 添加新的远程仓库源地址&#xff1b…

云安全—分布式基础

0x00 前言 云必然是依赖于分布式技术来进行实现的&#xff0c;所以有必要学习和来了解分布式相关的内容 0x01 分布式计算 1.基本概述 分布式计算的定义&#xff1a;通过网络互联的计算机都具有一定的计算能力&#xff0c;他们之间互相传递数据&#xff0c;实现信息共享&…

用3D扫描生成合成数据

合成数据集&#xff08;Synthetic Datasets&#xff09;正在成为计算机视觉模型训练的标准部分。 虽然新工具使合成数据集变得更容易访问&#xff0c;但除了标准机器学习过程之外&#xff0c;许多工具还需要对 3D 建模有基本的了解。 最简单的捷径是从现实世界中获取现有对象并…

Vue中的v-if和v-show指令有什么区别?

在Vue中,v-if和v-show是两个常用的指令,用于根据条件控制元素的显示和隐藏。虽然它们都可以根据条件来切换元素的可见性,但它们的实现和行为有一些区别。 1:编译时机: v-if是在编译阶段进行条件判断,如果条件为false,则在DOM中不会渲染该元素及其子元素;v-show则是在运…

基于材料生成优化的BP神经网络(分类应用) - 附代码

基于材料生成优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于材料生成优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.材料生成优化BP神经网络3.1 BP神经网络参数设置3.2 材料生成算法应用 4.测试结果…

28 mysql 数据记录的 存储更新删除

前言 前面 我们探讨了 索引记录的 新增, 更新, 删除 这里 我们来看一下 mysql 的核心数据记录的 新增更新删除 这里 来看一下 增删改 的相关实现 数据记录 和 索引记录 的处理方式是一致的 mysql 数据记录的存储 新增部分参见 自增长主键的实现 以及 记录的插入 mysql…

keep-alive 是 Vue 的一个内置组件,用于缓存其他组件的实例,以避免重复渲染和销毁,它可以在需要频繁切换的组件之间提供性能优化

目录 keep-alive 使用 keep-alive 的示例代码&#xff1a; 手动清除组件缓存的示例代码&#xff1a; keep-alive 组件有以下几个优点&#xff1a; keep-alive 的原理&#xff1a; 使用 keep-alive 组件&#xff0c;你可以包裹需要缓存的组件&#xff0c;然后这些组件在切…

1.3 矩阵

一、向量与矩阵 下面是三个向量 u \boldsymbol u u、 v \boldsymbol v v、 w \boldsymbol w w&#xff1a; u [ 1 − 1 0 ] v [ 0 1 − 1 ] w [ 0 0 1 ] \boldsymbol u\begin{bmatrix}\,\,\,\,1\\-1\\\,\,\,\,0\end{bmatrix}\kern 10pt\boldsymbol v\begin{bmatrix}\,\,\,…

RemObjects Elements 12.0 Crack

Elements 是一个现代多功能软件开发工具链。 它支持六种流行的编程语言&#xff1a;Oxygene (Object Pascal)、C#、Java、Mercury (Visual Basic.NET™)、Go 和 Swift&#xff0c;适用于所有现代平台。 使用 Elements&#xff0c;您可以为您喜欢的任何平台进行编程- 无论是单…

基于Ubuntu Server编译YTM32 SDK工程

基于Ubuntu Server编译YTM32 SDK工程 文章目录 基于Ubuntu Server编译YTM32 SDK工程需求下载软件包安装与配置配置虚拟机联网模式启用ssh连接启用ftp连接安装armgcc编译工具链确认make工具 验证 需求 在Linux系统环境下搭建SDK的编译环境&#xff1a; 方便加入到持续集成工具…

中间件安全-CVE复现IISApacheTomcatNginx漏洞复现

目录 中间件安全&CVE复现&IIS&Apache&Tomcat&Nginx漏洞复现中间件-IIS安全问题中间件-Nginx安全问题漏洞复现Nginx 解析漏洞复现Nginx 文件名逻辑漏洞 中间件-Apache-RCE&目录遍历&文件解析等安全问题漏洞复现漏洞复现CVE_2021_42013 RCE代码执行&…

TCP/IP(二十二)TCP 实战抓包分析(六)TCP 快速建立连接

一 TCP Fast Open 快速建立连接 说明&#xff1a; 之前讲解TCP 相关知识点遗漏了这个知识点,补充上 ① TFO简介 ② 请求 Fast Open Cookie过程 "原理图" ③ 真正开始 TCP Fast Open 重点&#xff1a; TFO 使 SYN包 可以包含payload 数据 ④ 抓包分析 1、…

AD20原理图库的制作

1、打开“51单片机最小系统”的工程文件。 2、创建原理图库文件&#xff1a;单击“文件”菜单&#xff0c;选择“新的”选项中的“库”选项&#xff0c;再选择“原理图库”&#xff0c;进入原理图库元件的编辑界面。 3、保存原理图库文件&#xff1a;选择“文件”菜单&#xff…

CPU飙高问题排查命令

1. 远程客户端连接服务器,top命令查看cpu占用最高的进程id 2. (top -H -p 进程pid) 命令: 找出进程里面线程占用CPU高的线程有哪些 ? 3. (printf 0x%x\n 线程id) 线程id转16进制 4. (./jstack PID | grep TID(十六进制) -A 30)

设计模式之建造者模式

什么是建造者模式 建造者模式是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式。这种模式将一个复杂的构建与其表示相分离&#xff0c;使得同样的构建过程可以创建不同的表示。 举一个简单的例子&#xff1a;假设我们要创建一个复杂的对象&#xff0c;例如一…

vscode摸鱼插件开发

不知道大家在写代码的时候&#xff0c;摸不摸鱼&#xff0c;是不是时不时得打开一下微博&#xff0c;看看今天发生了什么大事&#xff0c;又有谁塌房&#xff0c;而你没有及时赶上。 为此&#xff0c;我决定开发一个vscode插件&#xff0c;来查看微博热搜 插件名称&#xff1…

influxDB学习记录

一、官网 influxdb官方英文文档&#xff1a;https://docs.influxdata.com/influxdb/v1.8/query_language/spec/influxdb中文文档&#xff1a;https://jasper-zhang1.gitbooks.io/influxdb/content/ 二、centos安装与基本配置 influxdb安装与基本配置&#xff08;centos) 三…

论文阅读[51]通过深度学习快速识别荧光组分

【论文基本信息】 标题&#xff1a;Fast identification of fluorescent components in three-dimensional excitation-emission matrix fluorescence spectra via deep learning 标题译名&#xff1a;通过深度学习快速识别 三维激发-发射矩阵荧光光谱中的荧光组分 期刊与年份&…