예제 #1
0
        private DealerPositionFeature GenerateFeatures(ContractTransactionInfo info, IEnumerable <DealerPositionInfo> contextData)
        {
            if (0 == info.Volume || 0 == info.Position || info.OpenPrice <= 0 || info.ClosePrice <= 0 || info.SettlePrice <= 0)
            {
                return(null);
            }

            var positionContext = contextData.Where(d => d.Commodity.Equals(info.Commodity) && d.Month.Equals(info.Contract)).OrderBy(d => d.TransactionDate).ToArray();
            int index           = 0;
            int length          = positionContext.Length;

            for (; index < length; index++)
            {
                if (positionContext[index].TransactionDate.Equals(info.TransactionDate))
                {
                    break;
                }
            }

            if (index >= length)
            {
                return(null);
            }

            DealerPositionFeature feature = new DealerPositionFeature();

            feature.Id     = BuildId(info.TransactionDate, info.Commodity);
            feature.Volume = info.Volume;

            double buyPosition20  = GetAggregatedPosition(positionContext[index], 20, PositionType.Buy);
            double sellPosition20 = GetAggregatedPosition(positionContext[index], 20, PositionType.Sell);
            double buyPosition5   = GetAggregatedPosition(positionContext[index], 5, PositionType.Buy);
            double sellPosition5  = GetAggregatedPosition(positionContext[index], 5, PositionType.Sell);

            if (index > 10)
            {
                var historicalData = positionContext[index - 10];
                feature.TopBuy20Delta10  = CalculateRatio(GetAggregatedPosition(historicalData, 20, PositionType.Buy), buyPosition20);
                feature.TopSell20Delta10 = CalculateRatio(GetAggregatedPosition(historicalData, 20, PositionType.Sell), sellPosition20);
                feature.TopBuy5Delta10   = CalculateRatio(GetAggregatedPosition(historicalData, 5, PositionType.Buy), buyPosition5);
                feature.TopSell5Delta10  = CalculateRatio(GetAggregatedPosition(historicalData, 5, PositionType.Sell), sellPosition5);
            }

            if (index > 3)
            {
                var historicalData = positionContext[index - 3];
                feature.TopBuy20Delta3  = CalculateRatio(GetAggregatedPosition(historicalData, 20, PositionType.Buy), buyPosition20);
                feature.TopSell20Delta3 = CalculateRatio(GetAggregatedPosition(historicalData, 20, PositionType.Sell), sellPosition20);
                feature.TopBuy5Delta3   = CalculateRatio(GetAggregatedPosition(historicalData, 5, PositionType.Buy), buyPosition5);
                feature.TopSell5Delta3  = CalculateRatio(GetAggregatedPosition(historicalData, 5, PositionType.Sell), sellPosition5);
            }

            if (index > 0)
            {
                var historicalData = positionContext[index - 1];
                feature.TopBuy20Delta1  = CalculateRatio(GetAggregatedPosition(historicalData, 20, PositionType.Buy), buyPosition20);
                feature.TopSell20Delta1 = CalculateRatio(GetAggregatedPosition(historicalData, 20, PositionType.Sell), sellPosition20);
                feature.TopBuy5Delta1   = CalculateRatio(GetAggregatedPosition(historicalData, 5, PositionType.Buy), buyPosition5);
                feature.TopSell5Delta1  = CalculateRatio(GetAggregatedPosition(historicalData, 5, PositionType.Sell), sellPosition5);
            }

            return(feature);
        }
        public ContractTransactionFeature GenerateFeatures(ContractTransactionInfo info, IEnumerable <ContractTransactionInfo> contextData)
        {
            if (0 == info.Volume || 0 == info.Position || info.OpenPrice <= 0 || info.ClosePrice <= 0 || info.SettlePrice <= 0)
            {
                return(null);
            }
            var contractContext = contextData.Where(d => d.Commodity.Equals(info.Commodity) && d.Contract.Equals(info.Contract)).OrderBy(d => d.TransactionDate).ToArray();
            int index           = 0;
            int length          = contractContext.Length;

            for (; index < length; index++)
            {
                if (contractContext[index].TransactionDate.Equals(info.TransactionDate))
                {
                    break;
                }
            }

            if (index >= length)
            {
                throw new ObjectNotFoundException(info.ID + " not found in contextual data array.");
            }

            var featureRow = new ContractTransactionFeature();

            featureRow.Id     = BuildId(info.TransactionDate, info.Commodity);
            featureRow.Volume = info.Volume;
            var closePrice = info.ClosePrice + 0.01;

            if (index + 10 < length)
            {
                featureRow.ReturnRate10 = 100.0 * (contractContext[index + 10].ClosePrice - closePrice) / closePrice;
            }

            if (index + 5 < length)
            {
                featureRow.ReturnRate5 = 100.0 * (contractContext[index + 5].ClosePrice - closePrice) / closePrice;
            }

            if (index + 1 < length)
            {
                featureRow.ReturnRate1 = 100.0 * (contractContext[index + 1].ClosePrice - closePrice) / closePrice;
            }

            featureRow.DeltaHighOpen  = 100.0 * (info.HighPrice - info.OpenPrice) / info.OpenPrice;
            featureRow.DeltaLowOpen   = 100.0 * (info.LowPrice - info.OpenPrice) / info.OpenPrice;
            featureRow.DeltaHighClose = 100.0 * (info.HighPrice - info.ClosePrice) / info.HighPrice;
            featureRow.DeltaLowClose  = 100.0 * (info.LowPrice - info.ClosePrice) / info.LowPrice;

            var volume   = info.Volume;
            var position = info.Position;
            IEnumerable <ContractTransactionInfo> historyData;

            if (index > 20)
            {
                historyData = contractContext.Skip(index - 20).Take(20);
                var averageVolume      = historyData.Average(d => d.Volume) + 1;
                var averagePosition    = historyData.Average(d => d.Position) + 1;
                var averageClosePrice  = historyData.Average(d => d.ClosePrice) + 0.01;
                var averageSettlePrice = historyData.Average(d => d.SettlePrice) + 0.01;

                featureRow.DeltaVolume20           = 100.0 * (volume - averageVolume) / averageVolume;
                featureRow.DeltaPosition20         = 100.0 * (position - averagePosition) / averagePosition;
                featureRow.DeltaClosePrice20       = 100.0 * (info.ClosePrice - averageClosePrice) / averageClosePrice;
                featureRow.DeltaSettlePrice20      = 100.0 * (info.SettlePrice - averageSettlePrice) / averageSettlePrice;
                featureRow.DeltaCloseSettlePrice20 = 100.0 * (info.ClosePrice - averageSettlePrice) / averageSettlePrice;
            }
            if (index > 10)
            {
                historyData = contractContext.Skip(index - 10).Take(10);
                var averageVolume      = historyData.Average(d => d.Volume) + 1;
                var averagePosition    = historyData.Average(d => d.Position) + 1;
                var averageClosePrice  = historyData.Average(d => d.ClosePrice) + 0.01;
                var averageSettlePrice = historyData.Average(d => d.SettlePrice) + 0.01;

                featureRow.DeltaVolume10           = 100.0 * (volume - averageVolume) / averageVolume;
                featureRow.DeltaPosition10         = 100.0 * (position - averagePosition) / averagePosition;
                featureRow.DeltaClosePrice10       = 100.0 * (info.ClosePrice - averageClosePrice) / averageClosePrice;
                featureRow.DeltaSettlePrice10      = 100.0 * (info.SettlePrice - averageSettlePrice) / averageSettlePrice;
                featureRow.DeltaCloseSettlePrice10 = 100.0 * (info.ClosePrice - averageSettlePrice) / averageSettlePrice;
            }
            if (index > 5)
            {
                historyData = contractContext.Skip(index - 5).Take(5);
                var averageVolume      = historyData.Average(d => d.Volume) + 1;
                var averagePosition    = historyData.Average(d => d.Position) + 1;
                var averageClosePrice  = historyData.Average(d => d.ClosePrice) + 0.01;
                var averageSettlePrice = historyData.Average(d => d.SettlePrice) + 0.01;

                featureRow.DeltaVolume5           = 100.0 * (volume - averageVolume) / averageVolume;
                featureRow.DeltaPosition5         = 100.0 * (position - averagePosition) / averagePosition;
                featureRow.DeltaClosePrice5       = 100.0 * (info.ClosePrice - averageClosePrice) / averageClosePrice;
                featureRow.DeltaSettlePrice5      = 100.0 * (info.SettlePrice - averageSettlePrice) / averageSettlePrice;
                featureRow.DeltaCloseSettlePrice5 = 100.0 * (info.ClosePrice - averageSettlePrice) / averageSettlePrice;
            }
            if (index > 0)
            {
                var lastInfo = contractContext[index - 1];
                featureRow.DeltaVolume      = 100.0 * ((double)info.Volume - lastInfo.Volume) / (lastInfo.Volume + 1);
                featureRow.DeltaPosition    = 100.0 * ((double)info.Position - lastInfo.Position) / (lastInfo.Position + 1);
                featureRow.DeltaClosePrice  = 100.0 * (info.ClosePrice - lastInfo.ClosePrice) / (lastInfo.ClosePrice + 0.01);
                featureRow.DeltaSettlePrice = 100.0 * (info.SettlePrice - lastInfo.SettlePrice) / (lastInfo.SettlePrice + 0.01);
            }

            System.Console.WriteLine(featureRow.Id + " built successfully....");
            return(featureRow);
        }