いとーちゃんはおとーちゃん

電機メーカーでエンジニアとして働く技術系おとーちゃんのブログ。技術ネタ、子育て、株のことを備忘録程度に書き留めています。

(MT4ソース公開)自作EA σの歪(シグマノユガミ)※ご利用は自己責任で

実は私、株やNumeraiだけでなく、FXもやっています。
ただし、やっているといっても自分で作った自作EAを使ったシステムトレード専門です。

今回は私の自作EAの中でも正統派なアルゴリズムのEAを紹介したいと思います。
なぜわざわざ公開するのかというと、私の場合、このEAよりも他や個別株の取引の方が利益が出るので最近はあまり活躍していないためです。

せっかくなら公開して参考にして、私以外のもとで活躍してもらおうという魂胆です。
あと、何か良いアイデアがあれば是非頂きたい。。。

ということで、自作EA σの歪(シグマノユガミ)を公開します。
※ご利用は自己責任でお願いいたします。

経緯

自分で言うのもお恥ずかしいですが、私は落ちるナイフを掴む系のスタイルです。(笑)
すなわち、大きく下げた時/大きく上げた時に反転を狙って売り買いをするのです。

FXにおいて、このスタイルは正しいのか。
これを検証したのが本EA自作のきっかけでした。

事前検証

値動きの分布調査

とりあえずUSD/JPYの2018.4~2020.4までの1分足データをデューカスコピーからとってきてEXCELでこねこねしてみました。

まず、前知識としてですが、「株価」自体には統計的な傾向は少なく、基本的にランダムに動きます。 一方で、株価の単位時間あたりの変動量である「値動き」は実は正規分布っぽくなります。
(正確には べき分布の中のコーシー分布なんだと思いますが、プログラムが実装できなくなるので正規分布と見なします。(笑))

以下の青い線が20分間での株価の値動きについてのヒストグラムです。 そしてその値動きを正規分布で近似したものがオレンジの線です。

f:id:itochan_otochan:20210507160512p:plain

大きな値動き後の傾向

「大きく上げた/大きく下げた」の基準ですが、以下としました。

今の値動きが過去の値動きのヒストグラムから得られた正規分布曲線の±2σ区域(99.7%)から外れた場合。

上記が成立した時のその後の値動きのヒストグラムを見てみるとこうなります。
(以下は大きく下げた(-2σから外れた)場合のヒストグラム

f:id:itochan_otochan:20210507162319p:plain

赤が中心線でなのですが、全体的に右に寄っていることがわかると思います。 数字でみると、プラスが約53%、マイナスが約47%。

この結果から、大きく下げた/上げた後は反転しやすいと言えます。

なお、±3σ以外や20分間以外のパラメータでも検証してみましたが、±2σの20分間の値動きが一番バランスが良くなります。

成績

上記分析結果をもとに、大きく値動きしたら買って、トレーリングストップしながら利ザヤを稼ぐプログラムを作りました。
実装してバックテストしてみるとこんな感じになります。
上記確率に収束するよう、バシバシ取引するため、とても滑らかな右肩上がりになります。 一発当てた時の気持ちよさはありませんが、堅実にコツコツ頑張ってくれます。
良かったら可愛がって育ててやってください。(くれぐれも自己責任でお願いします。)

f:id:itochan_otochan:20210507163316p:plain

ソースコード

ソースコードGitHubにて公開中。 くれぐれも自己責任でお願いします。

github.com

米国IPOのリスク・リターン分析

私の米国株投資スタイルは基本的にIPOへのセカンダリ投資です。
IPOセカンダリ投資はボラティリティ(株価の変動幅)が大きく、インデックスや割安株投資と比べるとハイリスク・ハイリターンと言われています。

しかしながら、実際に米国IPOセカンダリ投資が実際どれくらいハイリスク・ハイリターンなのか。数字を知りたくてPythonの勉強がてら2017年以降に上場したIPO銘柄の平均・最大上げ率・最大下げ率・標準偏差を調べてみました。

IPOリスト取得

まずは、IPO銘柄情報はここから取得させて頂きました。
(https://fore-view.net/mkbs/ipo-usa/)
ただし、以下は上場廃止になっていてデータ取得不可でした。
HFEN,SNBP,WSG,LVGO,PRVL,LK,FHL,CHACU,CFFAU,THOR,AMCIU,BWMCU,FTACU,TBLTU,GRAFU,CCH.U,ARYAU,PRNB,GRSHU,CCC.U,MFACU ,BNGOU,TKKSU,SPAQU,FMCIU,TOTAU,GLACU,ALGRU,FTSV,NFC.U,HCCHU,NTGN,EIDX,LFACU,TBRGU,FPACU,GSAHU,TMCXU,CBLK,XSPL,PVTL,PACQU,UMRX,DNJR,TIBRU,OPESU,LTN.U,DFBHU,LHC.U,QES,HMI,SSLJ,HUD,MTECU,TORC,GPAQU,MNLO,OMADU,EAGLU,NEBUU,GIG.U,RWGEU,AMRH,LEVB,LGC.U,ASNS,PPDF,AQ,STNLU,FSCT,CMSSU,MOSCU,HAIR,BRACU,NITE,BSTI,IPOAU,IAMXU,CIC.U,YOGA,ATACU,CIFS,CMTA,WRLSU,SNNA,OSPRU,FSACU,AKCA,TNTR,DOVA,TPGHU,HCACU,CNACU,KBLMU,MMDMU,NESRU,GDI,ASV,NDRAU,TPGEU,AMGP,XRF,CATS,TOCA,NETS,VEACU,FMCIU,KAACU,SRUNU,VLRX,TRPX,MPACU,PSDO,FBM,JAG,FRAC
また、純粋に自社事業で稼げる企業について分析をしたかったのでブラックチェックカンパニーは外しました。

株価取得

次に株価を取得します。
pandas_datareaderを使ってYahoo! financeからデータを取得します。

IPO=['EDR','AVAH','PRVA','FTCI','RAIN','AGTI','TMCI','IMPL','SWIM','NPCE','ZY','KNBE','SKYT','DV','PATH','TRKA','IFBD','RXRX','AKYA','BMEA','KRT','AGL','APP','EBET','TSP','COIN','ALKT','VECT','RPHM','UTME','COMP','KARO','ULCC','EM','TDUP','DSGN','IKNA','ALHC','HYW','ZH','EWTX','SEMR','VZIO','EEIQ','LVTX','OLK','DSEY','CRCT','WMPN','ACVA','DOCN','UPC','MOVE','AFCG','CNTB','FNCH','TIL','TUYA','NAPA','GANX','VEI','OLO','JWEL','SNCY','MITC','JOAN','RXDX','HAYW','LBPH','CPNG','FHS','RBLX','GROY','INNV','OSCR','VRPX','AUUD','NEXI','TLIS','LGVN','DBTX','BMBL','APR','BVS','SGFY','LDI','VLON','BPTS','DSP','RAAS','SDH','ADAG','BAOS','PHVS','CNEY','TERN','EVAX','IMCR','ANGN','BOLT','LHDX','VOR','SANA','ATC','LABP','SNSE','ONTF','TIXT','HMPT','NLSP','OCDX','AGFY','VINP','ZIM','XM','TIRX','SHLS','EZGO','PAX','MNTK','RLX','HUDI','DFH','MYTE','PLTK','DRVN','POSH','WOOF','AFRM','MSGM','UGRO','QLI','KUKE','CGEM','GRCL','MRM','GBS','IKT','MASS','VIRI','MDWT','WISH','UPST','BCAB','SCPS','WNW','OCG','FDMT','ABCL','VVOS','CERT','NBTX','ABNB','HYFM','PUBM','DASH','AI','SGTX','YQ','SBTX','SEER','KNTE','LIXT','OZON','VMAR','MRVI','SHC','YSG','TLS','OLMA','NGMS','SQZ','JUPW','LU','AVIR','LESL','ALGM','GLTO','BDSX','GATO','MAX','ROOT','FHTX','ABCM','GHLD','MCFE','MSP','YGMZ','KRBP','OPT','PRAX','ALGS','TARS','EAR','MNSO','EBC','ARRY','CDAK','STTK','IH','KRON','SPRB','FUBO','AZYO','SQFT','ONCR','ONCR','IMNM','CCCC','ASO','AVO','LXEH','LUNG','ASAN','PLTR','BQ','CD','ORPH','PRLD','AMST','SYTA','PMVP','GLSI','VIAO','GRAY','TSHA','GDRX','CRSR','LSF','BSY','CMPS','U','ATHA','VTRU','PTVE','BNL','DYN','AMWL','SUMO','SNOW','FROG','STEP','MTCR','OM','PRFX','GP','HCDI','XPEV','NNOX','KYMR','INBX','HRMY','CVAC','DCT','BEKE','NTST','KBNT','IBEX','FRLN','AFIB','RKT','OSH','BIGC','RXT','FTHM','VITL','LI','VSTA','GOED','ALVR','VERX','NRIX','ITOS','ANNX','EDTK','INZY','MEG','JAMF','BLI','TIG','RLAY','GOCO','NCNO','RNLX','PAND','QH','PSTX','IVA','NKTX','BLCT','ACCD','LMND','DNB','ACI','API','PYPD','EBON','FUSN','AKUS','FMTX','RPTX','GTH','RPRX','BNR','PCVX','AZEK','GBIO','RNA','LTRN','VRM','UCL','CALT','DADA','AMTI','LEGN','FOUR','ZI','WMG','PLRX','NARI','SLQT','ADCT','AYLA','CLEU','KC','GAN','LYRA','ORIC','KROS','ZNTL','WIMI','IMRA','GFL','PASG','ZCMD','MEDS','GRIL','HUIZ','RVMD','NREF','PFHD','SDGR','PPD','BEAM','CSPR','REYN','ARQT','ONEM','BDTX','ANVS','VEL','DNK','IMAB','LIZI','MKD','INDO','MNPR','SPT','OCFT','BILL','EH','XP','LMPX','PINE','CAN','SITM','YAYO','ETNB','TELA','KRKR','MOHO','CNSP','GRTX','SI','CNTG','QK','DUO','OYST','RAPT','PHAT','PGNY','DAO','TFFP','HAPP','CABA','AIH','BRP','BRBR','IPHA','VIR','HBT','BNTX','MCBS','FREQ','APRE','VIE','OPRT','PTON','XGN','PING','DDOG','IGMS','NVST','STSA','SWTX','ALRS','NET','SDC','TXG','JFU','CFB','PLIN','INMD','HKIB','SNDL','KRUS','DT','BORR','BHAT','VIST','PROS','CSTL','NOVA','HCAT','MDLA','IFS','AFYA','FULC','GMAB','PHR','MIRM','AMK','DOYU','REAL','KRTX','MORF','CHNG','ADPT','BBIO','CMBM','LINX','AKRO','BCEL','GO','PSNL','WORK','STOK','CHWY','FVRR','CRWD','MWK','RVLV','GSX','IDYA','BCYC','RTLR','AVTR','FSLY','PSTL','APLT','SONM','JFIN','UBER','SPFI','NXTC','HHR','MEC','MIST','AXLA','CRTX','PSN','TRVI','YJ','SCPL','RRBI','ATIF','BYND','TMDX','SY','WAFU','GNLN','MNRL','ZM','PINS','HOOK','PLMR','BWAY','TPTX','JMIA','PD','TUFN','GHSI','TW','NGM','SILK','RUHN','PBTS','PUYI','LYFT','DTIL','GNFT','LEVI','TIGR','SWAV','KLDO','SLGG','SOLY','HOTH','MITO','AVDR','TCRR','IMAC','ANCN','GOSS','HARP','ALEC','INMB','NFE','MTC','MDJH','SXTC','PHCF','AMTB','APM','QFIN','LEGH','TME','SAMAU','MRNA','DMAC','MOGU','MDRR','TLC','TC','TLSA','WEI','VAPO','ETON','CNF','ORTX','AXNX','TWST','GMDA','STNE','YETI','PT','ALACU','NIU','SWI','LOGC','MSC','PHAS','OSMT','SIBN','DDMXU','PLAN','EQ','ALLO','LTHM','ESTC','EDTXU','CTACU','GH','KOD','UPWK','CTK','GRTS','ARVN','RMED','STRO','UROV','LAIX','ETTX','SVMK','ARCE','CBNK','VIOT','FTCH','YMAB','ELAN','BSVN','EB','XYF','FVCB','QTT','NIO','YI','LOACU','TZACU','SFET','AAAU','ARDS','MESA','PCB','VCNX','ARLO','SONO','CWK','DAVA','ADIL','OPRA','WISA','CANG','TENB','LQDA','BRY','JG','PDD','FOCS','BE','AQST','PRVB','REPL','TLRY','MYFW','ESTA','ALLK','CNST','CCB','RUBY','CRNX','DOMO','STIM','TCDA','BV','EVER','TBIO','BJ','ENTX','HYRE','UXIN','LOVE','GLDM','AUTL','ECOR','KZR','APTX','EPRT','MGTA','IIIV','XERS','AVRO','TWLVU','VRCA','NEW','AVLR','USX','CHRA','MGTX','AMBO','HJLI','TDACU','ITRM','GSKY','CLPS','KNSA','SRRK','EVOP','PS','VTIQU','HUYA','EQH','EVLO','OBNK','ASLN','ROAD','BCML','STXB','INSP','UBX','PRT','GSHD','DOCU','SMAR','CDAY','LASR','LEVL','EAF','MOR','SURF','AGMH','ZUO','SPOT','IQ','GNPX','BILI','OPBK','FIXX','ONE','GHG','STG','DBX','BDRY','AIHS','ZS','RCUS','BWB','BTAI','FAMI','BFRA','MOTS','CDLX','MUDSU','EOLS','VCTR','WHD','CEPU','FTSI','IPIC','SLGL','OSS','VICI','CAAP','AGS','SLDB','ARMO','EYEN','GTES','PAGS','COLD','ADT','NINE','ILPT','LBRT','CUE','ICLK','LX','DOGZ','CASA','NMRK','DNLI','LBC','ODT','QTRX','CURO','LACQU','BOXL','RETO','BRPAU','SFIX','BXG','SCPH','SAIL','SBT','JT','SEND','ERYP','BAND','APLS','SOGO','IFRX','CBTX','FEDU','MCB','HX','ACMR','FNKO','ALNA','SPRO','AQUA','LOMA','ALTR','MBIN','NEXA','EYE','BPMP','ABLX','HYACU','FAT','REDU','LYL','SE','MDB','RMBL','QD','OPTN','CARG','KIDS','SWCH','RYTM','PQG','ROKU','DCPH','NCNA','RYB','SECO','PETZ','OMP','KRYS','DESP','ZLAB','CELC','DOTAU','TRMT','ZKIN','BAR','CSSE','RNGR','ZEAL','VNTR','RDFN','NEWA','INDUU','RBB','PETQ','CLXT','KALA','USOU','TRTX','USOD','CODX','BY','ALRN','APRN','MRSN','ESQ','ATXI','GPMT','SGBX','SAFE','ATUS','BCACU','BOMN','ADOM','ATNX','PLYM','IMRN','SSTI','APPN','WOW','SGH','ARGX','BEDU','GTHX','SOI','VERI','FPH','GNTY','OVID','KREF','URGN','BHVN','CLDR','NCSM','EEX','ZYME','CVNA','FND','VRNA','WTTR','CADE','YEXT','HCC','OKTA','SNDR','ELVT','HESM','AYX','PUMP','MULE','ARD','BYSI','JILL','SNAP','HLNE','CLPR','SACH','KRP','METC','INVH','LAUR','GLDW','JELD','REVG','JNCE','ANAB','OBSV','GSHTU']

import pandas_datareader.data as web

tsd=web.DataReader(IPO, "yahoo", '2017/1/1', '2021/4/30')    
tsd.to_csv("ipo_201701-202104.csv")

分析

1行目は株価の種別(調整後終値終値始値、高値、安値)が入っていますが、邪魔なので削ります。

import pandas as pd

df = pd.read_csv('ipo_201701-202104.csv',header=None)
df2 = df.iloc[1:,0:]

今回は調整後終値のみ必要となるため、調整後終値だけを取得します。

adjcnt=1
for i in df2.iloc[0,1:]:
    if(adjcnt>1 and i==df2.iloc[0,1]):
        break
    adjcnt = adjcnt+1
df2.iloc[0:,1:adjcnt].head()

上記データから上場初値(start)と、2021/4/30の株価(end)の比較(hikaku)を計算します。

import csv

outputlist=[["ticker","上場日数","start","end","hikaku"]]
for x,y in df2.iloc[0:,1:adjcnt].iteritems():
    if(x<=len(df2.iloc[0,1:adjcnt])):
        ticker = y[1]
        y[2:] = y[2:].astype(numpy.float32)
        start = 0
        
        for i in range(len(y)):
            if i == 1:
                ticker=y[i]
            elif i > 1:
                if numpy.isnan(y[i])==False:
                    start = i
                    if numpy.isnan(y[len(df2.iloc[0:,1])])==False:
                        outputlist.append([ticker,str(i),str(y[i]),str(y[len(df2.iloc[0:,1])]),str(y[len(df2.iloc[0:,1])]/y[i])])
                    break

with open(r"outputlist.csv", "w") as f:
    writer = csv.writer(f, lineterminator='\n')

    if isinstance(outputlist[0], list):
        writer.writerows(outputlist)

    else:
        writer.writerow(outputlist)

後は平均、最大、最小、標準偏差を出して終わり。

import numpy as np
hikakulist=[]
for i in range(len(outputlist)):
    if(i>0):
        hikakulist.append(float(outputlist[i][4]))

print("平均:"+str(numpy.mean(hikakulist)))
print("最大:"+str(numpy.max(hikakulist)))
print("最小:"+str(numpy.min(hikakulist)))
print("標準偏差:"+str(numpy.std(hikakulist)))

結果

上記と同様の方法でNASDAQとDOWも計算してみたところ、結果としては以下の通りとなった。 f:id:itochan_otochan:20210506003502p:plain

結果、IPO銘柄の上昇率は平均で1.64倍、最大で91倍。最小は紙屑でした。 DOW、NASDAQIPO銘柄に比べると上昇率も最大も低いけど、最小がそこまで下がらないので確かにIPOはハイリスク・ハイリターンであることがわかります。
しかし、IPOは最大で91バガーもあり、とても夢がある。
私は余剰資金で投資をしているので、これからもIPO中心に投資をしていきたいと思います。

ソースコード

今回のソースコードは以下からダウンロード可能です。

github.com

ブログを開設してみた

開設した経緯はこれといったものはなく、ゴールデンウィークの昼下がりに暇な時間が出来たのでちょっとした思い付きで作りました。
何となく思っていることや調べてみて面白かったことなどを備忘録もかねてブログに書いて行こうと思います。

恐らく書く内容の多くは、勉強中のPythonを使ったプログラムで金融系のデータ(株、為替、Numeraiなど)について分析した内容が多くなると思いますが、それ以外にも子育てのこととかも日記のように書くと思います。

なお、私はエンジニアとは言え、仕事ではプロジェクトマネージャ兼システムアーキテクトなので、仕様書と図面を書くことは多いのですが、プログラミングは別の部門にお願いする形のため、プログラミングは素人です。
醜いコードになるかも知れませんが、ご了承ください。