债券期货 greek计算数据获取完成
This commit is contained in:
@@ -31,6 +31,7 @@ namespace YLErp.Modules.EodModule
|
||||
Dictionary<string, double?> _dDic = new Dictionary<string, double?>();
|
||||
Dictionary<string, double?> _cDic = new Dictionary<string, double?>();
|
||||
Dictionary<string, double?> _ytmDic = new Dictionary<string, double?>();
|
||||
Dictionary<string, double?> _cfDic = new Dictionary<string, double?>();
|
||||
//期货对应的债券代码
|
||||
Dictionary<string, string> _TFeaturesBondCodeDic = new Dictionary<string, string>();
|
||||
|
||||
@@ -51,24 +52,9 @@ namespace YLErp.Modules.EodModule
|
||||
using var db = DbContextFactory.GetYLDbContext();
|
||||
var conn = db.Database.GetDbConnection();
|
||||
var bondsUmCodes = umDatas.Where(p => instrumentBondsTypes.Contains(p.UnderlyingInstrumentType)).Select(p => p.UnderlyingCode).Distinct().ToList();
|
||||
if (bondsUmCodes != null && bondsUmCodes.Count > 0)
|
||||
if (bondsUmCodes == null)
|
||||
{
|
||||
var datas = db.china_bond_valuation.AsNoTracking().Where(p => p.valuation_date == valueDate && bondsUmCodes.Contains(p.bond_id)).Select(p => new
|
||||
{
|
||||
p.bond_id,
|
||||
p.modi_dura,
|
||||
p.convexity,
|
||||
p.yield
|
||||
}).ToList();
|
||||
if (datas != null && datas.Count > 0)
|
||||
{
|
||||
foreach (var item in datas)
|
||||
{
|
||||
_dDic.Add(item.bond_id, item.modi_dura != null ? (double)item.modi_dura : null);
|
||||
_cDic.Add(item.bond_id, item.convexity != null ? (double)item.convexity : null);
|
||||
_ytmDic.Add(item.bond_id, item.yield != null ? (double)item.yield : null);
|
||||
}
|
||||
}
|
||||
bondsUmCodes = new List<string>();
|
||||
}
|
||||
|
||||
var bondIndexUmInnerCodes = umDatas.Where(p => ConsGlobal.InstrumentType.BondIndex.Equals(p.UnderlyingInstrumentType)).Select(p => p.InnerCode??0).Distinct().ToList();
|
||||
@@ -107,6 +93,7 @@ namespace YLErp.Modules.EodModule
|
||||
if (bondUm != null)
|
||||
{
|
||||
_TFeaturesBondCodeDic.Add(item.Key, bondUm.UnderlyingCode);
|
||||
bondsUmCodes.Add(bondUm.UnderlyingCode);
|
||||
}
|
||||
var um = DataCacheProvider.GetUnderlyingDataSource().GetData(item.Key);
|
||||
if (um.InnerCode != null)
|
||||
@@ -114,9 +101,42 @@ namespace YLErp.Modules.EodModule
|
||||
contractInnerCodeBondInnerCodeDic.Add(um.InnerCode ?? 0, item.Value);
|
||||
}
|
||||
}
|
||||
if (tFeatureBondInnerCodeDic.Count > 0)
|
||||
if (contractInnerCodeBondInnerCodeDic.Count > 0)
|
||||
{
|
||||
var cfDatas = GetCFDatas(contractInnerCodeBondInnerCodeDic, conn);
|
||||
if (cfDatas != null && cfDatas.Count > 0)
|
||||
{
|
||||
foreach (var item in cfDatas)
|
||||
{
|
||||
var um = DataCacheProvider.GetUnderlyingDataSource().AsQueryable().FirstOrDefault(p => p.InnerCode == item.Key);
|
||||
if (um != null)
|
||||
{
|
||||
_cfDic.Add(um.UnderlyingCode, item.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (bondsUmCodes != null && bondsUmCodes.Count > 0)
|
||||
{
|
||||
bondsUmCodes = bondsUmCodes.Distinct().ToList();
|
||||
var datas = db.china_bond_valuation.AsNoTracking().Where(p => p.valuation_date == valueDate && bondsUmCodes.Contains(p.bond_id)).Select(p => new
|
||||
{
|
||||
p.bond_id,
|
||||
p.modi_dura,
|
||||
p.convexity,
|
||||
p.yield
|
||||
}).ToList();
|
||||
if (datas != null && datas.Count > 0)
|
||||
{
|
||||
foreach (var item in datas)
|
||||
{
|
||||
_dDic.Add(item.bond_id, item.modi_dura != null ? (double)item.modi_dura : null);
|
||||
_cDic.Add(item.bond_id, item.convexity != null ? (double)item.convexity : null);
|
||||
_ytmDic.Add(item.bond_id, item.yield != null ? (double)item.yield : null);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -181,22 +201,66 @@ namespace YLErp.Modules.EodModule
|
||||
return res;
|
||||
}
|
||||
|
||||
private GLMSGreeksCalcArgs GetCalcArgs(string underlyingCode,string underlyingInstrumentType)
|
||||
private GLMSGreeksCalcArgs GetCalcArgs(string underlyingCode, string underlyingInstrumentType)
|
||||
{
|
||||
var res = new GLMSGreeksCalcArgs();
|
||||
if (ConsGlobal.InstrumentType.RateYield.Equals(underlyingInstrumentType))
|
||||
{
|
||||
return null;
|
||||
return res;
|
||||
}
|
||||
return new GLMSGreeksCalcArgs
|
||||
if (ConsGlobal.InstrumentType.TBFutures.Equals(underlyingInstrumentType))
|
||||
{
|
||||
|
||||
};
|
||||
var bondUnderlyingCode = _TFeaturesBondCodeDic.GetValueOrDefault(underlyingCode, null);
|
||||
if (!string.IsNullOrEmpty(bondUnderlyingCode))
|
||||
{
|
||||
res.P = _pDic.GetValueOrDefault(bondUnderlyingCode, null);
|
||||
res.D = _dDic.GetValueOrDefault(bondUnderlyingCode, null);
|
||||
res.C = _cDic.GetValueOrDefault(bondUnderlyingCode, null);
|
||||
res.Ytm = _ytmDic.GetValueOrDefault(bondUnderlyingCode, null);
|
||||
}
|
||||
res.CF = _cfDic.GetValueOrDefault(underlyingCode, null);
|
||||
}
|
||||
else
|
||||
{
|
||||
res.P = _pDic.GetValueOrDefault(underlyingCode, null);
|
||||
res.D = _dDic.GetValueOrDefault(underlyingCode, null);
|
||||
res.C = _cDic.GetValueOrDefault(underlyingCode, null);
|
||||
res.Ytm = _ytmDic.GetValueOrDefault(underlyingCode, null);
|
||||
}
|
||||
//
|
||||
return res;
|
||||
}
|
||||
|
||||
private Dictionary<long, double> GetCFDatas(Dictionary<long, long> contractInnerCodeBondInnerCodeDic, DbConnection conn)
|
||||
private Dictionary<long, double?> GetCFDatas(Dictionary<long, long> contractInnerCodeBondInnerCodeDic, DbConnection conn)
|
||||
{
|
||||
var sql = "SELECT infopubldate,contractinnercode,ibmarketinnercode,conversionfactors FROM fut_conversionfactors WHERE (contractinnercode,ibmarketinnercode) IN ((2059453,477500));";
|
||||
return null;
|
||||
|
||||
if (contractInnerCodeBondInnerCodeDic == null || contractInnerCodeBondInnerCodeDic.Count == 0)
|
||||
return new Dictionary<long, double?>();
|
||||
|
||||
var parameters = new DynamicParameters();
|
||||
var tupleList = new List<string>();
|
||||
int idx = 0;
|
||||
foreach (var kvp in contractInnerCodeBondInnerCodeDic)
|
||||
{
|
||||
var cp = $"@C{idx}";
|
||||
var bp = $"@B{idx}";
|
||||
tupleList.Add($"({cp},{bp})");
|
||||
parameters.Add(cp, kvp.Key);
|
||||
parameters.Add(bp, kvp.Value);
|
||||
idx++;
|
||||
}
|
||||
|
||||
var sql = $@"SELECT infopubldate, contractinnercode, ibmarketinnercode, conversionfactors
|
||||
FROM fut_conversionfactors
|
||||
WHERE (contractinnercode, ibmarketinnercode) IN ({string.Join(",", tupleList)})";
|
||||
|
||||
var datas = conn.Query<CFQueryDto>(sql, parameters, commandTimeout: 1800).ToList();
|
||||
|
||||
return datas.GroupBy(p => p.contractinnercode).ToDictionary(d => d.Key, d =>
|
||||
{
|
||||
var res = d.OrderByDescending(p => p.infopubldate).First().conversionfactors;
|
||||
return res != null ? (double)res : (double?)null;
|
||||
});
|
||||
}
|
||||
|
||||
private void handle(GreeksCalcDto dto, underlying_manager um)
|
||||
@@ -206,8 +270,6 @@ namespace YLErp.Modules.EodModule
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
var calcArgs = GetCalcArgs(um.UnderlyingCode, um.UnderlyingInstrumentType);
|
||||
|
||||
if (ConsGlobal.InstrumentType.RateYield.Equals(um.UnderlyingInstrumentType))
|
||||
@@ -310,4 +372,13 @@ namespace YLErp.Modules.EodModule
|
||||
|
||||
public decimal? spread { get; set; }
|
||||
}
|
||||
|
||||
public class CFQueryDto
|
||||
{
|
||||
public DateTime infopubldate { get; set; }
|
||||
|
||||
public long contractinnercode { get; set; }
|
||||
public long ibmarketinnercode { get; set; }
|
||||
public decimal? conversionfactors { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user