基于Java语言开发的个性化股票分析技术 量能突破模型EnergeBreak.doc
基于Java语言开发的个性化股票分析技术:量能突破模型(Energe-Break)一个用量能指标作为判定依据的条件分析模型,根据最近5天内是否有量能平台的突破以及涨跌幅的大小给每只股票评分评价,给用户明确的建议。迅动股票分析平台在此基础上利用Java语言开发了量能突破模型(Energe-Break),源代码如下:XML描述:<?xml version="1.0" encoding="UTF-8" ?><analyser shortName="Energe-Break" fullName="量能突破模型" class="u008660011.model.analyser.eb.EBAnalyser"> <!- 参数列表 -> <paramList> <param shortName="N" value="40" fullName="天数"/> <param shortName="C" value="20" fullName="加减分系数"/> </paramList> <!- 数据列表 -> <dataList> <data shortName="StkDailyK" /> <data shortName="IdxDailyK" /> <data shortName="BlkDailyK" /> </dataList> <description> 一个用量能指标作为判定依据的条件分析模型,根据最近5天内是否有量能平台的突破以及涨跌幅的大小给每只股票评分评价,给用户明确的建议。 </description></analyser>Java代码:/* * (#)EBnalyser.java * * Copyright Hangzhou Shengren Software Tech. Co., Ltd. */package u008660011.model.analyser.eb;import java.rmi.RemoteException;import java.util.List;import org.apache.commons.lang.math.NumberUtils;import com.shengrensoft.stock.center.common.util.DateUtil;import com.shengrensoft.stock.center.common.util.StkAnalysisUtil;import com.shengrensoft.stock.center.data.Data;import com.shengrensoft.stock.center.data.StkDailyK.StkDailyKData;import com.shengrensoft.stock.center.data.IdxDailyK.IdxDailyKData;import com.shengrensoft.stock.center.data.BlkDailyK.BlkDailyKData;import com.shengrensoft.stock.center.model.ModelParam;import com.shengrensoft.stock.center.model.analyser.AbstractAnalyser;import com.shengrensoft.stock.center.model.analyser.AnalysisValue;/* * <code>EB</code>量能突破分析模型的实现类。 * * author 迅动平台 2012/09/20 新建 */public class EBAnalyser extends AbstractAnalyser /* 序列版本ID */ private static final long serialVersionUID = -732447148977150017L; / 参数名定义 /* 参数名:N天数 */ private static final String PARAM_N = "N" /* 参数名:加减分系数 */ private static final String PARAM_CONFICENT = "C" /* * 构造方法。 */ public EBAnalyser() throws RemoteException /* * 分析买入点的变化。 * * param stkCode 证券代码 * param transDate 交易日期 * param paramsList 模型参数列表 * * return 分析结果(含评分和评价) */ public AnalysisValue doAnalysis( String stkCode, java.util.Date transDate, List<ModelParam> paramsList) throws RemoteException AnalysisValue analysisValue = null; / 股票代码合法性检查 if (stkCode = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("股票代码不合法,分析失败。"); return analysisValue; / 交易日期合法性检查 if (transDate = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("交易日期不合法,分析失败。"); return analysisValue; / 参数列表合法性检查 if (paramsList = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("参数列表不合法,分析失败。"); return analysisValue; / 取得分析所需的模型参数 int paramN = 0; int paramCONFICENT = 0; for (ModelParam param : paramsList) if (PARAM_N.equals(param.getShortName() paramN = NumberUtils.toInt(param.getValue(); else if (PARAM_CONFICENT.equals(param.getShortName() paramCONFICENT = NumberUtils.toInt(param.getValue(); else return null; / 发现一个意外的模型参数 / 天数的合法性检查 if (paramN < 1) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("天数不合法,分析失败。"); return analysisValue; / (%)加减分系数 if (paramCONFICENT < 1 | paramCONFICENT > 99) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("加减分系数,分析失败。"); return analysisValue; / 判别证券代码类型(是否为股票代码,股指代码,板指代码),分别进行分析 StkAnalysisUtil stkAnalysisUtil = super.getStkAnalysisUtil(); if (stkAnalysisUtil.isStkCode(stkCode) analysisValue = this.analyseStk(stkCode, transDate, paramN, paramCONFICENT); if (analysisValue = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("公司新上市或该天缺少数据,分析失败!"); return analysisValue; else if (stkAnalysisUtil.isIdxCode(stkCode) analysisValue = this.analyseIdx(stkCode, transDate, paramN, paramCONFICENT); if (analysisValue = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("公司新上市或该天缺少数据,分析失败!"); return analysisValue; else if (stkAnalysisUtil.isBlkCode(super.getUserId(), stkCode) analysisValue = this.analyseBlk(stkCode, transDate, paramN, paramCONFICENT); if (analysisValue = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("公司新上市或该天缺少数据,分析失败!"); return analysisValue; else analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("证劵代码类型不符,分析失败!"); return analysisValue; /* * 根据能量突破提示的不同,对股票进行分析、评分、评价。 * * param stkCode 股票代码 * param transDate 交易日期 * param paramN 天数 * param paramCONFICENT (%)加减分系数 * * return 返回结果(含评分和评价) */ private AnalysisValue analyseStk( String stkCode, java.util.Date transDate, int paramN, int paramCONFICENT) AnalysisValue analysisValue = null; / 计算TTJ值 Integer TTJ = calcStkTTJ(stkCode, transDate, paramN); if (TTJ = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("数据不足,分析失败"); return analysisValue; / 计算资金增幅百分比 Double pricePerct = calcStkPricePerct(stkCode, transDate); if (pricePerct = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("数据不足,分析失败"); return analysisValue; / 近几日出现量能平台 if (TTJ < 5 && TTJ >=1 && pricePerct > 0) java.util.Date date = transDate; int count = 0; / 将date移至量能突破的当天 do date = super.getStkTransDateUtil() .getBeforeTransDate(stkCode, date); count +; while (count < TTJ); Integer score = null; java.util.Date platformDate = date; Integer platformClose = null; Integer platformOpen = null; Integer halfPlatform = null; / 日K线的1/2处 boolean flag = true; / 用来判断当前true:看涨,false:看跌 Double doubleRange = null;/ 当天相对于量能平台的涨跌幅 Integer intRange = null; do String dateStr = DateUtil.getFormatedDate(date, "yyyyMMdd"); / 取得个股的当日日K数据 StkDailyKData dailyKData = (StkDailyKData) super.getUsingDataList().getDailyData( Data.DataName.StkDailyKData.getShortName(), stkCode, date); if (dailyKData = null) return null; Integer open = dailyKData.getOpen(dateStr); if (open = null) return null; Integer close = dailyKData.getClose(dateStr); if (date = platformDate)/ 量能平台当天 platformClose = close; platformOpen = open; halfPlatform = Math.abs(close - open) / 2 + platformOpen; else / 计算当天相对于量能平台的涨跌幅 doubleRange = 100.0 * (close - platformClose) / platformClose; intRange = doubleRange.intValue(); if (platformOpen < platformClose)/ 量能平台当天K线为阳线 if(doubleRange < 0) / 看跌 / 如果是量能平台出现后的第一天或者跌破阳线1/2 if (score = null | (flag = true && close < halfPlatform) score = 20; flag = false; else if (close > halfPlatform) score += intRange; else score -= intRange; else / 看涨 if(score = null) score = 90; else score -= intRange; else / 量能平台当天K线为阴线 if (doubleRange < 0) / 看跌 if(score = null | flag = true) score = 20; flag = false; else score -= intRange; else / 看涨 if(score = null) score = 90; else score -= intRange; date = super.getStkTransDateUtil().getNextTransDate(stkCode, date); while (!date.after(transDate); analysisValue = this.assertValue(stkCode, transDate, score, intRange, flag, TTJ); return analysisValue; else / 近几日无量能平台出现 analysisValue = new AnalysisValue(); analysisValue.setStkCode(stkCode); analysisValue.setResultScore(40); analysisValue.setResultDesc("近几日未出现量能平台,保持观望"); return analysisValue; /* * 根据能量突破提示的不同,对股指进行分析、评分、评价。 * * param idxCode 股指代码 * param transDate 交易日期 * param paramN 天数 * param paramCONFICENT (%)加减分系数 * * return 返回结果(含评分和评价) */ private AnalysisValue analyseIdx( String idxCode, java.util.Date transDate, int paramN, int paramCONFICENT) AnalysisValue analysisValue = null; / 计算TTJ值 Integer TTJ = calcIdxTTJ(idxCode, transDate, paramN); if (TTJ = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(idxCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("数据不足,分析失败"); return analysisValue; / 计算资金增幅百分比 Double pricePerct = calcIdxPricePerct(idxCode, transDate); if (pricePerct = null) analysisValue = new AnalysisValue(); analysisValue.setStkCode(idxCode); analysisValue.setResultScore(0); analysisValue.setResultDesc("数据不足,分析失败"); return analysisValue; / 近几日出现量能平台 if (TTJ < 5 && TTJ >=1 && pricePerct > 0) java.util.Date date = transDate; int count = 0; / 将date移至量能突破的当天 do date = super.getStkTransDateUtil() .getBeforeTransDate(date); count +; while (count < TTJ); Integer score = null; java.util.Date platformDate = date; Integer platformClose = null; Integer platformOpen = null; Integer halfPlatform = null; / 日K线的1/2处 boolean flag = true; / 用来判断当前true:看涨,false:看跌 Double doubleRange = null;/ 当天相对于量能平台的涨跌幅 Integer intRange = null; do String dateStr = DateUtil.getFormatedDate(date, "yyyyMMdd"); / 取得个股的当日日K数据 IdxDailyKData dailyKData = (IdxDailyKData) super.getUsingDataList().getDailyData( Data.DataName.IdxDailyKData.getShortName(), idxCode, date); if (dailyKData = null) return null; Integer open = dailyKData.getOpen(dateStr); if (open = null) return null; Integer close = dailyKData.getClose(dateStr); if (date = platformDate)/ 量能平台当天 platformClose = close; platformOpen = open; halfPlatform = Math.abs(close - open) / 2 + platformOpen; else