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

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

The newest version!
package quant.fans.provider;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.gson.Gson;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import quant.fans.common.Utils;
import quant.fans.downloader.Downloader;
import quant.fans.model.BoardType;
import quant.fans.model.StockData;
import quant.fans.model.StockMarketType;
import quant.fans.model.Symbol;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * author: eryk
 * mail: [email protected]
 * date: 15-8-30.
 */
public class MinuteDataProvider {
    private static final Logger LOG = LoggerFactory.getLogger(MinuteDataProvider.class);

    private static final String minuteDataURL = "http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=%s&scale=%s&ma=no&datalen=1023";

    /**
     *  获取一段时间内股票数据,受数据源限制
     * @param symbol stock symbol
     * @param startDate yyyyMMdd
     * @param stopDate  yyyyMMdd
     * @param type      5,15,30,60
     * @return stock data list
     */
    public static List get(String symbol, String startDate, String stopDate, String type){
        Map> results = collect(symbol, Utils.str2Date(startDate,"yyyyMMdd"),Utils.str2Date(stopDate,"yyyyMMdd"),type);

        List stockList = Lists.newLinkedList();
        for(Map.Entry> entry:results.entrySet()) {
            StockData stockData = new StockData();
            stockData.stockMarketType = StockMarketType.getType(symbol);
            stockData.boardType = BoardType.getType(symbol);
            stockData.symbol = symbol;
            stockData.date = Utils.str2Date(entry.getValue().get("day"), "yyyy-MM-dd HH:mm:ss");

            stockData.put("open",Utils.str2Double(entry.getValue().get("open")));
            stockData.put("high",Utils.str2Double(entry.getValue().get("high")));
            stockData.put("low",Utils.str2Double(entry.getValue().get("low")));
            stockData.put("close",Utils.str2Double(entry.getValue().get("close")));
            stockData.put("volume",Utils.str2Double(entry.getValue().get("volume"))/100); //成交量 单位:手

            stockList.add(stockData);
        }
        return stockList;
    }

    private static Map> collect(String symbol,Date startDate,Date stopDate,String type) {
        String url = getPath(symbol,type);
        Map> stocks = Maps.newTreeMap();
        String data = Downloader.download(url);

        Pattern pattern = Pattern.compile("\\{([\\w|\"|,|:|\\s|.|-]*)\\}");
        Matcher matcher = pattern.matcher(data.trim());
        Gson gson = new Gson();
        while (matcher.find()) {
            //{day:"2015-08-13 13:55:00",open:"16.300",high:"16.320",low:"16.270",close:"16.290",volume:"390800"}
            Map map = gson.fromJson(matcher.group(), Map.class);
            Date date = Utils.str2Date(map.get("day"), "yyyy-MM-dd HH:mm:ss");
            if (date.getTime() >= startDate.getTime() && date.getTime() <=stopDate.getTime()) {
                stocks.put(Utils.toString(Utils.getRowkeyWithMd5PrefixAndDateSuffix(symbol, Utils.formatDate(date, "yyyyMMddHHmm"))), map);
            }
        }

        return stocks;
    }

    public static String getPath(String symbol,String type) {
        return String.format(minuteDataURL, Symbol.getSymbol(symbol, minuteDataURL), type);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy