Rust: 从csv文件转成kbar的尝试:速度,还有Julia和激情

Rust把传统的行情csv文件转成kbar,会是一种什么样的体验?虽然现在早已在Julia回测框架完成,但Rust是如何,总想试一试。

一、速度

说明一下:CSV文件结构:
表头:“日期 开盘 最高 最低 收盘 成交量 成交金额 未平仓合约”
是一个IC1505的数据,大约有5670行。这就是今天的试验数据,比较小。

extern crate stopwatch;
extern crate csv;
extern crate serde;
extern crate chrono; //=>date and time
extern crate encoding;
use stopwatch::Stopwatch;
use std::thread;
use std::io;
use std::time::{Duration, Instant};
use std::collections::HashMap;
use std::io::prelude::*;
use std::fs::File;
use std::io::BufReader;
use chrono::prelude::*;
mod module;
use module::strategy_base::*;
use module::strategy_data::*;
use encoding::{Encoding, DecoderTrap};
use chrono::{DateTime, UTC};
use encoding::all::GB18030;
use serde::{Deserialize, Serializer, Deserializer};
fn main() {
    let sw = Stopwatch::start_new();
    let path = "C:\\Users\\Desktop\\IC1505.csv";
    let chars = module::strategy_data::get_GB2_string(path);
    let mut rdr = csv::Reader::from_string(chars).has_headers(true);
    let mut flag = 1i32;
    let mut vecbar: Vec<kbar> = Vec::new();
    for row in rdr.decode() {
        let (_, code, strdate, open, high, low, close, volume, amount, oi): 
(
String,                                                                 String,                                                                            f64,                                                                             f64,                                                                            f64,                                                                             f64,                                                                             f64,                                                                             f64,                                                                             f64) = row.unwrap();
        flag = flag + 1i32;
        let date = Local.datetime_from_str(&strdate, "%Y-%m-%d %H:%M").unwrap();
        //代码    日期  开盘  最高  最低  收盘  成交量 成交金额    未平仓合约
        let tempbar = module::strategy_base::kbar::new(code,
date,
open,                                                       high,                                                       low,                                                       close,                                                       close,                                                       volume,                                                       amount,                                                       oi,                                                       0.0);
        vecbar.push(tempbar);
    }
    println!("kbar len {}", vecbar.len());
    println!(" It took {0:.8} ms", sw.elapsed_ms());
    thread::sleep_ms(500000);
}

其中,kbar是一个这样结构的struct:

pub struct kbar {
    pub Code: String,
    pub DateTime: DateTime<Local>,
    pub Close: f64,
    pub Open: f64,
    pub High: f64,
    pub Low: f64,
    pub PreClose: f64,
    pub OpenInterest: f64,
    pub Volume: f64,
    pub Amount: f64,
    pub Ratio: f64,
}
impl kbar {
    pub fn new(code: String,
               dt: DateTime<Local>,
               close: f64,
               open: f64,
               high: f64,
               low: f64,
               preclose: f64,
               oi: f64,
               volume: f64,
               amount: f64,
               ratio: f64)
               -> kbar {
        kbar {
            Code: code,
            DateTime: dt,
            Close: close,
            Open: open,
            High: high,
            Low: low,
            PreClose: preclose,
            OpenInterest: oi,
            Volume: volume,
            Amount: amount,
            Ratio: ratio,
        }
    }
}

速度呢?这是相关测试:csv =>vec!

把5670行的数据不断复制,放大,进行测试,得到相应的运行速度数据:

CSV数据约5670 行, 速度 => 20ms.
CSV数据约51030 行, 速度 => 139ms.
CSV数据约51030*2 行, 速度 => 284ms.
CSV数据约51030*4 行, 速度 => 603ms.
CSV数据约51030*8 行, 速度 => 1183ms.
CSV数据约51030*16 行, 速度 => 2386ms.

可以看到,接近82万行的CSV文件,全部处理完,大约2.4秒左右。

和Julia的比较:同样82万行的CSV文件(注:在去掉第一行的中文表头的情况下),只是readcsv阶段,暂不考虑转成kbar,Julia的速度约为1.5秒左右(三次测试) 。 可见Julia的确牛B.

tic()
path ="C:\\Users\\Desktop\\IC1505.csv";
data =readdlm(path,skipstart=1)
row,col =size(data); 
toc() # 1.5

当然,如果Rust程序中去掉相应的转换部分,上面的花时预计在1.2秒左右。也就是说,Rust和Julia在一个量级上。

二、激情

CSV库本来有decode()直接解构成struct的,但是我的kbar的DateTime的结构 是DateTime,不是String,我暂时还没有找到直接转换的方式(虽然编译没有问题,但一运行就出错)。只能先转换成String后,再转成kbar了。所以,代码有一点冗余。

这就是未了的激情,不是一个句号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值