2015-07-26 2 views
0

У меня есть цепочка опций, которую я хотел бы подмножить на основе базовой цены. Точнее, я хочу получить звонки & с ценами на забастовку чуть ниже, чуть выше базовой цены и чуть выше базовой цены, а также пары каждого старта и звонка с тем же ударом.Использование LINQ для выбора поднабора опционных цепей

Вот голые данные опции в формате JSON:

{ 
"underlying_price": 130.96001, 
"puts": [ 
    { 
     "cid": "901428591898527", 
     "strike": "125.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "990945460064288", 
     "strike": "130.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "119741665156957", 
     "strike": "135.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "712197852541730", 
     "strike": "140.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "193052493845513", 
     "strike": "145.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "30896117048646", 
     "strike": "150.00", 
     "expiry": "Sep 18, 2015" 
    } 
], 
"calls": [ 
    { 
     "cid": "1103304608596226", 
     "strike": "125.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "28683704337826", 
     "strike": "130.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "293690467884457", 
     "strike": "135.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "791049407206135", 
     "strike": "140.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "932015841628223", 
     "strike": "145.00", 
     "expiry": "Sep 18, 2015" 
    }, 
    { 
     "cid": "501320075715761", 
     "strike": "150.00", 
     "expiry": "Sep 18, 2015" 
    } 
] 

}

Это был преобразован в объект класса OptionData:

public class OptionData 
{ 
     public Option[] puts { get; set; } 
     public Option[] calls { get; set; } 
     public string underlying_price { get; set; } 
} 

public class Option 
{ 
     public string cid { get; set; } 
     public string strike { get; set; } 
     public string expiry { get; set; } 
} 

public class OptionPair 
{ 
     public decimal Strike { get; set; } 
     public DateTime Expiry { get; set; } 
     public Option Call { get; set; } 
     public Option Put { get; set; } 
} 

Как и в этом примере, лежащий в основе цена составляет около $ 130, поэтому я хотел бы извлечь puts & звонки ударов ($ 125, $ 130 & $ 135) программно без kn из-за приращения (в этом случае 5 долларов США, оно может меняться в других опционных цепочках).

Поэтому у меня есть два вопроса:

  1. Как я могу сделать выше, с помощью LINQ или Select расширения? (может рассмотреть использование Last, First, Skip, Take, Join и т. д.)

  2. Как я могу связать каждый поместить & вызов (тот же удар) в качестве объекта OptionPair (предпочитаете использовать синтаксис LINQ)?

Есть идеи? Благодарю.

EDIT

Вот код, который работает для меня. Для приращения я вычисляю разницу двух ударов и добавляю 0.99 вместе как отсечку:

Single margin = Convert.ToSingle(puts[1].strike) - Convert.ToSingle(puts[0].strike); 
     var pairs = calls.Join(puts, call => call.strike, put => put.strike, (call, put) => 
        new OptionPair 
        { 
         Call = call, 
         Put = put, 
         Expiry = DateTime.Parse(call.expiry), 
         Strike = Convert.ToSingle(call.strike), 
        }).Where(pair => Math.Abs(pair.Strike - price) <= margin + 0.99); 

ответ

0

Это то, что вам нужно?

decimal margin = 5.99m; // set it programatically, I made it 5.99 because of the underlying_price value in your JSON 
decimal underlying_price = Decimal.Parse(data.underlying_price); 
var pairs = data.puts.Join(data.calls, put => put.strike, call => call.strike, (put, call) => 
    new OptionPair 
    { 
     Call = call, 
     Put = put, 
     Expiry = DateTime.Parse(call.expiry), // or from put, this is kind of ugly - the dates theoretically can be different 
     Strike = Decimal.Parse(call.strike), // or rom call 
    }).Where(pair => Math.Abs(pair.Strike - underlying_price) < margin); 
+0

Большое спасибо! @gisek вы спасли мой день. Я сделал очень незначительные изменения, как показано в EDIT выше. – Ben

 Смежные вопросы

  • Нет связанных вопросов^_^