我正在构建一个股票筛选器,该筛选器通过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
如果能帮助我找到问题,将不胜感激!
答案 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) {