All Downloads are FREE. Search and download functionalities are using the official Maven repository.

quant.fans.provider.TopListDataProvider Maven / Gradle / Ivy

The newest version!
package quant.fans.provider;

import com.google.common.collect.Lists;
import com.google.gson.Gson;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import quant.fans.common.Utils;
import quant.fans.downloader.BasicDownloader;
import quant.fans.downloader.Downloader;
import quant.fans.model.StockData;

import java.util.Date;
import java.util.List;

/**
 * 龙虎榜数据
 * 数据来源
 *      http://data.eastmoney.com/stock/stockstatistic.html
 *      http://vip.stock.finance.sina.com.cn/q/go.php/vInvestConsult/kind/lhb/index.phtml
 * author: eryk
 * mail: [email protected]
 * date: 15-9-16.
 */
public class TopListDataProvider {
    /**
     * 每日龙虎榜详情
     * param1=yyyy-MM-dd
     */
    public static String dailyTopURL = "http://data.eastmoney.com/stock/lhb/%s.html";

    /**
     * 东方财富网    个股龙虎榜统计
     * stat,月份,1,3,6,12或其他
     * st,按列排序:
     *      2=龙虎榜成交金额(万)
     *      3=上榜次数
     *      4=买入额(万)
     *      5=卖出额(万)
     *      6=净额(万)
     * rt=8位随机数,貌似是30秒间隔
     */
    public static String stockHistoryTopURL = "http://datainterface.eastmoney.com/EM_DataCenter/JS.aspx?type=LHB&sty=GGTJ&" +
            "stat=%&st=%s&ps=5000&rt=%s";
    /**
     * 新浪网    个股龙虎榜统计
     * last,天数,5,10,30,60
     * p:页数
     */
    public static String sinaStockHistoryTopURL = "http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/ggtj/index.phtml?last=%s&p=%s";

    /**
     * 营业部上榜统计
     */
    public static String sinaBusinessHistoryTopURL = "http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/yytj/index.phtml?last=5&p=1";

    /**
     * 机构席位追踪
     * last:天数,5,10,30,60
     * p:页数
     */
    public static String sinaOrganizationTopURL = "http://vip.stock.finance.sina.com.cn/q/go.php/vLHBData/kind/jgzz/index.phtml?last=%s&p=%s";

    /**
     * 机构席位成交明细
     * ps:最近多少条
     */
    public static String eastMoneyOrganizationDetail = "http://datainterface.eastmoney.com/EM_DataCenter/JS.aspx?type=LHB&sty=JGXWMX&p=1&ps=%s&rt=48090807";

    /**
     * 每日龙虎榜详情
     * @param date yyyyMMdd
     * @return stock data list
     */
    public static List getDailyTopList(String date){
        Date day = Utils.str2Date(date,"yyyyMMdd");

        List stockDataList = Lists.newArrayListWithExpectedSize(50);
        String url  = String.format(dailyTopURL,Utils.formatDate(day,"yyyy-MM-dd"));
        String htmlSource = Downloader.download(url);
        Elements table = Jsoup.parse(htmlSource).getElementById("dt_1").getElementsByTag("tbody").get(0).select("tr[class^=all]");
        Elements tmpLine = null;
        for(Element tr:table){
            Elements td = tr.getElementsByTag("td");
            if(td.size()==11){
                tmpLine = td;
                StockData stockData = new StockData(td.get(1).text());
                stockData.name = td.get(2).text();
                stockData.date = Utils.str2Date(date, "yyyy-MM-dd");
                stockData.attr("change",td.get(4).text());
                stockData.attr("龙虎榜成交额(万)",td.get(5).text());
                stockData.attr("买入额(万)",td.get(6).text());
                stockData.attr("买入额占总成交比例",td.get(7).text());
                stockData.attr("卖出额(万)",td.get(8).text());
                stockData.attr("卖出额占总成交比例",td.get(9).text());
                stockData.attr("reason",td.get(10).text());
                stockDataList.add(stockData);
            }else if(td.size()==6){
                StockData stockData = new StockData(tmpLine.get(1).text());
                stockData.name = tmpLine.get(2).text();
                stockData.date = Utils.str2Date(date, "yyyy-MM-dd");
                stockData.attr("change",tmpLine.get(4).text());
                stockData.attr("龙虎榜成交额(万)",td.get(5).text());
                stockData.attr("买入额(万)",td.get(0).text());
                stockData.attr("买入额占总成交比例",td.get(1).text());
                stockData.attr("卖出额(万)",td.get(2).text());
                stockData.attr("卖出额占总成交比例",td.get(3).text());
                stockData.attr("reason",td.get(4).text());
                stockDataList.add(stockData);
            }
        }
        return stockDataList;
    }

    /**
     * 个股龙虎榜统计
     * @param dayCount 取值:5,10,30,60
     * @return stock data list
     */
    public static List getStockRanking(int dayCount){
        int pageCount = getPageCount(sinaStockHistoryTopURL,dayCount);
        String url;
        String data;
        Document doc;
        List stockDataList = Lists.newLinkedList();
        for(int i=1;i<=pageCount;i++){
            url =String.format(sinaStockHistoryTopURL,dayCount,i);
            data = BasicDownloader.download(url,"gb2312");
            doc = Jsoup.parse(data);

            Elements trList = doc.getElementById("dataTable").getElementsByTag("tbody").get(0).getElementsByTag("tr");
            for(Element tr:trList){
                Elements tdList = tr.getElementsByTag("td");
                StockData stockData = new StockData(tdList.get(0).text());
                stockData.name = tdList.get(1).text();
                stockData.put("上榜次数",Double.parseDouble(tdList.get(2).text()));
                stockData.put("累积购买额(万)",Double.parseDouble(tdList.get(3).text()));
                stockData.put("累积卖出额(万)",Double.parseDouble(tdList.get(4).text()));
                stockData.put("净额(万)",Double.parseDouble(tdList.get(5).text()));
                stockData.put("买入席位数",Double.parseDouble(tdList.get(6).text()));
                stockData.put("卖出席位数",Double.parseDouble(tdList.get(7).text()));
                stockDataList.add(stockData);
            }
        }
        return stockDataList;
    }

    public static List getOrganizationRanking(int dayCount){
        int pageCount = getPageCount(sinaOrganizationTopURL,dayCount);
        String url;
        String data;
        Document doc;
        List stockDataList = Lists.newLinkedList();
        for(int i=1;i<=pageCount;i++){
            url =String.format(sinaOrganizationTopURL,dayCount,i);
            data = BasicDownloader.download(url,"gb2312");
            doc = Jsoup.parse(data);

            Elements trList = doc.getElementById("dataTable").getElementsByTag("tbody").get(0).getElementsByTag("tr");
            for(Element tr:trList){
                Elements tdList = tr.getElementsByTag("td");
                System.out.println(tdList.html());
                StockData stockData = new StockData(tdList.get(0).text());
                stockData.name = tdList.get(1).text();
//                stockData.put("close",Double.parseDouble(tdList.get(2).text()));
//                stockData.put("change",Double.parseDouble(tdList.get(3).text()));
                stockData.put("累积买入额(万)",Double.parseDouble(tdList.get(4).text()));
                stockData.put("买入次数",Double.parseDouble(tdList.get(5).text()));
                stockData.put("累积卖出额(万)",Double.parseDouble(tdList.get(6).text()));
                stockData.put("卖出次数",Double.parseDouble(tdList.get(7).text()));
                stockData.put("净额(万)",Double.parseDouble(tdList.get(8).text()));
                stockDataList.add(stockData);
            }
        }
        return stockDataList;
    }

    /**
     * 机构席位成交明细
     * @param count count
     * @return stock data list
     */
    public static List getOrganizationDetailRanking(int count){
        List stockDataList = Lists.newLinkedList();
        String url = String.format(eastMoneyOrganizationDetail, count);
        String data = Downloader.download(url);
        Gson gson = new Gson();
        List records = gson.fromJson(data.substring(1, data.length() - 1), List.class);
        for(String record:records){
            String[] fields = record.split(",",6);
            StockData stockData= new StockData(fields[2].substring(0,6));
            stockData.name = fields[4];
            stockData.date = Utils.str2Date(fields[5],"yyyy-MM-dd");

            stockData.attr("reason",fields[0]);
            stockData.put("机构席位卖出",Double.parseDouble(fields[1]));
            stockData.put("机构席位买入",Double.parseDouble(fields[3]));
            stockDataList.add(stockData);
        }
        return stockDataList;
    }

    private static int getPageCount(String baseURL,int dayCount) {
        String url =String.format(baseURL,dayCount,1);
        String data = BasicDownloader.download(url, "gb2312");
        Document doc = Jsoup.parse(data);
        return doc.select("div[class=pages]").get(0).getElementsByTag("a").size()-2;
    }

    public static void main(String[] args) {
        List stockDataList = TopListDataProvider.getDailyTopList("2015-09-17");
        for(StockData stockData:stockDataList){
            System.out.println(stockData.toString());
            Utils.printMapStr(stockData.attribute);
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy