C++:实现量化capfloor edcoupon设置利率上下限优惠券测试实例

#include "capflooredcoupon.hpp"
#include "utilities.hpp"
#include <ql/instruments/capfloor.hpp>
#include <ql/instruments/vanillaswap.hpp>
#include <ql/cashflows/cashflowvectors.hpp>
#include <ql/termstructures/yield/flatforward.hpp>
#include <ql/indexes/ibor/euribor.hpp>
#include <ql/pricingengines/capfloor/blackcapfloorengine.hpp>
#include <ql/pricingengines/swap/discountingswapengine.hpp>
#include <ql/math/matrix.hpp>
#include <ql/termstructures/volatility/optionlet/constantoptionletvol.hpp>
#include <ql/time/daycounters/thirty360.hpp>
#include <ql/time/daycounters/actualactual.hpp>
#include <ql/time/schedule.hpp>
#include <ql/utilities/dataformatters.hpp>
#include <ql/cashflows/cashflows.hpp>
#include <ql/cashflows/couponpricer.hpp>
#include <ql/quotes/simplequote.hpp>using namespace QuantLib;
using namespace boost::unit_test_framework;namespace capfloored_coupon_test {struct CommonVars {// global dataDate today, settlement, startDate;Calendar calendar;Real nominal;std::vector<Real> nominals;BusinessDayConvention convention;Frequency frequency;ext::shared_ptr<IborIndex> index;Natural settlementDays, fixingDays;RelinkableHandle<YieldTermStructure> termStructure;std::vector<Rate> caps;std::vector<Rate> floors;Integer length;Volatility volatility;// cleanupSavedSettings backup;// setupCommonVars() {length = 20;           //yearsvolatility = 0.20;nominal = 100.;nominals = std::vector<Real>(length,nominal);frequency = Annual;index = ext::shared_ptr<IborIndex>(new Euribor1Y(termStructure));calendar = index->fixingCalendar();convention = ModifiedFollowing;today = calendar.adjust(Date::todaysDate());Settings::instance().evaluationDate() = today;settlementDays = 2;fixingDays = 2;settlement = calendar.advance(today,settlementDays,Days);startDate = settlement;termStructure.linkTo(flatRate(settlement,0.05,ActualActual(ActualActual::ISDA)));}// utilitiesLeg makeFixedLeg(const Date& startDate, Integer length) const {Date endDate = calendar.advance(startDate, length, Years,convention);Schedule schedule(startDate, endDate, Period(frequency), calendar,convention, convention,DateGeneration::Forward, false);std::vector<Rate> coupons(length, 0.0);return FixedRateLeg(schedule).withNotionals(nominals).withCouponRates(coupons, Thirty360(Thirty360::BondBasis));}Leg makeFloatingLeg(const Date& startDate,Integer length,const Rate gearing = 1.0,const Rate spread = 0.0) const {Date endDate = calendar.advance(startDate,length,Years,convention);Schedule schedule(startDate,endDate,Period(frequency),calendar,convention,convention,DateGeneration::Forward,false);std::vector<Real> gearingVector(length, gearing);std::vector<Spread> spreadVector(length, spread);return IborLeg(schedule, index).withNotionals(nominals).withPaymentDayCounter(index->dayCounter()).withPaymentAdjustment(convention).withFixingDays(fixingDays).withGearings(gearingVector).withSpreads(spreadVector);}Leg makeCapFlooredLeg(const Date& startDate,Integer length,const std::vector<Rate>& caps,const std::vector<Rate>& floors,Volatility volatility,const Rate gearing = 1.0,const Rate spread = 0.0) const {Date endDate = calendar.advance(startDate,length,Years,convention);Schedule schedule(startDate,endDate,Period(frequency),calendar,convention,convention,DateGeneration::Forward,false);Handle<OptionletVolatilityStructure> vol(ext::shared_ptr<OptionletVolatilityStructure>(newConstantOptionletVolatility(0, calendar, Following,volatility,Actual365Fixed())));ext::shared_ptr<IborCouponPricer> pricer(newBlackIborCouponPricer(vol));std::vector<Rate> gearingVector(length, gearing);std::vector<Spread> spreadVector(length, spread);Leg iborLeg = IborLeg(schedule, index).withNotionals(nominals).withPaymentDayCounter(index->dayCounter()).withPaymentAdjustment(convention).withFixingDays(fixingDays).withGearings(gearingVector).withSpreads(spreadVector).withCaps(caps).withFloors(floors);setCouponPricer(iborLeg, pricer);return iborLeg;}ext::shared_ptr<PricingEngine> makeEngine(Volatility volatility) const {Handle<Quote> vol(ext::shared_ptr<Quote>(new SimpleQuote(volatility)));return ext::shared_ptr<PricingEngine>(new BlackCapFloorEngine(termStructure, vol));}ext::shared_ptr<CapFloor> makeCapFloor(CapFloor::Type type,const Leg& leg,Rate capStrike,Rate floorStrike,Volatility volatility) const {ext::shared_ptr<CapFloor> result;switch (type) {case CapFloor::Cap:result = ext::shared_ptr<CapFloor>(new Cap(leg, std::vector<Rate>(1, capStrike)));break;case CapFloor::Floor:result = ext::shared_ptr<CapFloor>(new Floor(leg, std::vector<Rate>(1, floorStrike)));break;case CapFloor::Collar:result = ext::shared_ptr<CapFloor>(new Collar(leg,std::vector<Rate>(1, capStrike),std::vector<Rate>(1, floorStrike)));break;default:QL_FAIL("unknown cap/floor type");}result->setPricingEngine(makeEngine(volatility));return result;}};}void CapFlooredCouponTest::testLargeRates() {BOOST_TEST_MESSAGE("Testing degenerate collared coupon...");using namespace capfloored_coupon_test;CommonVars vars;/* A vanilla floating leg and a capped floating leg with strikeequal to 100 and floor equal to 0 must have (about) the same NPV(depending on variance: option expiry and volatility)*/std::vector<Rate> caps(vars.length,100.0);std::vector<Rate> floors(vars.length,0.0);Real tolerance = 1e-10;// fixed leg with zero rateLeg fixedLeg =vars.makeFixedLeg(vars.startDate,vars.length);Leg floatLeg =vars.makeFloatingLeg(vars.startDate,vars.length);Leg collaredLeg =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps,floors,vars.volatility);ext::shared_ptr<PricingEngine> engine(new DiscountingSwapEngine(vars.termStructure));Swap vanillaLeg(fixedLeg,floatLeg);Swap collarLeg(fixedLeg,collaredLeg);vanillaLeg.setPricingEngine(engine);collarLeg.setPricingEngine(engine);if (std::abs(vanillaLeg.NPV()-collarLeg.NPV())>tolerance) {BOOST_ERROR("Length: " << vars.length << " y" << "\n" <<"Volatility: " << vars.volatility*100 << "%\n" <<"Notional: " << vars.nominal << "\n" <<"Vanilla floating leg NPV: " << vanillaLeg.NPV()<< "\n" <<"Collared floating leg NPV (strikes 0 and 100): "<< collarLeg.NPV()<< "\n" <<"Diff: " << std::abs(vanillaLeg.NPV()-collarLeg.NPV()));}
}void CapFlooredCouponTest::testDecomposition() {BOOST_TEST_MESSAGE("Testing collared coupon against its decomposition...");using namespace capfloored_coupon_test;CommonVars vars;Real tolerance = 1e-12;Real npvVanilla,npvCappedLeg,npvFlooredLeg,npvCollaredLeg,npvCap,npvFloor,npvCollar;Real error;Rate floorstrike = 0.05;Rate capstrike = 0.10;std::vector<Rate> caps(vars.length,capstrike);std::vector<Rate> caps0 = std::vector<Rate>();std::vector<Rate> floors(vars.length,floorstrike);std::vector<Rate> floors0 = std::vector<Rate>();Rate gearing_p = Rate(0.5);auto spread_p = Spread(0.002);Rate gearing_n = Rate(-1.5);auto spread_n = Spread(0.12);// fixed leg with zero rateLeg fixedLeg  =vars.makeFixedLeg(vars.startDate,vars.length);// floating leg with gearing=1 and spread=0Leg floatLeg  =vars.makeFloatingLeg(vars.startDate,vars.length);// floating leg with positive gearing (gearing_p) and spread<>0Leg floatLeg_p =vars.makeFloatingLeg(vars.startDate,vars.length,gearing_p,spread_p);// floating leg with negative gearing (gearing_n) and spread<>0Leg floatLeg_n =vars.makeFloatingLeg(vars.startDate,vars.length,gearing_n,spread_n);// Swap with null fixed leg and floating leg with gearing=1 and spread=0Swap vanillaLeg(fixedLeg,floatLeg);// Swap with null fixed leg and floating leg with positive gearing and spread<>0Swap vanillaLeg_p(fixedLeg,floatLeg_p);// Swap with null fixed leg and floating leg with negative gearing and spread<>0Swap vanillaLeg_n(fixedLeg,floatLeg_n);ext::shared_ptr<PricingEngine> engine(new DiscountingSwapEngine(vars.termStructure));vanillaLeg.setPricingEngine(engine);vanillaLeg_p.setPricingEngine(engine);vanillaLeg_n.setPricingEngine(engine);/* CAPPED coupon - Decomposition of payoffPayoff = Nom * Min(rate,strike) * accrualperiod == Nom * [rate + Min(0,strike-rate)] * accrualperiod == Nom * rate * accrualperiod - Nom * Max(rate-strike,0) * accrualperiod == VanillaFloatingLeg - Call*/// Case gearing = 1 and spread = 0Leg cappedLeg =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps,floors0,vars.volatility);Swap capLeg(fixedLeg,cappedLeg);capLeg.setPricingEngine(engine);Cap cap(floatLeg, std::vector<Rate>(1, capstrike));cap.setPricingEngine(vars.makeEngine(vars.volatility));npvVanilla = vanillaLeg.NPV();npvCappedLeg = capLeg.NPV();npvCap = cap.NPV();error = std::abs(npvCappedLeg - (npvVanilla-npvCap));if (error>tolerance) {BOOST_ERROR("\nCapped Leg: gearing=1, spread=0%, strike=" << capstrike*100 <<"%\n" <<"  Capped Floating Leg NPV: " << npvCappedLeg << "\n" <<"  Floating Leg NPV - Cap NPV: " << npvVanilla - npvCap << "\n" <<"  Diff: " << error );}/* gearing = 1 and spread = 0FLOORED coupon - Decomposition of payoffPayoff = Nom * Max(rate,strike) * accrualperiod == Nom * [rate + Max(0,strike-rate)] * accrualperiod == Nom * rate * accrualperiod + Nom * Max(strike-rate,0) * accrualperiod == VanillaFloatingLeg + Put*/Leg flooredLeg =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps0,floors,vars.volatility);Swap floorLeg(fixedLeg,flooredLeg);floorLeg.setPricingEngine(engine);Floor floor(floatLeg, std::vector<Rate>(1, floorstrike));floor.setPricingEngine(vars.makeEngine(vars.volatility));npvFlooredLeg = floorLeg.NPV();npvFloor = floor.NPV();error = std::abs(npvFlooredLeg-(npvVanilla + npvFloor));if (error>tolerance) {BOOST_ERROR("Floored Leg: gearing=1, spread=0%, strike=" << floorstrike *100 <<"%\n" <<"  Floored Floating Leg NPV: " << npvFlooredLeg << "\n" <<"  Floating Leg NPV + Floor NPV: " << npvVanilla + npvFloor << "\n" <<"  Diff: " << error );}/* gearing = 1 and spread = 0COLLARED coupon - Decomposition of payoffPayoff = Nom * Min(strikem,Max(rate,strikeM)) * accrualperiod == VanillaFloatingLeg - Collar*/Leg collaredLeg =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps,floors,vars.volatility);Swap collarLeg(fixedLeg,collaredLeg);collarLeg.setPricingEngine(engine);Collar collar(floatLeg,std::vector<Rate>(1, capstrike),std::vector<Rate>(1, floorstrike));collar.setPricingEngine(vars.makeEngine(vars.volatility));npvCollaredLeg = collarLeg.NPV();npvCollar = collar.NPV();error = std::abs(npvCollaredLeg -(npvVanilla - npvCollar));if (error>tolerance) {BOOST_ERROR("\nCollared Leg: gearing=1, spread=0%, strike=" <<floorstrike*100 << "% and " << capstrike*100 << "%\n" <<"  Collared Floating Leg NPV: " << npvCollaredLeg << "\n" <<"  Floating Leg NPV - Collar NPV: " << npvVanilla - npvCollar << "\n" <<"  Diff: " << error );}/* gearing = a and spread = bCAPPED coupon - Decomposition of payoffPayoff= Nom * Min(a*rate+b,strike) * accrualperiod == Nom * [a*rate+b + Min(0,strike-a*rate-b)] * accrualperiod == Nom * a*rate+b * accrualperiod + Nom * Min(strike-b-a*rate,0) * accrualperiod--> If a>0 (assuming positive effective strike):Payoff = VanillaFloatingLeg - Call(a*rate+b,strike)--> If a<0 (assuming positive effective strike):Payoff = VanillaFloatingLeg + Nom * Min(strike-b+|a|*rate+,0) * accrualperiod == VanillaFloatingLeg + Put(|a|*rate+b,strike)*/// Positive gearingLeg cappedLeg_p =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps,floors0,vars.volatility,gearing_p,spread_p);Swap capLeg_p(fixedLeg,cappedLeg_p);capLeg_p.setPricingEngine(engine);Cap cap_p(floatLeg_p,std::vector<Rate>(1,capstrike));cap_p.setPricingEngine(vars.makeEngine(vars.volatility));npvVanilla = vanillaLeg_p.NPV();npvCappedLeg = capLeg_p.NPV();npvCap = cap_p.NPV();error = std::abs(npvCappedLeg - (npvVanilla-npvCap));if (error>tolerance) {BOOST_ERROR("\nCapped Leg: gearing=" << gearing_p << ", " <<"spread= " << spread_p *100 <<"%, strike=" << capstrike*100  << "%, " <<"effective strike= " << (capstrike-spread_p)/gearing_p*100 <<"%\n" <<"  Capped Floating Leg NPV: " << npvCappedLeg << "\n" <<"  Vanilla Leg NPV: " << npvVanilla << "\n" <<"  Cap NPV: " << npvCap << "\n" <<"  Floating Leg NPV - Cap NPV: " << npvVanilla - npvCap << "\n" <<"  Diff: " << error );}// Negative gearingLeg cappedLeg_n =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps,floors0,vars.volatility,gearing_n,spread_n);Swap capLeg_n(fixedLeg,cappedLeg_n);capLeg_n.setPricingEngine(engine);Floor floor_n(floatLeg,std::vector<Rate>(1,(capstrike-spread_n)/gearing_n));floor_n.setPricingEngine(vars.makeEngine(vars.volatility));npvVanilla = vanillaLeg_n.NPV();npvCappedLeg = capLeg_n.NPV();npvFloor = floor_n.NPV();error = std::abs(npvCappedLeg - (npvVanilla+ gearing_n*npvFloor));if (error>tolerance) {BOOST_ERROR("\nCapped Leg: gearing=" << gearing_n << ", " <<"spread= " << spread_n *100 <<"%, strike=" << capstrike*100  << "%, " <<"effective strike= " << (capstrike-spread_n)/gearing_n*100 <<"%\n" <<"  Capped Floating Leg NPV: " << npvCappedLeg << "\n" <<"  npv Vanilla: " << npvVanilla << "\n" <<"  npvFloor: " << npvFloor << "\n" <<"  Floating Leg NPV - Cap NPV: " << npvVanilla + gearing_n*npvFloor << "\n" <<"  Diff: " << error );}/* gearing = a and spread = bFLOORED coupon - Decomposition of payoffPayoff= Nom * Max(a*rate+b,strike) * accrualperiod == Nom * [a*rate+b + Max(0,strike-a*rate-b)] * accrualperiod == Nom * a*rate+b * accrualperiod + Nom * Max(strike-b-a*rate,0) * accrualperiod--> If a>0 (assuming positive effective strike):Payoff = VanillaFloatingLeg + Put(a*rate+b,strike)--> If a<0 (assuming positive effective strike):Payoff = VanillaFloatingLeg + Nom * Max(strike-b+|a|*rate+,0) * accrualperiod == VanillaFloatingLeg - Call(|a|*rate+b,strike)*/// Positive gearingLeg flooredLeg_p1 =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps0,floors,vars.volatility,gearing_p,spread_p);Swap floorLeg_p1(fixedLeg,flooredLeg_p1);floorLeg_p1.setPricingEngine(engine);Floor floor_p1(floatLeg_p,std::vector<Rate>(1,floorstrike));floor_p1.setPricingEngine(vars.makeEngine(vars.volatility));npvVanilla = vanillaLeg_p.NPV();npvFlooredLeg = floorLeg_p1.NPV();npvFloor = floor_p1.NPV();error = std::abs(npvFlooredLeg - (npvVanilla+npvFloor));if (error>tolerance) {BOOST_ERROR("\nFloored Leg: gearing=" << gearing_p << ", "<< "spread= " << spread_p *100<< "%, strike=" << floorstrike *100 << "%, "<< "effective strike= " << (floorstrike-spread_p)/gearing_p*100<< "%\n" <<"  Floored Floating Leg NPV: "    << npvFlooredLeg<< "\n" <<"  Floating Leg NPV + Floor NPV: " << npvVanilla + npvFloor<< "\n" <<"  Diff: " << error );}// Negative gearingLeg flooredLeg_n =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps0,floors,vars.volatility,gearing_n,spread_n);Swap floorLeg_n(fixedLeg,flooredLeg_n);floorLeg_n.setPricingEngine(engine);Cap cap_n(floatLeg,std::vector<Rate>(1,(floorstrike-spread_n)/gearing_n));cap_n.setPricingEngine(vars.makeEngine(vars.volatility));npvVanilla = vanillaLeg_n.NPV();npvFlooredLeg = floorLeg_n.NPV();npvCap = cap_n.NPV();error = std::abs(npvFlooredLeg - (npvVanilla - gearing_n*npvCap));if (error>tolerance) {BOOST_ERROR("\nCapped Leg: gearing=" << gearing_n << ", " <<"spread= " << spread_n *100 <<"%, strike=" << floorstrike*100  << "%, " <<"effective strike= " << (floorstrike-spread_n)/gearing_n*100 <<"%\n" <<"  Capped Floating Leg NPV: " << npvFlooredLeg << "\n" <<"  Floating Leg NPV - Cap NPV: " << npvVanilla - gearing_n*npvCap << "\n" <<"  Diff: " << error );}/* gearing = a and spread = bCOLLARED coupon - Decomposition of payoffPayoff = Nom * Min(caprate,Max(a*rate+b,floorrate)) * accrualperiod--> If a>0 (assuming positive effective strike):Payoff = VanillaFloatingLeg - Collar(a*rate+b, floorrate, caprate)--> If a<0 (assuming positive effective strike):Payoff = VanillaFloatingLeg + Collar(|a|*rate+b, caprate, floorrate)*/// Positive gearingLeg collaredLeg_p =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps,floors,vars.volatility,gearing_p,spread_p);Swap collarLeg_p1(fixedLeg,collaredLeg_p);collarLeg_p1.setPricingEngine(engine);Collar collar_p(floatLeg_p,std::vector<Rate>(1,capstrike),std::vector<Rate>(1,floorstrike));collar_p.setPricingEngine(vars.makeEngine(vars.volatility));npvVanilla = vanillaLeg_p.NPV();npvCollaredLeg = collarLeg_p1.NPV();npvCollar = collar_p.NPV();error = std::abs(npvCollaredLeg - (npvVanilla - npvCollar));if (error>tolerance) {BOOST_ERROR("\nCollared Leg: gearing=" << gearing_p << ", "<< "spread= " << spread_p*100 << "%, strike="<< floorstrike*100 << "% and " << capstrike*100<< "%, "<< "effective strike=" << (floorstrike-spread_p)/gearing_p*100<<  "% and " << (capstrike-spread_p)/gearing_p*100<< "%\n" <<"  Collared Floating Leg NPV: "    << npvCollaredLeg<< "\n" <<"  Floating Leg NPV - Collar NPV: " << npvVanilla - npvCollar<< "\n" <<"  Diff: " << error );}// Negative gearingLeg collaredLeg_n =vars.makeCapFlooredLeg(vars.startDate,vars.length,caps,floors,vars.volatility,gearing_n,spread_n);Swap collarLeg_n1(fixedLeg,collaredLeg_n);collarLeg_n1.setPricingEngine(engine);Collar collar_n(floatLeg,std::vector<Rate>(1,(floorstrike-spread_n)/gearing_n),std::vector<Rate>(1,(capstrike-spread_n)/gearing_n));collar_n.setPricingEngine(vars.makeEngine(vars.volatility));npvVanilla = vanillaLeg_n.NPV();npvCollaredLeg = collarLeg_n1.NPV();npvCollar = collar_n.NPV();error = std::abs(npvCollaredLeg - (npvVanilla - gearing_n*npvCollar));if (error>tolerance) {BOOST_ERROR("\nCollared Leg: gearing=" << gearing_n << ", "<< "spread= " << spread_n*100 << "%, strike="<< floorstrike*100 << "% and " << capstrike*100<< "%, "<< "effective strike=" << (floorstrike-spread_n)/gearing_n*100<<  "% and " << (capstrike-spread_n)/gearing_n*100<< "%\n" <<"  Collared Floating Leg NPV: "    << npvCollaredLeg<< "\n" <<"  Floating Leg NPV - Collar NPV: " << npvVanilla - gearing_n*npvCollar<< "\n" <<"  Diff: " << error );}
}test_suite* CapFlooredCouponTest::suite() {auto* suite = BOOST_TEST_SUITE("Capped and floored coupon tests");suite->add(QUANTLIB_TEST_CASE(&CapFlooredCouponTest::testLargeRates));suite->add(QUANTLIB_TEST_CASE(&CapFlooredCouponTest::testDecomposition));return suite;
}

该博文为原创文章,未经博主同意不得转。
本文章博客地址:https://cplusplus.blog.csdn.net/article/details/128314706

C++:实现量化capfloor edcoupon设置利率上下限优惠券测试实例相关推荐

  1. C++:实现量化期权定价理论方法之一Bates模型测试实例

    C++:实现量化期权定价理论方法之一Bates模型测试实例 #include "batesmodel.hpp" #include "utilities.hpp" ...

  2. C++:实现量化Nth-to-default第N个默认值测试实例

    C++:实现量化Nth-to-default第N个默认值测试实例 #include "nthtodefault.hpp" #include "utilities.hpp& ...

  3. C++:实现量化Latent变量模型的基本用法测试实例

    C++:实现量化Latent变量模型的基本用法测试实例 #include <ql/qldefines.hpp> #if !defined(BOOST_ALL_NO_LIB) &&a ...

  4. C++:实现量化Partial-time barrier部分时间障碍期权测试实例

    C++:实现量化Partial-time barrier部分时间障碍期权测试实例 #include "partialtimebarrieroption.hpp" #include ...

  5. C++:实现量化设置期限结构,然后确定价格如“价格收益率”或“收益率价格”测试实例

    C++:实现量化设置期限结构,然后确定价格如"价格收益率"或"收益率价格"测试实例 #include <ql/qldefines.hpp> #if ...

  6. C++:实现量化SMM Caplet均匀校准测试实例

    C++:实现量化SMM Caplet均匀校准测试实例 #include "markovfunctional.hpp" #include "utilities.hpp&qu ...

  7. C++:实现量化Libor市场模型测试实例

    C++:实现量化Libor市场模型测试实例 #include "libormarketmodel.hpp" #include "utilities.hpp"#i ...

  8. C++:实现量化年环比通胀上限和下限息票测试实例

    C++:实现量化年环比通胀上限和下限息票测试实例 #include "inflationcapflooredcoupon.hpp" #include "inflation ...

  9. C++:实现 VOL量化指标测试实例

    C++:实现 VOL量化指标测试实例 #include "inflationvolatility.hpp" #include "utilities.hpp"#i ...

最新文章

  1. Linux C++/Java/Web/OC Socket网络编程
  2. 006 kkrunchy_Ryd之类FSG压缩壳
  3. 亿佰特电源模块:无线通信模块电平转换指南
  4. SQL Server where语句使用举例
  5. 揭露动画(Reveal Effect)实现时的注意事项(附上bug-logcat)...
  6. Spring Bean的序列化方案
  7. Car-like Robot运动参数分析
  8. React Native 首次加载白屏优化
  9. 微波遥感SNAP(二)——基于Sentinel-1雷达数据反演矿区地表形变
  10. java类与对象实验报告心得体会_java实验报告类与对象
  11. C语言程序设计的特点
  12. ChartControl应用tip
  13. 第9章 课后作业
  14. TLE82453-3SA-芯片手册
  15. 手机连接linux共享打印机,连接Linux共享打印机
  16. 决策树、随机森林及代码实战
  17. centos系统 -官网下载mysql
  18. 互联网深处有趣网站——进阶篇
  19. 【转】Windows10彻底关闭休眠功能
  20. 想在社会上混 就记住这20句

热门文章

  1. 为何会拿好人卡(二) 安全感是什么?
  2. 前三季度L2级辅助驾驶增速放缓?市场下沉压力凸显背后
  3. 国内类Kik类服务汇总
  4. 第一份工作今天上班做HR,领导让我做一个招聘流程,怎么做呀?
  5. 名帖294 张瑞图 行书《前赤壁赋》
  6. 前赤壁赋----苏轼
  7. 瑞熙贝通|实验室低值易耗品管理平台V2.0
  8. mysql经典基础语录
  9. 教你打造ps古铜色皮肤
  10. 先知——纪伯伦(4)