2019年8月13日星期二

关于人民币的一些判断

市场对8/5日人民币急贬的看法,主要分歧在央行对其的控制力上:
1)对川普3000亿加税10%的对抗(态度),央行故意停止托市(任其贬值),政治意义大于经济意义
2)贸易战削弱人民币,市场化的反应,已经超出央行操盘能力,是经济崩盘的开始

对中美贸易战的不同预期,主要集中在如下的两端之间
1)达成协议:川普受竞选压力让步,达成利于中方协议或中方受经济压力让步,按美方要求达成协议。
2)贸易战升级金融战并直至中美脱钩,热战是最极端情况。

这就涉及对国内经济前景的判断,究竟国内经济能撑多久,是否能支持中共在美大选前保持强硬姿态。
1)地方城商行的按序排雷能否一直受控而不是演化为系统性的金融危机
2)CPI上行PPI下行的滞胀组合钳制了宽货币刺激经济的可能
3)贸易战变成货币战,使得无法通过人民币汇率升值来控制CPI的飙升

同时香港持续中的市民抗争运动增加了两国(意识形态)冲突升级的概率。一直被川普可以控制在经济范围的中美冲突正在慢慢进入全面的意识形态对抗。

这其中还有个因素一直被国外分析者忽略而可能导致严重误判。就是中共的动机并不是仅仅从国内经济出发(甚至绝大程度上不是),考虑其动机必须从维持独裁殖民(意识形态)和权贵家族利益的角度出发。


这给预测未来事态路径增加了难度。

而川普希望的针对人民币贬值而让美联储进一步贬值美元却很可能带来反向的结果:中美对抗升级造成世界贸易前景更加黯淡,叠加地区性的政治冲突(中澳),各国货币尤其新兴市场和资源型国家货币将相对美元贬值,从新兴资产市场撤出的资金也将支撑美元,从而使得美元反而无法走低!



 

2019年8月4日星期日

2015年A股疯牛和港币人民币汇率的异常

       对一个现象的解释,基于不同的前提假设,能得到完全不同的逻辑和解释。相信“事出有因而人必做恶”的阴谋论在解释市场波动时很有市场,是因为难以证伪(少为人知才叫阴谋)和推理容易,当然在市场交替或同时存在的随机性和有效性下,又几乎总是错误的。

      15年的市场很明确是官媒煽动下的资金推动的疯牛。然后又在监管层运动式去杠杆中崩盘。现在回头看,确实有阴谋论存在的痕迹。今天把港币对人民币汇率和市场叠加起来看,意外发现蹊跷。其中的逻辑还没想清楚,先把发现存档记录。

       图1上半张是A股市场价格变化,下半张是港币人民币汇率:其中蓝色线是央行每日公布的港币兑人民币中间价,黑线是根据美元兑人民币(离岸价,即香港市价)和港币美元计算的港币兑人民币价格。理论上,两者的相关性应该接近1,也就是15年8月至今的表现。
       奇怪就在2014年7月-2015年8月这段时间,央行公布的港币中间价相对市场价格,是被刻意压低的。尤其相关性异常的区间(绿色和红色竖线),正好和15年官媒煽动起来的疯牛完全吻合!2014年前的负相关是因为数据不足计算的假象。2015年8月8汇改,异象被一次弥补。
       

       图2是港币对美元和人民币离岸汇率。港币和人民币自15年股灾后开始双双先后波段快速贬值。而且后期(近两年)呈明显的负相关性。可以理解为撑港币时人民币在贬值,撑人民币的时候港币在贬值.




















图3是港币人民币汇率同黄金现货价格。15年后,16Q4到19Q1,港币兑人民币汇率同金价呈明显的长时间的负相关(>0.8)。这几个图片中似乎有什么逻辑。目前还没想出来。而近期港币人民币同黄金的相关性转为正,似乎预示着又有变化开始了。


以确定性假设为前提的市场判断的内在缺陷

基于确定性的入市判断和市场不确定性的矛盾,纠错确认的滞后和市场随机波动的矛盾

2013年4月3日星期三

Add Trading Log on AmiBroker Chart(EOD)

将股票交易记录(交割单)的买卖信息画到Amibroker的chart中。

交易结果不佳的时候整理交易记录是个让人心烦的事情,3月份表现不好,干脆写了afl把所有交易记录都画到AB的chart上。

Step1. 用excel将通达信的交割单处理成txt文本文件,格式是“date,buy/sell,symbol,price,lots"。

TradeLog.txt sample(No title line):

2/28/2013,buy,000043,7.13,1000
3/1/2013,sell,000043,7.32,1000

Step2. 在AB中运行scan [Scan]ReadTradeLog.afl. 目的是读取txt文件信息,合并存储在静态变量中(code as followed).


/*  ---------------[Scan]ReadTradeLog.afl---------------------------------------
read trade log from TradeLog.txt and add buy@price text on the charts
  1. First, run scan using this afl to initialize static variables
  2. Then use TradeCheck layouts to check every operated stock chart(with indicator
TradeLogDrawing program    
                                        2013-3-23  ZYHuang                   */

Procedure getTradeLogInfo(sFileName)

/* get the trading log information and store in static variables
OpDate="20130303,20130403,20130202,...."
Op="buy,sell,buy,sell,buy,buy,"
Sbl="002234,002234,000043,000043,234543,234544,"
Prc="1.25,1.34,3.33,3.55,2.33,4.55,"
Lots="100,100,400,200,300,300," 
*/
OpDate=Op=Sbl=Prc=Lots="";
fh=fopen(sFileName,"r");
if(fh)
{
while(!feof(fh))
{
temp=fgets(fh);
OpDate=OpDate+strextract(temp,0)+",";
Op=Op+strextract(temp,1)+",";
Sbl=Sbl+strextract(temp,2)+",";
Prc=Prc+strExtract(temp,3)+",";
Lots=Lots+strLeft(strextract(temp,-1),strLen(strextract(temp,-1))-1)+","; //exclude the last Enter Code
}
fclose(fh);
}
staticVarSetTEXT("svOpDate",OpDate);
staticVarSetTEXT("svOp",Op);
staticVarSetTEXT("svSbl",Sbl);
staticVarSetTEXT("svPrc",Prc);
staticVarSetTEXT("svLots",Lots);
}

getTradeLogInfo("E:\\TradeLog.txt");
buy=0;  //for scan
  

Step3. 在AB中使用[I]DrawTradeLogOnChart.afl建立chart(code as followed).


/*       ----------------- [I]DrawTradeLogOnChart.afl  ---------------------------
read static variables to draw trading operation on the chart
TradeLogDrawing program    
                                        2013-3-23  ZYHuang                   */

//------Initial low-level graphic infomation and funcions -------begin----
lvb=status("lastvisiblebar");
fvb=status("firstvisiblebar");
chartwidth=status("pxchartwidth");
chartleft=status("pxchartleft");
barwidth=chartwidth/(lvb-fvb+1);

function GetVisibleBarCount()        
{
return min(lvb-fvb,barcount-fvb); //lastvisiblebar could include the "blank" bar at chart right
}                                     

function GfxConvertBarToPixelx(bar)  //bar is zero based visible barcount
{
return chartleft+bar*barwidth;
}

function GfxConvertValueToPixelY(value)
{
local miny,maxy,chartbottom,chartheight;
miny=status("axisminy");
maxy=status("axismaxy");
chartbottom=status("pxchartbottom");
chartheight=status("pxchartheight");
return chartbottom-floor(0.5+(value-miny)*chartheight/(maxy-miny));
}
//----------Initial low-level graphic infomation and funcions --------------end-----

Procedure subDrawLog(num)
{
oPdate=strtodatetime(strExtract(staticVarGetText("svOpDate"),num));
oP=strextract(staticvargettext("svOp"),num);
oPpc=strToNum(strextract(staticvargettext("svPrc"),num));
oPlt=strextract(staticvargettext("svLots"),num);
txtcolor=colorgreen;
if (oP=="buy") txtcolor=colorred;
GfxSetOverLayMode(0);
barNum=GetVisibleBarCount();
GfxSelectFont( "Tahoma",7,500,false,true);
Gfxsettextcolor(txtcolor);
ObjectDateBarcount=lookup(barindex(),oPdate,0);

if (!isnull(ObjectDateBarcount) )
{   //Draw 

left=GfxConvertBarToPixelx(objectdatebarcount-fvb)+barwidth/3;
bottom=GfxConvertValueToPixely(Oppc);
right=left+15*barwidth;
top=bottom-20;
txt=strformat(strtoupper(strleft(oP,1)))+oPlt+"@"+oPpc;
GfxDrawText(txt,left,top,right,bottom,32+8);
}
}  //sub end

//Main 
_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));
requesttimedrefresh(1);
stocklist=staticVarGetText("svSbl");
plot(c,"price",colorblack,stylecandle);

GfxSelectFont( "Tahoma",11.5,700,false,true);
GfxSetBKcolor(coloryellow);
Gfxsettextcolor(colorblue);
gfxtextout("Do scan first",865,620);
for (i=0; i<strCount(stocklist,",");i++)
{
if (strleft(name(),6)==strExtract(stocklist,i))
{
subDrawLog(i);
}
}

2013年4月2日星期二

Seasonality System Upgrade

    用RSI构建了一个交易系统,无论怎么修改都是个赔钱机器,只好放弃。不过过程中想到的一个选股策略好像不错,放到F#1系统中效果很好。原来的F#1每次交易的股票数量越多,资金曲线越平滑,而受限人工下单方式,实际操作效果不好。而且系统进入2012年第四季后(即实测后)表现退化,基本没有投入资金使用过。
    修改了选股策略后,最优的股票数量是双峰(4只和20只),对不同板块测试,周期性的板块结果明显优于非周期性板块,这也符合逻辑。本质上这个系统的获利来自对波动性的追逐。最重要的是,样本外数据的测试结果没有退化,可以进入实战检验看看了。

In-sample data period(Optimize):  2008.1.1-2011.12.31
Out of smaple data period(Check): 2004.1.1-2013.4.1
Statistics
All trades Long trades
Initial capital 109994 109994
Ending capital 1230175.97 1230175.97
Net Profit 1120181.97 1120181.97
Net Profit % 1018.40% 1018.40%
Exposure % 9.49% 9.49%
Net Risk Adjusted Return % 10732.79% 10732.79%
Annual Return % 29.81% 29.81%
Risk Adjusted Return % 314.15% 314.15%
All trades 803 803 (100.00 %)
 Avg. Profit/Loss 1395 1395
 Avg. Profit/Loss % 1.26% 1.26%
 Avg. Bars Held 2.08 2.08
Winners 537 (66.87 %) 537 (66.87 %)
 Total Profit 1702620.88 1702620.88
 Avg. Profit 3170.62 3170.62
 Avg. Profit % 2.85% 2.85%
 Avg. Bars Held 2.09 2.09
 Max. Consecutive 19 19
 Largest win 26623.74 26623.74
 # bars in largest win 4 4
Losers 266 (33.13 %) 266 (33.13 %)
 Total Loss -582438.91 -582438.91
 Avg. Loss -2189.62 -2189.62
 Avg. Loss % -1.96% -1.96%
 Avg. Bars Held 2.07 2.07
 Max. Consecutive 8 8
 Largest loss -15706.06 -15706.06
 # bars in largest loss 2 2
Max. trade drawdown -15706.06 -15706.06
Max. trade % drawdown -10.09% -10.09%
Max. system drawdown -57512.68 -57512.68
Max. system % drawdown -6.17% -6.17%
Recovery Factor 19.48 19.48
CAR/MaxDD 4.83 4.83
RAR/MaxDD 50.92 50.92
Profit Factor 2.92 2.92
Payoff Ratio 1.45 1.45
Standard Error 100127.66 100127.66
Risk-Reward Ratio 1.29 1.29
Ulcer Index 1.44 1.44
Ulcer Performance Index 16.91 16.91
Sharpe Ratio of trades 3.67 3.67
K-Ratio 0.0727 0.0727






2013年1月28日星期一

2013国内股票市场周期预测(market timing)

根据经济周期(使用CPI衡量)得到最好和最差两种情形,基本上对应的是主流观点的去库存还是去产能。市场将在4,5月份给出答案。


2012年11月4日星期日

在AmiBroker中建立A股数据库

从上海和深圳证券交易所网站下载股票列表和对应的板块分类,深证的股票一个文件就全下来了,上海证券所讨厌的很,需要一个板块一个板块的下,然后在excel中整理成附件。删除了ST的股票。以后维护这个数据库还是有些麻烦的。
https://docs.google.com/open?id=0B6oxJL8QqbllZFJaZ25UZVdoUFU

然后参考AB的帖子导入就行了
http://www.amibroker.com/newsletter/07-2000.html
http://www.amibroker.com/newsletter/04-2000.html
http://www.amibroker.org/userkb/2008/03/25/ascii-import-standard-and-poors-global-1200/

broker.industries 和broker.sector这两个文件只在新建数据库的时候作为模板起作用。建立后的数据库若要由这两个文件重新设置sector和industry,可以把database中的.workspace文件删除。然后重新打开AB中的DB。

2012年10月27日星期六


Seasonality system
Backtest range: 2004.1-2012.10
CAR       Max system drawdown   CAR/MDD   Sharpe Ratio    Avg%Profit/Loss  Traders  %of winners
31.8%    -5.49%                          5.8               2.51                1.43                    1249      67.33





                                     
















                                                                                        -Oct.15-

练习:在Amibroker中建立S&P1200数据库


参考 http://www.amibroker.org/userkb/2008/03/25/ascii-import-standard-and-poors-global-1200/
Standard and Poor's Global 1200指数:覆盖70%的全球资本市场,由7个主要指标,包括31个地区的市场组成。
第一步:到标普官网下载SPG1200指数的成份股列表。http://www.standardandpoors.com Index Constituents
第二步:整理成份股板块分类信息。AB KB文章里的列表是直接在标普官网上下载的。现在官网上有已经没有具体成分个股的详细信息了。只好用VBA写了个excel工具从Yahoo Finance查询下载。很多公司在多个市场都有上市的股票,symbol重名的也很多,最后把不确定的股票都删掉,再去掉查不到industry和sector信息的,最终留下来969个股票。
第三步:将Sector和Industry序列分别存入broker.sectors 和broker.industries文件,在AB中建立新数据库SPG1200。然后是编辑SPG1200.format文件并保存在Formats目录下。还要把SPG1200.format手动添加到import.types文件里。文章说是自动添加,害得我跟只苍蝇一样在玻璃上撞来撞去,尝试了若干可能,最后才发现需要手动把SPG1200.format添到import.types文件里。
        sector和industry建立后,在第一个sector里面会有一堆industry185,186等直到industry256。如果是按照添加到方式,AB中原来的这些数字命名的sector就会都保留着。
        还有就是broker.industries中industry name+前面的数字的字符总数不能超过41个。超过的字符会在AB建立数据库的时候自动换行,变成一个新的industry,没有错误提示!比如有这么一个indusrty定义:3 Textile - Apparel Footwear & Accessories 在AB数据库里变成了两个industry:Textile - Apparel Footwear & Accessorie和s。逐一核对才找到原因。

第四步:把symbol,symbol full name,MarketID,IndustryID存入.csv文件导入AB中。这里又有一个地方文章没写清楚,查manual也没有明确的答案,我试了一下午才弄明白。在broker.industries文件里建立的是industry和sector的对应关系,所以多个industry前面可能是同样的数字(即多个industry对应同一个sector)。而在导入symbol时,每个industryID是依次排列的数字(!),且排列顺序必须同broker.industries文件里面的industry的排列顺序一致,这样导入的symbol才能同已经在AB数据库建立的市场结构对应好。附图是整理好的几个文件,一看应该就明白了。

      

还有一个地方值得注意,就是需要导入到.csv文件如果处于编辑状态,AB是不会导入的,但也没有错误提示。
                                                -Apr.14-

中文操作系统下Amibroker设置窗口显示异常的问题解决办法


AB安装后,很多setting window的显示不正常。下图是安装后的样子:














 

      原因是系统区域设定中的Non-Unicode程序的语言设定为中文,导致AB中的显示异常。把当前Non-Unicode语言设为英语应该就没问题了。
      但是我来回改了很多次这个设置,同时也把windos主题设置里面的窗口字体等设置也改了个遍,最后竟然出现了AB中References窗口字体变成了奇怪的大个子,而其他窗口全正常的情况。见下图:
   









  


      估计是把什么字体给改没了。下了一个英语语言包,安装后就OK了。
      因为Non-Unicode设成了英语,原来装的一些中文软件显示乱码,又安装了微软的AppLocale工具就一切解决了。

                                                                             -Apr.10-

通过google finance得到intraday 历史数据


      想把S&P Global 1200指数导到Amibroker中,Yahoo没有历史数据,Google有数据能看图,但是用Amiquote不能直接导进来。搜索到Google可以用网页查询的方式直接得到EOD和intraday的历史数据。搜索到的有用帖子:
http://www.marketcalls.in/database/google-realtime-intraday-backfill-data.html
http://www.codeproject.com/Articles/221952/Simple-Csharp-DLL-to-download-data-from-Google-Fin
      可以在excel用VBA来进行数据下载和整理,再通过csv导入到AB中。
      还搜到一个google文档说明,可以在google的spreadsheet中直接使用公式调用google finance的数据。
http://support.google.com/docs/bin/answer.py?hl=en&amp;answer=155178
      新建一个sheet,在Cell A1中输入
=GoogleFinance("SPG1200", "all", "01/01/2009" , "4/8/2012" , "daily") 就得到S&amp;P global 1200 的DOE数据了。不过数据需要修剪下才能导入AB中。
    Google spreadsheet sample

2012年10月26日星期五

Amibroker的外汇数据导入——Apr.3

       把AmiBroker的KB中关于data部分的帖子浏览一遍。按照 http://www.amibroker.com/kb/2006/08/09/amibroker-for-forex/ 提及的方法先通过ASCII文件导入历史数据,然后设置MT4作为DDE服务器,就可以得到实时数据了。
       本以为Oanda的正式帐号数据更好些,结果竟然严重丢数据,大段大段的丢啊,晕倒。试了几次还以为在AmiBroker中的设置有问题,后来在MT4里 面仔细看才发现AmiBroker中的异常时段原来是没数据。 另外,正式帐号的数据时间就是北京时间(GSM+8),而练习帐号的数据时间是美国东部时间(GSM-4)。
       两个关键地方试了半天才弄清楚,一个是时间的设置,一个是symbol的加入方式。
       先说时间设置。MT4的数据时间是GSM-4,本地时间是GSM+8,导入AmiBroker时,database两个地方需要设置: Intraday setting 中Pre-database settings的Time shift 要设为12小时,同时Configure中DDE plugin的Time offset设为-12小时。 无论database设置为local database还是DDE,前者同时影响在local database设置时导入到ASCII历史数据和DDE下的real time tick。我一开始无论设置0还是12,历史数据和实时数据总是时间对不上。所以 DDE plugin中的time offset也要设置。如果两个都设置为0,那么导入的数据是GSM-4时区的,而DDE进来的real time tick是local 时区(GSM+8)的,也对不上。
      另外一个问题是加入到symbol需要通过symbol菜单new的方式加入,然后导入ASCII历史数据,这样DDE的real time tick才能进来。我开始是直接导入ASCII的USDJPY历史数据,chart有,但DDE的数据就进不来。