|
@@ -65,6 +65,8 @@ func CheckAnalysisCorrelationExtraConfig(extraConfig tradeAnalysisModel.Correlat
|
|
|
|
|
|
|
|
|
func GetCorrelationTableRowsDataByConfig(tableConfig tradeAnalysisModel.CorrelationTableExtraConfig) (tables []*tradeAnalysisModel.CorrelationTableData, err error) {
|
|
|
+ tables = make([]*tradeAnalysisModel.CorrelationTableData, 0)
|
|
|
+
|
|
|
|
|
|
baseDateData := make(map[time.Time]float64)
|
|
|
{
|
|
@@ -103,7 +105,7 @@ func GetCorrelationTableRowsDataByConfig(tableConfig tradeAnalysisModel.Correlat
|
|
|
}
|
|
|
|
|
|
|
|
|
- tradeData, e := GetCorrelationTableTradeData(tableConfig.Exchange, []string{tableConfig.ClassifyName}, contracts, tableConfig.CompanyNames, tableConfig.PredictRatio)
|
|
|
+ tradeData, e := GetCorrelationTableTradeData(tableConfig.Exchange, tableConfig.ClassifyName, contracts, tableConfig.CompanyNames, tableConfig.PredictRatio, tableConfig.ContractType)
|
|
|
if e != nil {
|
|
|
err = fmt.Errorf("获取[合约+期货公司]持仓数据失败, %v", e)
|
|
|
return
|
|
@@ -118,34 +120,37 @@ func GetCorrelationTableRowsDataByConfig(tableConfig tradeAnalysisModel.Correlat
|
|
|
|
|
|
|
|
|
maxPre := 10
|
|
|
- startDate := baseDate.AddDate(0, 0, -maxPre)
|
|
|
- endDate := baseDate
|
|
|
- rowDays := utils.GetTradingDays(baseDate.AddDate(0, 0, -20), baseDate)
|
|
|
+ startBase := baseDate.AddDate(0, 0, -maxPre)
|
|
|
+
|
|
|
+
|
|
|
+ rowDays := utils.GetTradingDays(baseDate.AddDate(0, 0, -20), baseDate)
|
|
|
rowDays = utils.ReverseTimeSlice(rowDays)
|
|
|
rowDays = rowDays[:11]
|
|
|
- tables = make([]*tradeAnalysisModel.CorrelationTableData, 0)
|
|
|
for _, rc := range tableConfig.RollConfig {
|
|
|
tableData := new(tradeAnalysisModel.CorrelationTableData)
|
|
|
tableData.CalculateValue = rc.CalculateValue
|
|
|
tableData.LeadValue = rc.LeadValue
|
|
|
tableData.RowsData = make([]*tradeAnalysisModel.CorrelationTableRowData, 0)
|
|
|
|
|
|
+
|
|
|
+ startDate := startBase.AddDate(0, 0, -(rc.CalculateValue + rc.LeadValue + 60))
|
|
|
+
|
|
|
for kd, kv := range tradeEdbList {
|
|
|
row := new(tradeAnalysisModel.CorrelationTableRowData)
|
|
|
row.Exchange = kv.Exchange
|
|
|
row.CompanyName = kv.CompanyName
|
|
|
row.ClassifyName = kv.ClassifyName
|
|
|
row.ClassifyType = kv.ClassifyType
|
|
|
-
|
|
|
+
|
|
|
if kv.IsTotal {
|
|
|
- row.RowName = kv.ClassifyType
|
|
|
+ row.RowName = fmt.Sprintf("%s%s%s", kv.ClassifyName, kv.CompanyName, tradeAnalysisModel.WarehouseTypeSuffixNames[kv.ContractPosition])
|
|
|
} else {
|
|
|
row.RowName = fmt.Sprintf("%s%s%s", kv.ClassifyType, kv.CompanyName, tradeAnalysisModel.WarehouseTypeSuffixNames[kv.ContractPosition])
|
|
|
}
|
|
|
row.DayData = make([]*tradeAnalysisModel.CorrelationTableRowDayData, 0)
|
|
|
|
|
|
|
|
|
- rd, e := CalculateRollCorrelationData(rc.CalculateValue, rc.LeadValue, baseDateData, tradeEdbDataMap[kd], startDate, endDate)
|
|
|
+ rd, e := CalculateRollCorrelationData(rc.CalculateValue, rc.LeadValue, baseDateData, tradeEdbDataMap[kd], startDate, baseDate)
|
|
|
if e != nil {
|
|
|
err = fmt.Errorf("计算行数据-滚动相关性失败, %v", e)
|
|
|
return
|
|
@@ -211,154 +216,76 @@ func GetTopContractsByType(contractType int, exchange, classifyName string, base
|
|
|
|
|
|
|
|
|
func CalculateRollCorrelationData(calculateValue, leadValue int, baseEdbData map[time.Time]float64, changeEdbData map[time.Time]int, startDate, endDate time.Time) (dateRatio map[time.Time]float64, err error) {
|
|
|
-
|
|
|
+ dateRatio = make(map[time.Time]float64)
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
startDate = startDate.AddDate(0, 0, 1)
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- changeDataMap := make(map[time.Time]float64)
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- changeDataMap = MoveDataDaysToNewDataList(changeEdbData, leadValue)
|
|
|
+
|
|
|
+ changeDataMap := MoveDataDaysToNewDataList(changeEdbData, leadValue)
|
|
|
|
|
|
|
|
|
-
|
|
|
calculateDay := calculateValue
|
|
|
|
|
|
var minRatio, maxRatio float64
|
|
|
- dateRatio = make(map[time.Time]float64)
|
|
|
|
|
|
- {
|
|
|
- startDateTime := startDate
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- endDateTime := endDate.AddDate(0, 0, -(calculateDay - 1))
|
|
|
-
|
|
|
-
|
|
|
- var isStart, isNotFirst bool
|
|
|
- for currDay := startDateTime; !currDay.After(endDateTime); currDay = currDay.AddDate(0, 0, 1) {
|
|
|
- yCalculateData := make([]float64, 0)
|
|
|
- baseCalculateData := make([]float64, 0)
|
|
|
-
|
|
|
-
|
|
|
- for i := 0; i < calculateDay; i++ {
|
|
|
-
|
|
|
- iDay := currDay.AddDate(0, 0, i)
|
|
|
-
|
|
|
- tmpBaseValue, ok1 := baseEdbData[iDay]
|
|
|
- tmpChangeValue, ok2 := changeDataMap[iDay]
|
|
|
- if !ok1 || !ok2 {
|
|
|
- continue
|
|
|
- }
|
|
|
- baseCalculateData = append(baseCalculateData, tmpBaseValue)
|
|
|
- yCalculateData = append(yCalculateData, tmpChangeValue)
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- if len(baseCalculateData) == 0 {
|
|
|
+ startDateTime := startDate
|
|
|
+ endDateTime := endDate.AddDate(0, 0, -(calculateDay - 1))
|
|
|
+
|
|
|
+
|
|
|
+ var isStart, isNotFirst bool
|
|
|
+ for currDay := startDateTime; !currDay.After(endDateTime); currDay = currDay.AddDate(0, 0, 1) {
|
|
|
+ yCalculateData := make([]float64, 0)
|
|
|
+ baseCalculateData := make([]float64, 0)
|
|
|
+
|
|
|
+
|
|
|
+ for i := 0; i < calculateDay; i++ {
|
|
|
+ iDay := currDay.AddDate(0, 0, i)
|
|
|
+
|
|
|
+ tmpBaseValue, ok1 := baseEdbData[iDay]
|
|
|
+ tmpChangeValue, ok2 := changeDataMap[iDay]
|
|
|
+ if !ok1 || !ok2 {
|
|
|
continue
|
|
|
}
|
|
|
-
|
|
|
- ratio := utils.CalculateCorrelationByIntArr(baseCalculateData, yCalculateData)
|
|
|
+ baseCalculateData = append(baseCalculateData, tmpBaseValue)
|
|
|
+ yCalculateData = append(yCalculateData, tmpChangeValue)
|
|
|
+ }
|
|
|
|
|
|
-
|
|
|
- {
|
|
|
- if ratio != 0 {
|
|
|
- isStart = true
|
|
|
- }
|
|
|
+
|
|
|
+ if len(baseCalculateData) == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ ratio := utils.CalculateCorrelationByIntArr(baseCalculateData, yCalculateData)
|
|
|
|
|
|
- if !isStart {
|
|
|
- continue
|
|
|
- }
|
|
|
+
|
|
|
+ {
|
|
|
+ if ratio != 0 {
|
|
|
+ isStart = true
|
|
|
}
|
|
|
|
|
|
- dataTime := currDay.AddDate(0, 0, calculateDay-1)
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- ratio = math.Round(ratio*10000) / 10000
|
|
|
- dateRatio[dataTime] = ratio
|
|
|
-
|
|
|
- if !isNotFirst {
|
|
|
- minRatio = ratio
|
|
|
- maxRatio = ratio
|
|
|
- isNotFirst = true
|
|
|
- }
|
|
|
- if minRatio > ratio {
|
|
|
- minRatio = ratio
|
|
|
- }
|
|
|
- if maxRatio < ratio {
|
|
|
- maxRatio = ratio
|
|
|
+ if !isStart {
|
|
|
+ continue
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ dataTime := currDay.AddDate(0, 0, calculateDay-1)
|
|
|
+
|
|
|
+
|
|
|
+ ratio = math.Round(ratio*10000) / 10000
|
|
|
+ dateRatio[dataTime] = ratio
|
|
|
+
|
|
|
+ if !isNotFirst {
|
|
|
+ minRatio = ratio
|
|
|
+ maxRatio = ratio
|
|
|
+ isNotFirst = true
|
|
|
+ }
|
|
|
+ if minRatio > ratio {
|
|
|
+ minRatio = ratio
|
|
|
+ }
|
|
|
+ if maxRatio < ratio {
|
|
|
+ maxRatio = ratio
|
|
|
+ }
|
|
|
}
|
|
|
return
|
|
|
}
|