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 = 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,
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,
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了。所以,代码有一点冗余。
这就是未了的激情,不是一个句号。