无法遍历CSV列

时间:2018-09-23 03:52:12

标签: java loops csv finance stock

我正在构建一个股票筛选器,该筛选器通过csv文件的每一列应用计算。但是,当我运行for循环时,只能返回一个结果。

    String path = "C:/Users/0/Desktop/Git/Finance/Data/NQ100.csv";
    Reader buf = Files.newBufferedReader(Paths.get(path));
    CSVParser parsed = new CSVParser(buf, CSVFormat.DEFAULT.withFirstRecordAsHeader()
            .withIgnoreHeaderCase().withTrim());

    // Parse tickers
    Map<String, Integer> header = parsed.getHeaderMap();
    List<String> tickerList = new ArrayList<>(header.keySet());

    for (int x=1; x < tickerList.size(); x++) { <----------------------- PROBLEM

        // Accessing closing price by Header names
        List<Double> closeList = new ArrayList<>();
        for (CSVRecord record : parsed) {
            String stringClose = record.get(x);
            Double close = Double.valueOf(stringClose);
            closeList.add(close);
        }

        // Percentage Change
        List<Double> pctList = new ArrayList<>();
        for (int i=1; i < closeList.size(); i++) {
            Double pct = closeList.get(i) / closeList.get(i-1) - 1;
            pctList.add(pct);
        }

        // Statistics
        Double sum = 0.0, var = 0.0, mean, sd, rfr, sr;
        // Mean
        for (Double num : pctList) sum += num;
        mean = sum/pctList.size();
        // Standard Deviation
        for (Double num: pctList) var += Math.pow(num - mean, 2);
        sd = Math.sqrt(var/pctList.size());
        // Risk Free Rate
        rfr = Math.pow((1+0.03),(1/252.0))-1;
        // Sharpe Ratio
        sr = Math.sqrt(252) * ((mean-rfr)/sd);

        System.out.println(tickerList.get(x) + " " + sr);
    }

我的数据如下:

,AAL,AAPL,ADBE
2007-10-25,26.311651,23.141403,47.200001
2007-10-26,26.273216,23.384495,47.0
2007-10-29,26.004248,23.43387,47.0

所以我在期待:

AAL XXX
AAPL XXX
ADBE XXX

但是我得到了:

AAL 0.3604941921663456

如果能帮助我找到问题,将不胜感激!

2 个答案:

答案 0 :(得分:0)

所以这是对我有用的代码块,如果我理解您的问题,您只想从csv文件中“读取”每一列和每一行,希望对您有所帮助。

        br = new BufferedReader(new InputStreamReader(new FileInputStream(archivo), "UTF8"));
        while ((line = br.readLine()) != null) {                
            if(a!=0){
                String[] datos = line.split(cvsSplitBy);
                System.out.println(datos[0] + " - " + datos[1] + " - " + datos[2]);
            }
            a++;
        }         

答案 1 :(得分:0)

在您的情况下,Iterable实现CSVParser parsed时,您只能在 Java 中遍历Iterable<CSVRecord>

因此,您只有在计算 AAL 的统计信息时才第一次进行迭代,在分析 AAPL ADBE 的数据时被视为空的。

您可以通过parsed引入帮助程序列表init来解决此问题,并在{之前添加下一个代码(当然,这是一种单行解决方案,例如在Java 8中,但该选项也适用于早期版本)。 {1}}周期:

for

并更改下一行:

    List<CSVRecord> records = new ArrayList<>();
    for (CSVRecord record : parsed) {
        records.add(record);
    }

具有:

for (CSVRecord record : records) {

对于您提供的CSV,您将获得下一个输出:

for (CSVRecord record : parsed) {