优快云、牛客、雪球、公众号同步首发:
闲得慌,其实可以手写的,主要是想复习一下Java(不是。。
首先,在中证指数官网下载沪深300的样本权重EXCEL
下载后,我把股票名和对应权重合并到了紧邻的两列,方便后续操作
筛选标准1:沪深300的前50大权重
编写一个简单的Java程序,利用HashMap结构,key存股票名,value存权重值(本来想反过来方便排序的,结果发现NPE了,因为权重可能有重复值)
public static void main(String[] args) {
Map<String, String> stockMap = new HashMap<>();
Scanner input = new Scanner(System.in);
for (int i = 0; i < 300; i ++) {
String[] stock = input.nextLine().split("\t");
stockMap.put(stock[0], stock[1]);
}
List<Map.Entry<String,String>> list = new ArrayList<>(stockMap.entrySet());
list.sort((o1, o2) -> o2.getValue().compareTo(o1.getValue()));
int i = 0;
for (Map.Entry<String, String> stock : list) {
System.out.println(stock.getKey() + "\t" + stock.getValue());
if (i++ >= 50) {
break;
}
}
}
run:
把EXCEL的两列作为输入(Ctrl+Shift+↓快速选中两列,然后Ctrl+C/V)
程序自动输出了沪深300权重前50的股票
然后复制到EXCEL中:
筛选标准2:证券之星评级
人肉搜索股票
人肉搜索评级
根据上述EXCEL和我在雪球人工查了50支股票的评级信息,我制作出了下表:
编写Java程序,以沪深300权重作为35%权重,好公司作为45%权重,好价格作为8%权重和好估值作为12%权重(多次测试得出的合理取值):
public static void main(String[] args) {
List<StockInfo> stockInfos = new ArrayList<>();
Scanner input = new Scanner(System.in);
for (int i = 0; i <= 50; i++) {
String[] stock = input.nextLine().split("\t");
StockInfo stockInfo = new StockInfo(stock[0],
Double.parseDouble(stock[1]),
Double.parseDouble(stock[2]),
Double.parseDouble(stock[3]),
Double.parseDouble(stock[4]));
double rating = stockInfo.weight * 37.5 + stockInfo.goodCompany * 45 +
stockInfo.goodPrice * 8 + stockInfo.goodPE * 9.5;
stockInfo.setRating(rating);
stockInfos.add(stockInfo);
}
stockInfos.sort((o1, o2) -> (int) (o2.rating - o1.rating));
for (StockInfo stock : stockInfos) {
System.out.println(stock.name + "\t" + String.format("%.3f",stock.rating/100));
}
}
输入EXCEL中的数据,得到评分最靠前的20名公司: