怎样将电网频率用于多媒体取证?面向音频取证的电网频率检测与增强【有源码】
多媒体来源取证与真伪取证的方法有很多种,其中一种有趣的微信取证方法是通过分析音频中的电网频率(俗称电流声)在音频中留下的痕迹,可以有效地检测音视频文件的免杀蓝鸟post源码产生时间,并进行各种取证。过绿该方法由武汉大学的随机视频随机视频刷新华光等老师提出,文末有源代码,源码源码影片供感兴趣的次更老师和同学参考。
电网频率(electric network frequency,换次ENF)是微信指交流电网的传输频率,我国标称值为 Hz(其他国家也有 Hz),免杀是过绿被动多媒体取证的重要判据。它之所以能够成为取证判据,随机视频随机视频刷新主要有三个原因:首先,交流电和用电器的活动会产生以标称频率为基波的声学震动以及照明设备的灯光闪烁,这些不易被人感知的振动和闪烁可以被音视频录制设备捕捉,形成一种“被动不可见水印”;其次,电网频率在标称值附近随机小范围波动,赋予了电网频率轨迹的独特性;第三,电网频率波动模式在同一电网内部所有位置保持一致,赋予了电网频率波动的一致性。经过多年的发展,电网频率判据已可用于音视频文件产生时间溯源、篡改检测与定位、地理位置溯源、重放攻击检测等取证任务。目前,电网频率分析是录音文件产生时间被动溯源的唯一有效方法。
然而,基于电网频率判据的数字取证研究仍面临一些困难。首先,并不是任意设备在任意条件下都能成功捕捉电网频率;其次,电网频率相对于录音内容和环境噪声十分微弱,在无法控制录音条件的实际取证任务中难以进行有效提取和分析。针对这两个问题,本项工作分别提出了录音文件中电网频率的检测和增强算法,并建立并开源了目前最大的“电网频率-武汉大学”(ENF-WHU)真实世界录音文件数据集,用于对相关算法进行全面评估。简单html源码
为确认待验录音文件中是否存在电网频率以保证后续取证分析有效,本工作从信号检测理论出发,逐步放宽对信号模型的假设,推导出电网频率的一系列理论和实际检测器。其中,只有本工作提出的TF-detector为恒虚警率(CFAR)检测器。
由于信号模型和特性的巨大差异,现有语音(或其他信号)的增强的方法均无法有效增强电网频率信号。对于检测到电网频率的录音文件,为提升其可用性,本工作提出了一种适合电网频率随机小范围缓慢波动特性的鲁棒滤波算法(robust filtering algorithm,RFA),将观测到的带噪电网频率信号调制到正弦频率调频(SFM)解析信号的瞬时频率,并引入核函数,通过处理其产生的正弦时频分布,逐个恢复去噪后的电网频率观测样本,显著提升了电网频率轨迹的质量,为后续取证分析提供了可靠数据。
以上工作为提升电网频率判据在实际取证中的可靠性,促进基于电网频率判据的录音文件取证从实验室走向实际应用提供了技术支撑。相关成果于和年分别发表在IEEE Transactions on Information Forensics and Security,作者为武汉大学华光、张海剑、廖晗、王清懿、叶登攀。
ENF-WHU数据集和MATLAB程序已开源:
github.com/ghuawhu/ENF-...
Guang Hua and Haijian Zhang*, “ENF signal enhancement in audio recordings,” IEEE Transactions on Information Forensics and Security, vol. , pp. -, .
Guang Hua, Han Liao, Qingyi Wang, Haijian Zhang*, and Dengpan Ye, “Detection of electric network frequency in audio recordings – from theory to practical detectors,” IEEE Transactions on Information Forensics and Security, vol. , pp. -, .
ç®åhtml代ç ï¼
htmlç®åç½é¡µä»£ç æä¹åï¼
1ãå¨çµèæ¡é¢ç©ºç½å¤åå»å³é®ï¼æ°å»ºä¸ä¸ªè®°äºæ¬å¹¶æå¼
2ãå¨æ°å»ºæ件ä¸è¾å ¥å¦ä¸ä»£ç ãhtmlè¯è¨é½æ¯ä»¥htmlheadtitlebodyçæ ç¾å¼å§ï¼ä»¥/html/head/title/bodyæ ç¾ä½ä¸ºç»æã
3ãæ¥ä¸æ¥è¦å¨title/titleæ ç¾ä¸é´è¾å ¥æ é¢ï¼å¦ä¸ªäººç½é¡µï¼å¨body/bodyä¸è¾å ¥âèªå·±åç第ä¸ä¸ªç½é¡µï¼å害å§ï¼âå®æåç¹å»ä¿åã并å°è®°äºæ¬åç¼å.txtæ¹ä¸º.htmlæ ¼å¼
4ãå°è®°äºæ¬éå½å为.htmlæ ¼å¼åï¼åºç°å¦ä¸æ ¼å¼ã
5ãåå»æå¼æ¤æ件就ä¼åºç°æµè§å¨ç½é¡µææäºã
æ©å±èµæï¼
å端åå端çåºå«ï¼
1ãå±ç¤ºæ¹å¼
å端æçæ¯ç¨æ·å¯è§ççé¢ï¼ç½ç«å端页é¢ä¹å°±æ¯ç½é¡µç页é¢å¼åï¼æ¯å¦ç½é¡µä¸çç¹æãå¸å±ãå¾çãè§é¢ï¼é³é¢çå 容ãå端çå·¥ä½å 容就æ¯å°ç¾å·¥è®¾è®¡çææå¾ç设计ææµè§å¨å¯ä»¥è¿è¡çç½é¡µï¼å¹¶é åå端åç½é¡µçæ°æ®æ¾ç¤ºå交äºçå¯è§æ¹é¢çå·¥ä½å 容ã
å端æ¯æç¨æ·çä¸è§çä¸è¥¿ï¼é常æ¯ä¸å端工ç¨å¸è¿è¡æ°æ®äº¤äºåç½ç«æ°æ®çä¿åå读åï¼ç¸å¯¹æ¥è¯´å端æ¶åå°çé»è¾ä»£ç æ¯å端è¦å¤ï¼å端èèçæ¯åºå±ä¸å¡é»è¾çå®ç°ï¼å¹³å°ç稳å®æ§ä¸æ§è½çã
2ãæç¨ææ¯
å端å¼åç¨å°çææ¯å æ¬ä½ä¸éäºhtml5ãcss3ãjavascriptãjqueryãBootstrapãNode.jsãWebpackãAngularJsãReactJsãVueJsçææ¯ã
å端å¼å以java为ä¾ï¼ä¸»è¦ç¨å°çå æ¬ä½ä¸éäºStrutsãspringãspringmvcãHibernateHttpåè®®ãServletãTomcatæå¡å¨çææ¯ã
3ãå·¥ä½èè´£
å端工ç¨å¸ä¸»è¦çå·¥ä½èè´£å为ä¸å¤§é¨åï¼åå«æ¯ä¼ ç»çWebå端å¼åï¼ç§»å¨ç«¯å¼åå大æ°æ®åç°ç«¯å¼åã
å端工ç¨å¸ç主è¦èè´£ä¹éä¸å¨ä¸å¤§é¨åï¼åå«æ¯å¹³å°è®¾è®¡ãæ¥å£è®¾è®¡ååè½å®ç°ã
4ãç¥è¯ç»æ
å¨ç¥è¯ç»ææ¹é¢ï¼å端å¼åæ¶åå°çå 容å æ¬HtmlãCSSãJavaScriptãAndroidå¼åï¼éç¨Javaæè kotlinï¼ãiOSå¼åï¼éç¨OCæè Swiftï¼ãåç§å°ç¨åºå¼åææ¯ï¼ç±»Htmlï¼ï¼éçå端å¼åä»»å¡çä¸ææå±ï¼å端å¼åå端åä¹æ¯ä¸ä¸ªè¾ä¸ºææ¾çè¶å¿ã
å端å¼åçéç¹å¨äºç®æ³è®¾è®¡ãæ°æ®ç»æãæ§è½ä¼åçæ¹é¢ï¼å¨å ·ä½çåè½å®ç°é¨åå¯ä»¥éç¨JavaãPythonæè PHPçç¼ç¨è¯è¨æ¥å®ç°ã
ç½é¡µè®¾è®¡å¸¸ç¨HTML代ç
ç½é¡µè®¾è®¡å¸¸ç¨HTML代ç å¤§å ¨
HTMLæ¯ç¨æ¥æè¿°ç½é¡µçä¸ç§è¯è¨ãä¸é¢æ为大家å享HTML代ç ï¼å¸æ对大家å¦ä¹ html代ç æ帮å©ï¼
忽è§å³é®
bodyoncontextmenu="returnfalse"
æ
bodystyle="overflow-y:hidden"
1.å¦ä½å ç§å转å°å«ç页é¢ï¼
METAHTTP-EQUIV="Refresh"CONTENT="æ¶é´;URL=å°å"
2.ç¹å»å ³éçªå£
ahref="javascript:top.window.close();"ç¹å»å ³éçªå£/aï¼
3.请é®å¦ä½å»æ主页å³é¢çæ»å¨æ¡ï¼
bodyscroll="no"
bodystyle="overflow-y:hidden"
4.请é®å¦ä½åå°è®©ä¸ä¸ªç½é¡µèªå¨å ³é.
html
head
OBJECTid=closestype="application/x-oleobject"classid="clsid:adba6-d8ff-cf--aab7a"
paramname="Command"value="Close"
/object
/head
bodyonload="window.setTimeout(ââââcloses.Click()ââââ,)"
è¿ä¸ªçªå£ä¼å¨ç§è¿åèªå¨å ³é,èä¸ä¸ä¼åºç°æ示./body
å¦ä½å¨ä¸å·æ°é¡µé¢çæ åµä¸å·æ°css?
style
button{ color:#;}
/style
buttononclick=document.styleSheets[0].rules[0].style.color=ââââredââââç¹å»æé®ç´æ¥ä¿®æ¹styleæ ç¾ébuttonéæ©ç¬¦ä½¿æé®æ¹ä¸ºçº¢è²/button
请é®å¦ä½è®©ç½é¡µèªå¨å·æ°ï¼
å¨headé¨è®°å ¥METAHTTP-EQUIV="Refresh"content=""å ¶ä¸ä¸ºç§åèªå¨å·æ°ï¼ä½ å¯ä»¥æ´æ¹ä¸ºä»»æå¼ã
5.å¦ä½è®©é¡µé¢èªå¨å·æ°ï¼
æ¹æ³ä¸ï¼ç¨refresh
HTML代ç ç段å¦ä¸:
head
metahttp-equiv="refresh"content="5"
/head
5表示å·æ°æ¶é´
[Ctrl+Aå ¨é¨éæ©æ示:ä½ å¯å ä¿®æ¹é¨å代ç ï¼åæè¿è¡]
æ¹æ³äºï¼ä½¿ç¨setTimeoutæ§å¶
imgsrc=/logo.gif
script
functionrl(){
document.location.reload()
}
setTimeout(rl,)
/script
6.å¦ä½è®©è¶ é¾æ¥æ²¡æä¸å线
å¨æºä»£ç ä¸çHEADâ¦/HEADä¹é´è¾å ¥å¦ä¸ä»£ç ï¼
styletype="text/css"!--
a{ text-decoration:none}
--/style
7.请é®å¦ä½å»æIEçä¸ä¸æ»å¨æ¡ï¼
bodystyle=ââââoverflow:scroll;overflow-y:hiddenââââ
/body
8.ææ ·æè½æRealPlayeræ件å¨ç½é¡µåä¸ä¸ªè¯å¬è¿æ¥ï¼
embedheight=src=js.rmtype=audio/x-pn-realaudio-pluginwidth=autostart="false"controls="PlayButton"
9.å¦ä½ç¨htmlå®ç°æµè§å¨ä¸åéæé®çåè½ï¼
ahref="javascript:history.go(-1)"ç¹å»åé/a
æè
scripthistory.back()/script
.请é®æä¹å¨ç½é¡µä¸æ¹åé¼ æ çç®å¤´å½¢ç¶ï¼
HTML代ç ç段å¦ä¸:
body
ahref="#"style="cursor:auto;"auto/abr
ahref="#"style="cursor:crosshair"crosshair/abr
ahref="#"style="cursor:default"default/abr
ahref="#"style="cursor:hand"hand/abr
ahref="#"style="cursor:move"move/abr
ahref="#"style="cursor:e-resize"e-resize/abr
ahref="#"style="cursor:ne-resize"ne-resize/abr
ahref="#"style="cursor:nw-resize"nw-resize/abr
ahref="#"style="cursor:n-resize"n-resize/abr
ahref="#"style="cursor:se-resize"se-resize/abr
ahref="#"style="cursor:sw-resize"sw-resize/abr
ahref="#"style="cursor:s-resize"s-resize/abr
ahref="#"style="cursor:w-resize"w-resize/abr
ahref="#"style="cursor:text"text/abr
ahref="#"style="cursor:wait"wait/abr
ahref="#"style="cursor:help"help/abr
/body
.ææ ·ä¸ä½¿ç¨é¡µé¢çç¼åï¼å³æ¯ä¸æ¬¡æå¼é¡µé¢æ¶ä¸æ¯è°ç¨ç¼åä¸çä¸è¥¿
METAHTTP-EQUIV="Pragma"CONTENT="no-cache"
.页é¢æå¼æ¶èªå¨å¼¹åºä¸ä¸ªçªå£ç代ç æä¹åï¼
HTML代ç ç段å¦ä¸:
html
head
titleUntitledDocument/title
metahttp-equiv="Content-Type"content="text/html;charset=gb"
scriptlanguage="Bstyle="color:black;background-color:#A0FFFF"javascript/B"
!--
functionMM_openBrWindow(theURL,winName,features){ //v2.0
window.open(theURL,winName,features);
}
//--
/script
/head
bodybgcolor="#FFFFFF"text="#"onLoad="MM_openBrWindow(ââââââââ,ââââ,ââââwidth=,height=ââââ)"
/body
/html
.å¦ä½è®©æç页é¢åºç°ä¸ä¸ªä¼è®²è¯çå°äººï¼Merlin
HTML代ç ç段å¦ä¸:
HTML
HEAD
TITLEé»æ/TITLE
METAhttp-equiv=Content-Typecontent="text/html;charset=gb"
/HEAD
BODY
pOBJECTid=simsclassid=CLSID:DFDB-5C6E-D1-9EC1-CFDF
/OBJECT
SCRIPT
varMerlinID;
varMerlinACS;
sims.Connected=true;
MerlinLoaded=LoadLocalAgent(MerlinID,MerlinACS);
Merlin=sims.Characters.Character(MerlinID);
Merlin.Show();
Merlin.Play("Surprised");
Merlin.Speak("大家好");
Merlin.Play("GestureLeft");
Merlin.Think("ææ¯é»æï¼");
Merlin.Play("Pleased");
Merlin.Think("å¯ç±åï¼");
Merlin.Play("GestureDown");
Merlin.Speak("ååï¼");
Merlin.Hide();
functionLoadLocalAgent(CharID,CharACS){
LoadReq=sims.Characters.Load(CharID,CharACS);
return(true);
}
/SCRIPT
/p
p/p
pçæ¤ææå¿ é¡»è£ æofficeï¼ï¼ï¼/p
/BODY
/HTML
.å¨é¡µé¢ä¸å¦ä½å å ¥ä¸æ¯æ»¡éºçèæ¯å¾ç,æå¨é¡µé¢æ¶èæ¯å¾ä¸å¨
HTML代ç ç段å¦ä¸:
htmlhead
STYLE
body{ background-image:url(logo.gif);
background-repeat:no-repeat;background-position:center}
/STYLE
/head
bodybgproperties="fixed"
/body
/html
[Ctrl+Aå ¨é¨éæ©æ示:ä½ å¯å ä¿®æ¹é¨å代ç ï¼åæè¿è¡]
background-repeat:no-repeat;æ¯è®©èæ¯å¾ä¸å 满æ´ä¸ªé¡µé¢
bodybgproperties="fixed"æ¯æå¨scrollæ¶èæ¯å¾ä¸å¨
.ææ¬è¾å ¥æ¡ä»ä¹å±æ§è½å®ç°ä¸å¯è¾å ¥ï¼
HTML代ç ç段å¦ä¸:
inputtype="text"name="textfield"disabled
æè
inputtype="text"name="textfield"readonly
.å¦ä½ç¦æ¢èªå·±ç页é¢å¨å«äººçæ¡æ¶éæå¼ï¼
æ以ä¸ä»£ç å è³ä½ çheadåº
script
if(window.top!=self){
window.top.location=self.location
}
/script
.å¦ä½å®ç°é¦é¡µå ¨å±å¹æ¾ç¤ºï¼
HTML代ç ç段å¦ä¸:
html
bodyscriptlanguage="Bstyle="color:black;background-color:#A0FFFF"javascript/B"
varcoolw=
varcoolh=
varcoolhuang=window.open("","coolhuang","width="+coolw+",height="+coolh+",
fullscreen=1,toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=0,resizable=0")
window.close()
/script/body/html
.å¦ä½çå¬ä¸ä¸ªçªå£è¢«å ³éäºï¼
HTML代ç ç段å¦ä¸:
bodyonunload="alert(ââââä½ å ³éäºè¿ä¸ªçªå£ââââ)"
.å¦ä½ç¦æ¢Ctrl+Nï¼
HTML代ç ç段å¦ä¸:
bodyonkeydown=return(!(event.keyCode==event.ctrlKey))
å¦ä½æ页é¢å å ¥ç¨æ·çæ¶è夹ï¼
HTML代ç ç段å¦ä¸:
ahref="Bstyle="color:black;background-color:#A0FFFF"javascript/B:window.external.AddFavorite(ââââââââ,ââââæ 忧èæ¬ââââ)"æ¶èæ 忧èæ¬/a
å¦ä½å¨æç'页é¢ä¸å å ¥èæ¯é³ä¹ï¼
IE:bgsoundsrc="*.mid"loop=infinite
NS:embedsrc="*.mid"autostart=truehidden=trueloop=true
*.midä½ çèæ¯é³ä¹çmidiæ ¼å¼æ件
å ³äºé¡µé¢è½¬æ¢ææ
metahttp-equiv="page-enter"content="revealTrans(Duration=4,Transition=)"
æ
metahttp-equiv="page-exit"content="revealTrans(Duration=4,Transition=)"
说æï¼Transition=æ¯éæºææï¼å¦å¯ä»¥é0-ä»»ä¸æ°ååºå®æ个ææ
å¦ä½è®¾å®æå¼é¡µé¢ç大å°
HTML代ç ç段å¦ä¸:
bodyonload="top.resizeTo(,);"!--(widthï¼height)--
ææ ·åå»æ»å±ï¼åå»åæ¢ï¼
HTML代ç ç段å¦ä¸:
html
head
titleæ°ç½é¡µ1/title
/head
body
scriptlanguage"Bstyle="color:black;background-color:#A0FFFF"javascript/B"
varcurrentpos,timer;
functioninitialize()
{
timer=setInterval("scrollwindow()",);
}
functionsc(){
clearInterval(timer);
}
functionscrollwindow()
{
currentpos=document.body.scrollTop;
window.scroll(0,++currentpos);
if(currentpos!=document.body.scrollTop)
sc();
}
document.onmousedown=sc
document.ondblclick=initialize
/script
pa/ppa/ppa/ppaa/ppaa/ppaa/p
paa/ppaa/ppaa/ppaa/ppaa/ppaa/p
paa/ppaa/ppaa/ppaa/ppaa/ppaa/p
paa/ppaa/ppaa/ppaa/ppa/p
/body
/html
å¦ä½è®©bodyä¸çæåä¸è¢«éä¸ï¼
HTML代ç ç段å¦ä¸:
bodyonselectstart="returnfalse"aaa/body
å¦ä½è®©å¼¹åºççªå£ä¸è½å ³éï¼
å¨æ°å¼ççªå£ä¸å å ¥å¦ä¸ä»£ç
bodyonunload=open(location.href)
/body
å¦ä½è®©æµè§å¨å¨ä¿å页é¢æ¶ä¿å失败ï¼
HTML代ç ç段å¦ä¸:
NOSCRIPT
Bstyle="color:black;background-color:#ffff"IFRAME/BSRC="*.html"
/Bstyle="color:black;background-color:#ffff"IFRAME/B
/NOSCRIPT
表åä¸å¦ä½ç¨å¾çæé®å®ç°reset?
html
head
script
functionaaa(){
document.forms[0].reset()
}
/script
/head
body
form
textarearows="2"name="S1"cols=""/textarea
inputtype="submit"values="æ交"name="B1"
imagesrc="logo.gif"onclick=aaa()
/form
/body/html
è¿å ¥ç½é¡µæ¶å¼¹åºçä¿¡æ¯å¯¹è¯æ¡
bodyonLoad="window.alert(ââââ欢è¿å 临æ¬ç«ââââ)"
å ³éçªå£åå¼¹åºå¯¹è¯æ¡
bodyonUnload="window.alert(ââââè°¢è°¢ä½ çå 临!欢è¿ä¸æ¬¡åæ¥!ââââ)"
åå«æ示
bodyonUnload=alert("åè§ï¼æè°¢ä½ ç访é®ï¼")
å³é®èåçå¶ä½
OBJECTid=menutype="application/x-oleobject"classid="clsid:adba6-d8ff-cf--aab7a"
PARAMname="Command"value="RelatedTopics,menu"
PARAMname="Item1"value="å¨æ;"
PARAMname="Item2"value="æç;"
PARAMname="Item3"value="æ°æµª;"
PARAMname="Item4"value="ç½æ;"
PARAMname="Item5"value="äºå¨å¦é¢;"
/OBJECTscriptif(document.all)document.body.onmousedown=newFunction("if(event.button==2)menu.Click();")/script
ä¸æèå
objectid=HHCtrltype="application/x-oleobject"classid="clsid:adba6-d8ff-cf--aab7a"PARAMname="Command"value="RelatedTopics,Menu"PARAMname="Item1"value="aspease;"PARAMname="Item2"value="byhu;"PARAMname="Item3"value="lzz;"/objectahref=javascript:HHCtrl.Click()title="ä¸æèå"ä¸æèå/a
ä¸ä¸ªå®æ´çhtml代ç æä¹ç¼åï¼ç®åçhtmçç¼åè¿ç¨å¦ä¸ï¼
å æ°å»ºä¸ä¸ªææ¬æ件ï¼å¯ä»¥èªå·±å½åï¼å¦ä¸å¾ï¼æå½å为æµè¯ã
ç¼è¯ææ¬ï¼ä»¥æç®åç代ç æ ¼å¼ä¸ºä¾htmlheadtitle/title/headbody/body/html
å¨body/bodyåå ¥ä½ è¦åçå 容,ä¸é¢ä»¥helloworld为ä¾ã
视频直播网站源码,随机密码生成器
视频直播网站源码,随机密码生成器,提供了强大的密码创建功能。密码生成器确保每条密码都随机且独特,显著提升账户安全。它采用复杂算法,保证生成的密码既安全又难以破解。不仅如此,系统内还设置密码检测器,实时评估密码质量,确保生成的密码符合安全标准。
该源码具备方法调用,lua 源码 分析简化了开发过程,让开发者能够快速集成密码生成和检测功能至自己的项目中。通过调用特定方法,即可轻松生成并检验密码,无需额外编码或设计。此外,源码内附带详细文档,指导开发者正确使用功能,确保无缝集成。
随机密码生成器进一步增强了安全性。它基于复杂算法,生成的密码长度可自定义,范围从8位至位不等。每条密码都经过检测器检查,确保其强度满足现代安全标准。生成的密码包含字母、数字和特殊字符的组合,使得破解密码变得极其困难。
除了提供基本的密码生成和检测功能,源码还支持密码强度等级划分,帮助开发者根据不同场景需求灵活配置密码策略。无论是简单的个人账户还是高度敏感的企业系统,都可以通过调整参数获得适合的安全等级。
总而言之,视频直播网站源码,随机密码生成器是一个功能全面、易于集成的解决方案,为网站安全提供了坚实的基础。它通过强大的密码生成器和检测器,确保用户账户安全,同时简化了开发过程。无论您是寻求增强现有网站安全性的开发者,还是希望在新项目中实现高效密码管理的创业者,这个源码都是理想的选择。
Python实现常见随机过程的模拟
一、常见随机过程介绍
1. 几何布朗运动(GBM):这是Black-Scholes在年引入的期权定价过程的基础,尽管存在一些缺陷和与实证研究的冲突,GBM仍然是期权和衍生品估值的关键过程。
2. CIR模型:这个平方根扩散过程,图床 源码由Cox, Ingersoll和Ross在年提出,用于描述均值回复的量,如利率或波动率,并且保持为正数。
3. 跳跃扩散过程(Jump Diffusion):Merton在年首次提出,将几何布朗运动与对数正态分布的跳动成分相结合,允许我们更好地评估如短期虚值(OTM)期权的定价,特别是当需要考虑在较大跳动可能性下进行定价。
4. Heston模型:Heston在年提出了一种描述标的资产波动率变化的数学模型,它假设资产收益率的波动率不是恒定的,而是遵循一个随机过程。
5. SABR模型:SABR模型由Hagan在年提出,它是一种随机波动率模型,假设隐含波动率是几何布朗运动,并且将隐含波动率设置为标的资产价格和期权行权价的函数,融合了随机波动率模型和局部波动率模型的思路,更准确地描绘了符合市场特征的隐含波动率曲线。
二、常见随机过程的模拟
1. 几何布朗运动
几何布朗运动的随机微分方程如下,意味着我们在等价鞅测度下进行操作:
其中,Wt是布朗运动,μ和σ为常数,εt服从正态分布(期望为0,方差为1)。
通过欧拉离散化得到离散时间模型,用于模拟证券价格。
案例分析1
模拟证券初始价格为(日收益率均值为0.,波动率为0.),时间为1年,步长以日为单位,次数为次的几何布朗运动价格。
注最终股价大致服从对数正态分布。
注股价走势服从随机布朗运动。
2. 平方根扩散过程(CIR模型)
CIR模型(Square-Root Diffusion)由Cox-Ingersoll和Ross在年提出,用于模拟随机短期利率。其随机微分方程如下:
参数解释:θ为平均利率;xt为现行短期利率;κ为调整速率;σ√xt表示利率较高时波动率较大。
欧拉离散化后的方程用于模拟最终利率。
案例分析2
模拟初始利率为0.,均值回归系数κ=3.0,php 招聘源码长期均值项θ=0.,波动率σ=0.1,时间为2年,步长以日为单位,次数为次的CIR模型利率。
注最终利率分布频数最多时趋向于均值θ=0.。
注模拟最终趋势趋向于均值θ=0.。
3. 跳跃扩散过程
跳跃扩散过程的随机微分方程描述为:
参数说明:μ为漂移率;σ为证券波动率;Qt为跳跃强度为λ的泊松过程;η-1为跳跃高度;κ为跳跃均值v的预期;σJ为跳跃波动率。
欧拉离散化后的方程用于模拟证券价格的跳跃扩散过程。
案例分析3
模拟证券价格的跳跃扩散过程,初始价格,漂移率μ=0.,收益率波动率σ=0.2,跳跃强度λ=0.,预期跳跃均值v=-0.6,跳跃强度波动率σJ=0.,时间为1年,步长以日为单位,模拟次数为次的股票价格。
注最终价格呈现双峰的直方频数图。
三、随机波动率模型(Heston Model)
SABR模型(SABR Model)
更多详细内容,欢迎查阅作者的书籍:《Python金融量化实战固定收益类产品分析》,本书适合金融与科技结合的Python应用入门,包含丰富配套资源如源代码、视频导读和AI入门资料。
Python实战案例,tkinter+random模块,实现课堂随机抽选提问并语音播报学生姓名
实现课堂随机抽选提问并语音播报学生姓名的Python实战案例,具体步骤如下:
开发工具:Python版本为3.6,使用tkinter、time、random模块。
环境搭建:安装Python,添加到环境变量,使用pip安装tkinter、time、random模块。
核心功能设计:设置自定义学生姓名或通过学号随机抽取学生,语音播报学生姓名。
实现步骤:通过tkinter模块进行排版布局设计,包括读取学生名单、随机打乱、实现随机点名抽取语音播报功能、滚动显示学生名单等。
最后,分享编程干货回馈读者,包括Python电子书、标准库资料、爬虫项目源码、学习视频和路线图等资源。
读者可通过转发本文,获取包含+Python电子书、最全Python标准库资料、四五十个爬虫项目源码、Python基础到进阶学习视频和学习路线图在内的编程干货。
扒一扒随机数(Random Number)的诞生历史
在所有的产生随机数的事物中,我认为没有什么能够超越骰子了”,这是统计学家 Francis Galton 在 年的《自然》杂志中写道。它们在容器中不断地翻滚、互相撞击,以各种形式和角度与容器壁发生碰撞,在容器中的位置和形态在外界看来都是那么不可预知,容器哪怕只发生一次晃动,外界都不可能知道里面到底是什么形态。古已有之的随机数
到底如何才能生成均匀的随机数列呢?自然界中随机性大量而近乎完美的存在,人类并不能准确地预知和量化这种随机性。迄今为止发现最早的骰子(4 个面)是来自中东的一座公元前 世纪的坟墓里。再近一些的历史是在公元前 年的中国,利用火烧龟壳产生的随机龟裂现象,一些“先知”会根据龟裂情况来对未来做判断。又过了几个世纪,在中国诞生了易经占卜法,利用 蓍草法进行占卜,其操作的分裂过程很类似于抛硬币。
机器生成随机数的第一次触碰
时间到了 世纪 年代中期,现代世界需要更多的随机数,不再是骰子或者蓍草可以满足的了。RAND 公司发明了一种机器,通过随机脉冲发生器可以生成大量的随机数。他们将这个机器运行所产生的数字聚合起来并发布成图书 “A Million Random Digits with , Normal Deviates”。这在现在看来是十分荒谬的,但是在当时却是一个突破。这是人类第一次产生如此大量的、高质量的随机数,并且对公众是开放的。这本书 RAND 公司一直印刷到了 年,现在在 亚马逊上也可以看得到。
于此类似的机器:摇奖机,是由著名的 Bletchley Park WWII 破译小组在 世纪 年代发明的,当时被用来生成英国保险债券**所使用的随机数。为了平息公众对摇奖机的公平性和准确性的质疑和担心,官方斥资制作了当时的巨型纪录片:“摇奖机的重要性(The Importance of Being E.R.N.I.E.)”。下面给出视频,很值得一看。
年随机性终于被正式规范化并且整合到了计算机 Ferranti Mark 1 号中。Ferranti Mark 1 号内置了随机数生成指令,利用电气噪声可以一次性生成 个随机比特位。这一特性是由阿兰·图灵设计的。Christopher Strachey 利用这一特点,编写了一套随机情书生成器。下面这是情书例子,利用这个程序生成的 David Link 的 复合计划:
JEWEL LOVE MY LIKING HUNGERS FOR YOUR ADORABLE INFATUATION. YOU ARE MY EROTIC ARDOUR.: MY FOND RAPTURE. MY THIRST SIGHS FOR YOUR INFATUATION. MY HEART SEDUCTIVELY WISHES YOUR BREATHLESS LONGING.YOURS CURIOUSLYM. U. C.
(由于上面文字过于漏骨,译者尝试引申出译文如下)
我对你的可爱迷恋至极。你勾起了我所有对情爱的幻想。我为你而狂热。你的魅力使我对你充满了渴望。我的心随你在而让我无法呼吸。你的追求者M.U.C
但是图灵的随机数指令几乎是当时的开发人员崩溃的,因为这种随机在本身就已经很不稳定的开发环境下又引入了不确定性。人们希望在软件中得到一致性的结果,但是用这种指令的软件永远不可能得到可重复的一致性结果,这也使得软件测试几乎变的不可行。
那么如果随机数生成器可以由一个确定性的函数来替代会怎样呢?如果在给定一个确定的初始条件,每次可以生成同样的随机序列会怎样呢?这就是伪随机数生成器(PRNG)。
伪随机数生成器(PRNG)
伪随机数生成器是由冯诺依曼在 年创造的。他的基本思想是从一个随机数种子开始,对其平方,然后取中间值。接下来重复对得到的数取平方并取中间值的过程,就会得到一个具有统计意义属性的随机数序列了。这也就是广为人知的 平方取中法。
然而,冯诺依曼的方法并没有经得住时间的考验,因为不论从什么随机种子开始,序列最终都会落入某个短循环序列,比如:,,,,,……。
序列中的数字是依赖于前一个数字的这种生成函数,上面的重复循环问题是不可避免的。但是如果说这个循环间隔非常非常大,对实际应用并不会产生影响,那会怎样呢?
年,数学家 D.H.Lehmer 利用 线性同余生成器(LCG)实现了这一思路。下面给出的是基于 Lehmer 的方法所实现的一种朴素 PRNG,叫做 中央随机数生成器,使用 JavaScript 在 年写的。
注意代码中的魔法数字(如 等),这些数字(通常是质数)是用来最大化重复区间的——上面所提到的自我重复的循环区间。这种 PRNG 使用当前时间作为种子值,重复区间可以达到 2 的 次方。
这种中央随机生成器发明之初非常流行,因为那时的 JavaScript 1.0 还没有内置 Math.random() 函数,当时的 Web 1.0 环境下,大家都想让自己的 banner 广告随机旋转。一个开发者 Paul Houle 说道:“它在很多情况下已经很好用了,但是不能使用它来做保密使用”。
对 PRNG 的更高要求
互联网确实需要保密。SSL 诞生在 年,它的加密方案需要高质量的 PRNG。它的发展也直接导致了一段时间的 PRNG 野蛮创新时期。如果你回头看一下 所有的随机数生成器的专利,你可能会感受到就像现代版的第一次制造飞机的浪潮一样。
世纪 年代中期的 CPU 是没有内置随机数生成指令的,这使得那时候好的随机种子特别难得。本来这问题也不大,不过当飞利浦的 Hallam-Baker 发现 Netscape(当时市场上的巨头)的 SSL web 服务器使用了“当前时间 + 一组特殊 ID”组合作为种子的时候,这个问题变成了一个切身体会到的安全问题了。Hallam-Baker 展示了一个攻击者很容易猜到种子值,并且对他们所拿到的服务器流量进行解密的过程。猜种子值是一个非常常规的攻击手段,尽管这种手法现在变得越来越困难。这里给出 年在 Hacker News 上的一段非常经典的攻击演练。
到了 年,计算机科学家们厌倦了生成随机数所受限的条件,来自 SGI 的一个团队发明了 LavaRand,它是用一个网络摄像头来对着熔岩灯拍照。从摄像头中过来的数据是一个真实的熵源——像图灵那样的真实随机数生成器(TRNG)——可以以 kb/s 的速率生成随机数。一如当时硅谷的风格,熔岩灯平台很快拿到了 专利。
AutoDesk 的创始人 John Walker 在全世界范围内推广他的 HotBits,这是一种“随机数即服务”的应用,背后原理是盖革计数器来保证其量子随机性。 年成立的 Random.org 为互联网提供真正的随机数。他们提供的服务包括真正的抛硬币随机、骰子随机和卡牌洗牌随机等。
上面所提到的大多数算法后来都无人问津了,但是一个叫做梅森旋转随机数生成器(The Mersenne Twister)的软件 PRNG 鹤立鸡群,它是由松本真(Makoto Matsumoto)和西村 拓士(Takuji Nishimura)在 年发明的。它完美地平衡了性能和随机数的质量,并且经受住了时间的考验。其基本思想是基于 线性反馈移位寄存器(LFSR),产生一个循环周期非常长的确定性序列,循环周期能够达到 2¹⁹⁹³⁷− 1。在当前的编程语言中,这种算法依旧是默认的 PRNG。
在 年,随机数市场发生了一个巨大的变化,Intel 在其 i 芯片组上集成了芯片级的随机数生成器。这样使得新的服务器都自带热噪声的本地源随机数生成能力——真正的随机数生成器(TRNG)。这很伟大,但是它始终没有软件 PRNG 快,所以加密软件依旧不得不依赖于伪随机数生成器(PRNG)。
这就把我们带到了“密码安全 PRNG”(CSPRNG)(这些讨厌的缩写!难怪很多人认为计算机科学很烦人)。CSPRNG 对于 SSL 特别重要。那么 CSPRNG 的原理是什么呢?这里有一份 页的论文来介绍 CSPRNG。祝你在里面阅读愉快。
不言而喻,CSPRNG 是一个强需求。梅森旋转随机数生成器并不是一种 CSPRNG,因为如果可以给定大量的先前序列样本,后面的数字是可以预计的出来。
时间再拉近一些, 年,Intel 为 TRNG 增加了 RDRAND 和 RDSEED 指令,具有 MB/s 的生产效率。但是 RDRAND 的完整性一直被质疑,里面是不是有某些缺陷?或者是为美国国家安全局内置了什么东西?没人确切地知道这个问题的答案,我猜某些地方的某些人一定知道,可是他们也一定不会公开。
开源硬件随机数生成器
(由一种硬件随机数生成器 PEDOUBLER 生成的随机数据)
近些年开源硬件 TRNG 也逐渐显露头角。它们广受欢迎得益于其设计的透明化:你可以自己构建线路,也可以用现有的组件搭建。完全的透明化使得对硬件随机数生成没有任何的担心和疑虑。 REDOUBLER和 无限噪声 TRNG是两个开源硬件随机数生成器,链接中给出他们的 Github 源码地址。
结尾
今天依旧有关于对随机数生成方法选择的争论,在操作系统内核、编程语言和安全包(如 OpenSSL 或者 OpenSSH)方面均未停止。有许多不同的算法聚焦于不同的特点上,如速度、占用空间、安全性等方面,也有一些安全专家依旧在寻找攻破已有算法的方法。但是对于我们日常的使用来讲,在大多数的操作系统中你可以放心地使用/dev/random,或者编程语言中你可以随心地使用 rand() 函数,都能给你带来很好的使用体验,并且你这么做,阿兰·图灵也会很开心。
2024-12-24 09:01
2024-12-24 08:30
2024-12-24 07:58
2024-12-24 07:58
2024-12-24 07:06