UfqiFina有福金融更新:JavaScript的数据类型强制等

UfqiFina有福金融基金板块提供了一种查询证券投资基金的模拟K线图的方法。

在证券数据的K线图(蜡烛图)的绘制时,我们选用了第三方JavaScript类库HighCharts中的HighStock组件。在应用HighStock时,我们遇到一个值得讨论的关于JavaScript数据类型的问题,记录如下。

1. JavaScript的数据类型强制问题

问题的描述如下。我们尝试在UfqiFina有福金融的K线图中增加一个未来的预测值,以此来帮助调用者判断和分析未来的走势,按当前的变动幅度,如果是看涨会是什么情况,如果是看跌会是什么情况。

https://ufqi.com/index.jsp?mod=financefund&act=fundChart&icode=164906&dataTimeType=weekly&predictType=1&tit=理财服务所

fig1. 基金K线图:交银中证海外中国互联网指数-164906价格行情-UfqiFina-20220615UTC+08-看多涨

依靠过往近期数据计算未来时间节点预测值是一件简单的事情,相当于计算过往数据点构成的一条斜线的斜率。使用JavaScript来做计算,默认是Float数值,遇有小数点时,可能带来非常多的小数点,如同在 MDN的描述一样,
The JavaScript Number type is a double-precision 64-bit binary format IEEE 754 value, like double in Java or C#. 

比如一个普通的计算可以生成, 0.1234567890123 这样的数据。为了便于减少小数点,我们尝试使用 toFixed / toPrecision 函数来进行约束,经过实践,我们发现 toFixed / toPrecision 的返回值不是 Number ,而是String.
The toFixed returns A string representing the given number using fixed-point notation.
The toPrecision() method returns a string representing the Number object to the specified precision.

例如,在UfqiFina有福金融的某个基金某一未来时点的预测值 predictItem是 [123456, 1.0123456789] , 经过 toFixed(4) 之后,predictItem数据变成了 [ 123456, “1.0123”] , 当这个数据进一步地被前转到 HighStock 时, [123456, 1.0123456789] 可以被正确地绘制出来,符合预期,而数据 [ 123456, “1.0123”] 则被视为非法的,被 HightStock丢弃,不符合预期。

相对折中的做法是,在采取了 toFixed 截断了小数位数之后,再次地调用 parseFloat 使之将 String-type 的数据重新变回 Number-type 的数据。
The Number.parseFloat() method parses an argument and returns a floating point number. If a number cannot be parsed from the argument, it returns NaN.

predictItem[1] = parseFloat( predictItem[1].toFixed(4) );

在软件研发中,通常使用弱类型脚本编程语言,我们不考虑数据类型,比如PHP, Perl, JavaScript, VBScript, Python等,没有严格意义上的所谓字符型数值还是数据型数值。经过上面的案例分析,我们自此也许要认真考虑,在JavaScript这样的弱类型脚本编程语言中,如果启用类似 use strict 严肃模式时,也需要认真考虑数值的数据类型(data-type)。 程序脚本任务执行时,从数值类型不敏感变成了数值类型敏感(data-type sensitive)了。

在 fig1. 中,我们将预测值显示在K线图的最右侧,图中,周线图2022Jun15调用时,我们预测出了 2022Jun20的数据,预测模式为“看多涨”(高亮红色表示选中项)。 预测模式除了“看多涨”之外,我们还提供了“看空跌”,从而更方便地展示某个被观测的基金数据如果涨,能涨到多高,如果跌大概要跌成啥样。

2. 日期及节假日的计算

证券市场的行情是高度时间敏感的。这种敏感性既表现在更新频次是秒级,也表现在对过往海量数据的处理。在时间轴上,比如K线图描绘时,就面临着是用自然日、自然周、自然月,还是使用交易日、交易周、交易月的选择。

使用自然日、自然周作为计算单位是相对容易的,但却面临大量节假日及临时停止交易的时间段;如果以交易日、交易周为计算单位在绘图时容易,但却距离人们的感受和经济社会发展相对较远。例如,即便是节假日,其他经济社会主体还是会有交易发生、有发展推进的。

折中的做法就是以自然日、自然周为计算单位,同时兼顾交易日和交易周。这就面临着要计算某一自然日、自然周是否有交易,或者某个交易日归属于某个交易周。
如此以来,情况就变得稍微复杂一些,涉及到历法的各种推算。

在UfqiLong有福金融中,日期的计算既有在客户端绘图时的JavaScript算法,也有在服务器端计算分时段收益率的Java算法。根据分析,我们发现如果锚定日期中的周五Friday这个时间点,并分别计算当前交易日、交易周与前一个周五的时间差,如果时间差在七天之内,说明是在一周之内,如果时间差在七天之外,说明已经出离了一周。

这样在遇到节假日等非交易日的情况时,就可以根据前一个周五的时间戳和当前的时间戳,分析出前一周或者本周有0个,1个,2个,3个,4个,还是5个交易日,从而得出本周的涨跌幅。

原文首发: https://ufqi.com/blog/ufqifina-javascript-tofixed/-R/n2SQ


有福金融UfqiFina : https://ufqi.com/finance

有福金融 是一个旨在促进财富稳步增长的工具平台。
UfqiFina is a platform of tools designed to promote wealth growth steadily.

发表在 服务器运维, 编程技术 | 标签为 , , , | 2条评论

冰糖雪梨膏儿童宝宝砀山慈梨膏汽車老司機車載書中自有黃金屋医疗器械鱼跃

Hanjst🙋汉吉斯特:更新升级+asyncScripti等改进

Hanjst🙋汉吉斯特 上一次更新已经是半年多前的事了,这期间随着研发工作的推进和在新项目新场景中的更多部署,她也随着进行小步骤地改进和升级,兹一一记录如下,备查。
始于2022年2月24日的俄罗斯侵略乌克兰的战争,也差不多持续了四个月了。英勇的乌克兰公民仍在顽强而奋勇地抵抗,尽管在我们写这篇日志的一天中,他们又有差不多100多位战士牺牲在卫国战争的前线!向乌克兰的坚守、勇敢与正义致敬!

Hanjst🙋汉吉斯特 历经五年来的发展与迭代,已经逐渐成熟稳定,并在多个关键应用及场景中表现优良。近期的主要Bug修复和改进主要内容如下。

1. 改进对注释行的处理函数 _remedyMemoLine

如前文所述对JavaScript代码中的注释行和HTML中的注释行的处理是我们关注的重点之一( Hanjst汉吉斯特与龙书编译原理 , https://ufqi.com/blog/hanjst-imprv-202111-with-memoline/ ),也是容易导致Bug的地方,这次改进之一也是关于注释行的处理。
比如针对JavaScript代码中的注释行处理,其中的注释标志是 // 而在程序代码中,常量字符网址的写法中就有类似 http:// , 所以需要额外的代码来进行这样的异常处理。

true && (segStr.match(/[a-zA-Z0-9-]+?.[a-zA-Z0-9-]+?[:]*/gm)
&& (segStr.indexOf(‘ ‘) < 0 || segStr.indexOf(‘/’) > -1)
and true) …

2. 改进条件表达式的行内式处理

Hanjst🙋汉吉斯特 支持行内表达式(内联)方式书写模板表达式。一些特殊字符需要做转义,以区分 Hanjst 表达式和原生的 HTML表达式,如 HTML的语句起始字符< 和终结字符 > , 当使用行内表达式(内联)方式时,需要将大于号和小于号转义为 &gt; 和 &lt; .
这次改进是针对行内表达式的更复杂语句的支持。

3. 新增 asynchronous Scripts 处理的计数器 asyncScripti

Hanjst 支持模板之间的嵌套,同时也支持在被嵌套的子模版中进一步地引入JavaScript或者CSS等文件,这些文件的引入方式,其中CSS依靠浏览器本身,Hanjst处理相对简单。而JavaScript的在子模版的引入方式,处理相对复杂。子模版中引入JavaScript主要依靠 appendScript 来实现。其中又进一步地的区分,引入的JavaScript是同步还是异步,如果是异步引入JavaScript,可以优先尽快地完成当前页面的绘制。

异步地引入JavaScript主要依靠在调用 appendScript 时,使用 window.setTimeout 方法来推迟对 appendScript 的调用时机,延迟一个时间窗之后再执行相应的对待引入方法的执行。以此来实现异步地引入更多的JavaScript,而同时又能够相对快的加载当前模板页所需第一屏展示的内容。

子模版(内嵌模板)中被异步引入的JavaScript文件,理论上来说应该是没有先后顺序关系的,因此在同样是异步加载时,我们之前的做法就是给每一个这样的脚本程序分别分配一个等量范围内的随机数等候时间,比如默认的 100~200毫秒. 这种处理方式,在绝大多数情况下,都是行得通的,通常也以脚本在模板文件中的先后顺序,顺延相应的时间后,一一地被执行、被引入。

但在另外一个苛刻的情况下,比如需要严格限制或者要求被引入脚本需要明确而精准的先后顺序时,就可能由于脚本没有按预期顺序地进行加载而出错。实际的案例如第三方图表JavaScript类库 HighCharts 中的 HighStock ( https://www.highcharts.com/demo/stock ),当更进一步地引入 indicators.js rsi.js 或者 wma.js时,如果按目前的 Hanjst 写法,可能由于后三者的加载顺序问题导致页面程序报错。

Hanjst的改进措施是引入 asyncScripti 参数,将每一个异步加载的JavaScript脚本文件都赋予一个顺序号码,相应地,在执行window.setTimeout时,依据asyncScripti 的序号大小,给与不同长短时间的等候时间,以此来映射在原生模板文件中的被引入文件的顺序。
由此,依据asyncScripti的控制,可以确保前一行引入的JavvaScript文件一定会在后一个被引入的JavaScript之前被执行,被引入。

改进前:
‘parseInt(Math.random()*1000+500));’);

改进后:
‘parseInt(Math.random()*100+’+((asyncScripti++)*100)+’));’);

使用改进后的处理程序,使得每一个被引入的JavaScript以每个间隔100毫秒的步骤顺序加入到待处理队列,同时通过Math.random进一步增大0~100毫秒的延迟,从而每个被引入的JavaScript的实际间隔在 100~200毫秒之间。

改进后的 Hanjst 经过实测可以兼容此前版本的应用环境,也可以很好地解决HighCharts stock相关JavaScript类库的带有时序要求的程序文件的引入。
Hanjst 再一次地成功进化。


除了键盘侠打嘴炮,我们还可以真金白银地支持发生在乌克兰的自由与奴役相对决的反侵略战争。

捐助乌克兰网站: https://u24.gov.ua/

银行捐款账号信息:
(USD) US Dollar
BENEFICIARY
National Bank of Ukraine
BENEFICIARY BIC
NBUAUAUX
BENEFICIARY ADDRESS
9 Instytutska St, Kyiv, 01601, Ukraine
ACCOUNT NUMBER
804790258
BENEFICIARY BANK NAME
JP MORGAN CHASE BANK, New York
BENEFICIARY BANK BIC
CHASUS33
ABA 0210 0002 1
BENEFICIARY BANK ADDRESS
383 Madison Avenue, New York, NY 10017, USA
PURPOSE OF PAYMENT
for ac 47330992708


Hanjst
Hanjst 汉吉斯特 Logo

🙋Hanjst汉吉斯特 是一种基于JavaScript的模板语言及模版解析引擎,她运行在客户端或服务器端。

🙋Hanjst汉吉斯特 能够表述逻辑控制,能够实现与服务器端模版语言相同的强大功能。

  • Hanjst当完全在客户端解析时,节省服务器端计算资源;
  • Hanjst模板语言独立,不与服务器端资源做任何绑定;
  • 纯粹的MVC,层间数据用JSON格式传递;
  • 常见模板语言功能全支持,附带复杂而强大的JavaScript编程能力;
  • 无学习成本,直接使用JavaScript书写模板语言;
  • ….

Hanjst is a JavaScript-based templating language and parsing engine that runs on both the client-side and/or server-side.

Hanjst can express logical controls and achieve the same functionalities as the server-side templating languages.

  • Hanjst’s Run-time in client-side, reduce computing render in server-side;
  • Hanjst is Language-independent, not-bound with back-end scripts or languages;
  • Totally-isolated between MVC, data transfer with JSON;
  • Full-support template tags with built-in logic and customized JavaScript functions;
  • No more tags languages to be learned, just JavaScript;
  • ….

全文首发: https://ufqi.com/blog/hanjst-asyncscripti/ , -R/P2SV

发表在 -Hanjst/-汉吉斯特, 编程技术 | 标签为 , , , , | 留下评论

显白黑茶色蓝黑色板栗色三元牛奶李宁体育用品汽車老司機

电影最长的一天The Longest Day观后感

《最长的一天》(The Longest Day)是一部黑白胶片老电影,又名诺曼底登陆。她描述了第二次世界大战中后期同盟国军队集结主要精锐力量从西线英格兰东渡英吉利海峡,登陆到被轴心国德国占领的法国西海岸。这场战役主要发生在诺曼底海岸,所以电影名字也叫做诺曼底登陆(Normandy Landing),在盟军中行动代码叫做 霸王行动(Operation Overlord),也有称之为 D-Day, 登陆日。本片已收录到 有福经典UfqiClsc: https://ufqi.com/news/clscpage.1098.html?tit=最长的一天 The Longest Day 。

这一战役是整个第二次世界大战的重要转折点之一,盟军从此由战略防御转为全面进攻,同时轴心国也由盛转衰,开始节节败退,直至第二次世界大战结束,同盟国取得全面胜利。以此可见,此次战役的重要意义,电影以相对写实的手法描述、记录、纪念和致敬这场扭转战局的战争。

最长的一天(The Longest Day) 抛开了宏大的二战历史背景,从一个个普通而朴实的士兵或将士的角度来展现、解读和描绘这一复杂而又庞大的精彩绝伦的对决——盟军投入300万人,德军150万人。其中一个个并不算出色的士兵或者将士,组成了一个复杂而又强大的盟军主力部队。艾森豪威尔将军作为盟军总指挥在战情分析时,并没有显现出英明果敢或者高超神勇,相反,在有限的可供选择的范围内,他做出了一个自己都不情愿的冒险——在稍纵即逝的时间窗内发起跨海峡登陆作战!
恰恰是这个违背他本人意愿或者行事风格的决定,也让轴心国敌方分析其行为模式的情报人员及指挥官都不相信在那样的条件下盟军会贸然发动攻击。世事无常,艾森豪威尔将军不情愿地妥协,也把敌方打击个出其不意,也许这就是天意吗?

最长的一天(The Longest Day) 尝试刻画的,似乎就是这样一个由普通人完成的不普通的甚至是伟大的壮举。战前准备阶段,在候场的士兵中,有一位大兵的夫人怀孕了,孩子的父亲却不是这个大兵,但他却还是很担心夫人的安危。另一位大兵,与人唠叨了半天,彼此并不熟稔,只知道他的妻子跟了别人跑掉了。尽管根据军婚保护法律,他可以发起追诉,但他还是选择了原谅她。
至于在影片开头的场景中,火头军分餐时机械地喊叫 下一位 、下一位,当一名大兵抱怨说饭餐难吃时,火头军也只是简单地怼回去说,他只是领一份薪水,做简单的饭菜而已。
再往下,吃饭完毕,候场的大兵们聚集在狭窄逼仄的空间里,唠嗑的,写信的,甚至是打牌赌博的,从某种意义上来说,完全是有组织无纪律。盟军三军将士,怎么能在军营打牌赌博,还是赢钱输钱的呢?或许这才是真实的,符合人性的。

电影没有旁白,但我们似乎能听到这些质朴的声音:只是一份职业而已,但又要做好它。宏大的叙事背景——世界和平,解放全人类——都被这些低俗恶俗的段子故事消解地无影无踪。为何导演要刻意地抹去了那些理想、信念和价值观? 是因为它们太空洞了吗?

不独这些士兵看起来平凡而朴实,甚至是低俗,作为一线将士,在前线作战指挥的指挥官,在影片中显露出的品行也差强人意。前线指挥官中,空降师的上校落地后自己摔折了腿;登陆上海滩,枪林弹雨中血肉横飞,指挥官不沾枪炮反而叼着雪茄在发号施令;其他的带着宠物遛狗的上校,拄拐杖的上校,吹喇叭的上校,这一幕幕,或是艺术化的处理,或者是为了化解血雨腥风的残酷。
有了这些元素,电影所要讲述的一切都行云流水,不管是吹喇叭的,抽雪茄的,遛狗的,拄拐杖的,这些千奇百怪的指挥官尽管秉性各异,但专业素养和职业精神都是无可挑剔的。与专制独裁的千人一面、整齐划一不同,民主自由的世界里,连最需要等级森严、纪律严明的军营中,都如此的花样繁多、参差不齐。这或许是二战取得胜利的秘诀之一吗?

类似的滑稽的场面和人物还有很多,这些猜测或许是牵强的,盟军的三军将士或是艺术化加工的。但近三个小时的黑白电影中,并不让人感到枯燥,也可疑之处,反而给人的感觉是行云流水、一气呵成。
简而言之,最长的一天(The Longest Day)是一部可以与史实并举传颂的经典电影。

原文首发: https://ufqi.com/blog/movie-the-longest-day/ , -R/k2SY

最长的一天,电影海报,诺曼底登陆,D-Day,登陆日
发表在 社会生活 | 标签为 , , , , , , , , , , | 一条评论

汽車老司機愛自己悅己容2nd插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板書中自有顔如玉

GWA2吉娃兔🐇升级增加搜索模糊语法支持

一些事情一旦开始往往无法以自己预期的方式结束。
比如始于2022年2月24日的俄罗斯侵略乌克兰的战争,入侵者原计划三天之内打垮被侵略的乌克兰现政权,没想到快三个月过去了,战争仍然没有结束。反而战争的强弱双方开始逆转。顽强的乌克兰人民英勇抵抗精神正在逐渐获得更多国家的正义支持( https://ufqi.com/news/ulongpage.3839.html?tit=一个新的小强国正在挣扎中崛起 )。显然入侵者无法以自己的预期的方式来结束这场战争。

与破坏作恶者相反,一些建设者的积极项目也是一旦开始了,就持续不断的改进、升级,消灭一个又一个bug,增加一层又一层防护,原来世界可以变得更加美好,比如GWA2 吉娃兔项目。最好的版本永远是下一个发行版本。

GWA2吉娃兔自从2022年2月份进行了多进程多线程改进升级以来( GWA2 Java 增加多线程数据共享通道 globalData, https://ufqi.com/blog/gwa2-java-multiple-threads-globaldata/ ),又陆续进行了一些优化,兹记录如下,以备查访。

  1. Page Navigator 页面浏览增加对模糊搜索的支持
    Page Navigator 页面浏览模块是所有网络应用开发中最高频使用的功能之一。我们也对此进行了进行设计和代码实现。随着多年来大量的软件工程项目实践,我们陆续开发了独有的 PNSK 和 OPPKNSK 功能设计,实现了从浏览器参数设置到数据库SQL查询语句组装的全流程支持。

PNSK , Page Navigator Search Key, 页面浏览搜索关键词,
OPPNSK, Operator of Page Navigator Search Key. 页面浏览搜索关键词的操作符.

给定页面请求参数如,&pnskfielda=abc&oppnskfielda=contains ,
将通过 PageNavi 组装成如下数据库SQL查询语句:
…. and fielda like ‘%abc%’ …

这次改进升级的包括,如果给定页面请求参数中包括了空格或者问号?/?等模糊查询的搜索语法时,PageNavi 能够识别这种语法并做进一步的处理,使之能够转化为相应的数据库SQL查询语句。

给定页面请求参数如,&pnskfielda=abc%20efg&oppnskfielda=contains ,
将通过 PageNavi ,增加对模糊查询的支持,组装成如下数据库SQL查询语句:
…. and fielda like ‘%abc%efg%’ …

对模糊查询语法的支持,最早的想法和实现是在 gMIS吉密斯的改进升级中,当初的写法为:
$gtbl->set($field, “%”.str_replace(‘ ‘,’%’,$v).”%”);

改进后的写法将使用 _parseBlank 来统一替代:
$v = $this->_parseBlank($fieldopv, $v);

在新增加的 _parseBlank 中约束了目前只针对 contains 和 notcontains 这连个 oppnsk 进行如上操作,同时也通过全局配置开关 GWA2_Is_Parse_Blank 进行控制,可以对该功能进行停用。

除了 gMIS吉密斯之外,这项升级改进,将陆续应用在 UfqiWork有福工坊 和 UfqiFina有福金融 的搜索功能模块中。

  1. 增加对传统 Base64 编解码的封装

作为编解码的辅助设施,在 GWA2吉娃兔的设计中,默认的工具是 Base62x, 她比原生的 Base64 有更好的适应性( https://ufqi.com/dev/base62x )。由于 Base62x 推出时间较新,在GWA2吉娃兔开发的网络应用中,出于对接其他老旧系统的需要,仍需要兼容传统 Base64 的编解码处理。为此,我们改进了 inc/Zeea.class, 增加了相应的方法:

inc/Zeea.base64Encode 和 inc/Zeea.base64Decode

比如,我们在新近的一个项目中需要对接 Aliyun阿里云的一个在线服务,其中的API接口中,需要封装参数,为安全起见,在API接口请求参数时,使用 URLEncode对参数进行编解码,其中的不安全字符需要做替换处理:

private String specialUrlEncode(Object value) throws Exception {
return java.net.URLEncoder.encode((String)value, “UTF-8”)
.replace(“+”, “%20”)
.replace(“*”, “%2A”)
.replace(“%7E”, “~”);
}

如果使用较新的 Base62x 来进行 URLEncode的话,则不必如此繁琐地进行多个不安全字符的替换 ( https://www.researchgate.net/publication/307786166_Uniform_Resource_Identifier_Encoded_by_Base62x )。 因此,倡议更多的开发者在面向未来的网络应用开发中,全面使用 Base62x 取代传统的 Base64 .

  1. 增加对JSON/CSV格式数据的转换处理

GWA2吉娃兔 在最近升级改进中,在 Hanjst 模板处理的服务器端,增加了两个处理格式数据的方法,分别是处理JSON数据的 json2Map 和处理CSV数据的 csv2Map . 这两个方法可以方便对外处理数据交换。

数据转换处理背后的支持类库是 Google Gson . 相应的类库包已经随着 GWA2吉娃兔打包在一起。

本文首发地址:-R/q2Sa , https://ufqi.com/blog/gwa2-fuzzy-search/ 。



GWA2吉娃兔

-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architecture, https://ufqi.com/dev/gwa2/ )”,基于 -GWA2 可以轻便构建各种网络应用程序,
包括复杂的在线购物商城、在线医疗、在线教育、 旅游交易平台、社群或者社交网站和新闻资讯网站等,
也包括各种企事业单位网上门户,在线交互及服务作业系统等.
还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部.
-GWA2 是为数不多的支持跨开发语言的应用框架,目前支持 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for Native App, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

-GWA2 is E.A.S.Y 
Easy Along, Swift Yield
轻松启动, 快速产出.

发表在 -gMIS, -GWA2, -Hanjst/-汉吉斯特, 编程技术 | 标签为 , , , , , | 一条评论

冰糖雪梨膏儿童宝宝砀山慈梨膏汽車老司機車載書中自有黃金屋医疗器械鱼跃

金融证券市场保护性止损的重要性

2022年3月15日这一周在以后的中国证券市场发展史上可能会被记录为具有重要见证的一周。原本要记录些这一周的跌宕起伏和惊心动魄,记录那些一个个的“活久见”——美股中概股暴跌后暴涨,港股大盘暴跌后暴涨。恰此时,知名自媒体“兽楼处”发表了一篇类似的文章,甚为共鸣,转贴于 有福常在UfqiLong: https://ufqi.com/news/ulongpage.3720.html?tit=中国证券市场见证历史的一周:2022年3月 .

这一篇大致要回顾一下证券市场中谨慎设置并严格执行止损策略的重要性。这是温习经济学的第十一篇,其余之前的十篇,请参考文末的链接。

科班出身的金融专家都知道金融是经验风险的行业,是一门对天资要求颇高的“手艺活”。金融的本质就是把握好风险和收益的平衡。在价值交易者中或许可以靠无限量的资金优势和无限长的区间拉平和抹平损失,而趋势交易者就需要务必认识到证券市场阶段性,并在下跌趋势中及时止损。
这是金融证券市场的金科玉律般的教条,如果需要案例,凡是经历过2022年3月这场类似股灾的从业者都应该有刻骨铭心的记忆或教训。被誉为华尔街神童的证券股票交易大师 Stan Weinstein 在其代表作:https://ufqi.com/news/ulongpage.3605.html?tit=股票称傲牛市熊市的秘密 中就专门章节论述了,绝不能持有任何没有止损性保护的头寸。
这些止损性保护或者此前的支撑位或者周线平均线等指标。

止损,是一个听起来让人不舒服的词语,尤其是保护性止损或者割肉止损。实际上,正如词语所暗含的意义一样,的确是在断臂求生,去疮止脓。比如根据支撑位或者经验值,我们通常说可以接受10%以内,20%以内下跌,再止不住,就要认输认赔,止损离场。

这是绝大多数结构投资者都必需也是必须要做的,恰恰相反,更多个人投资者却不屑于设置止损保护,或者设置而不严格执行,最终陷入巨大的窟窿之中无法自拔。这可能是在金融证券市场个人投资者七亏二平一赢的背后原因之一。

金融证券市场投资绝不等同于赌博,不是靠猜测,而是靠概率,靠数据、数学来决策,尤其是计算技术发展迅速的今天,量化交易(机器人)的占比在逐步提升。既然靠概率,不是赌博,所以在任何情况下,都不会采取越输越加倍下注的下等策略,也不会将所有筹码都一次性地孤注一掷。

不管是投资交易高手强调的10%,20%必须且必需割肉认输止损离场,还是传统意义上的,当某一市场指数下跌20%后就被认为是技术性熊市,这其中背后可能存在某种数学上的关系。我们尝试列举了一些情况下上涨和下跌幅度的变化数值,比如某一证券标的物,从100元下跌到1元,然后再从1元上涨到100元的情形。

Fig1. 证券市场价格上涨与下跌幅度对比

从 Fig1. 证券市场价格上涨与下跌幅度对比 图中 , 我们可以看到如果回撤幅度在10%,则反弹幅度只要到 11.11% 就可以回本,基本上等比例幅度的反弹就能够找回损失。如果回撤下跌幅度达到20%时,需要至少 25% 的反弹上涨才能抹平下跌导致的损失。这几乎是同一个数据段的极限了。当回撤进一步下跌到 30%左右时,无法通过 30% 左右的反弹来弥补损失,而且越是往后,回本所需反弹上涨的幅度越大,50%的下跌,需要100%的反弹上涨才能找回之前的损失。这几乎是风险与收益完全不对称了。

当回撤下跌达到 70%时,几乎没有希望在可以预见的将来能有 3-4倍的反弹上涨,200% ~ 300% 的上涨?
如果继续抄底,更可怕的还在后面,当下跌回撤到 90%的损失时,需要十倍 900%的反弹上涨幅度才能回本,这几乎是余生是否能见到的场景,都值得怀疑。
而这真是当前(2022年3月)美国股市中国概念股所经历的情况(下毒Fig2.)。

Fig2. 美国股市中国概念股整体下跌超过90%

证券市场新手死于追高,老手死于抄底,是这么来的吗?上图Fig2.中下跌90%左右的股票,什么时候能回本?
为何下跌起来会越来越快,而上涨通常会越来越慢?

数学上看,prime越下跌越小,其后的价格变动绝对值,对prime本身的占比就越大,100元的跌9元,幅度是9%, 而10元的跌9元,幅度就是 90%了。
上涨慢的原因刚好反过来,prime越上涨越大,其后的价格的变动绝对值,对prime本身的占比就越小,10元的上涨了9元,幅度是90%, 而100元的上涨了9元,幅度是 9%。

上涨幅度慢的另外一个不容忽视的力量时,总是有对手盘在不断地分批次地“止盈”, 设想10元的价格上涨到20元, 幅度100%, 可能中间过程,反弹上涨幅度在 20%, 50%, 80%时,已经有大量的获利盘进行止盈操作。这些对手盘的抛盘操作,对持续上涨形成了巨大的压力,甚至改变上涨趋势,重新转为新的熊市,继续下跌。
于是,之前没有回本的继续被埋下去,同时又引入新的陪葬品。

当个体投资人有限的本金被深度套牢后,再无新资金进去按新的方法实施解救,余生之年是否能回本都是让人怀疑的,于是自然而然地形成了 七亏两平一赚 的悲情市场。
相反地,机构投资者,由于有止损操作,叠加当一笔失误导致20%的损失后及时止损,同时还有其他资金持续增援,还可以在其他场次找回这 20%的损失,循坏不已,生生不息。

未学会躺赢,先学会认输,这大概值得每一个准备入市,或者在金融市场跃跃欲试的投资人深思,甚至警钟长鸣。既然美股中概股可以“九年涨幅,一夜归零”( https://ufqi.com/news/ulongpage.3721.html?tit=时代的一粒沙美元证券投资基金的一座山 ), 作为个体投资者十年盈利,也可能在一次无底洞的失败中彻底失去所有翻盘的本金。

被美国股神沃伦巴菲特尊称为老师的格雷姆在《聪明的投资者》( https://ufqi.com/news/ulongpage.3423.html?tit=聪明的投资者 The intelligent investor:安全边际:投资的核心概念 )末尾总结说:

我大胆地将成功投资的秘密精练成四个字的座右铭:   “安全边际。”

照猫画虎地,我们在 UfqiFina 有福金融 的尾注中,添画了提示语:

⚠️市场有风险, 投资需数点. 安全无边际, 流泪抹鼻涕。

这是温习经济学著作的第十一篇习作,之前的各篇附列如下。

  1. 经济周期论兼议称傲股票牛市熊市的秘密, https://ufqi.com/blog/economic-cycles-and-profits-in-stock/
  2. 国债与信用货币, https://ufqi.com/blog/treasure-credit-money/
  3. 理性经济人在边际上做选择, https://ufqi.com/blog/economic-selection-on-margin/
  4. 写写年度收益率年均收益率和年化收益率-4, https://ufqi.com/blog/income-rate-annuals-with-buffett/
  5. 写写年度收益率年均收益率和年化收益率-3, 
    https://ufqi.com/blog/income-rate-annuals-with-yale/
  6. 写写年度收益率年均收益率和年化收益率-2 , https://ufqi.com/blog/income-rate-annuals-with-cic/
  7. 写写年度收益率年均收益率和年化收益率, https://ufqi.com/blog/income-rate-annuals/
  8. 治大国若过小家——写写王朝兴衰更替背后的经济账, https://ufqi.com/blog/political-reform-country-vs-home/
  9.  写写存款利率贷款利率和负利率, https://ufqi.com/blog/captial-rate-and-minus-rate/
  10. 写写1929年美国经济大萧条与2020年美国股市大跌, https://ufqi.com/blog/us-1929-economic-crisis-2020-stock-shock/

有福金融UfqiFina : https://ufqi.com/finance

有福金融 是一个旨在促进财富稳步增长的工具平台。
UfqiFina is a platform of tools designed to promote wealth growth steadily.

本文: https://ufqi.com/blog/security-sell-to-stop-losing/ , -R/u2SU

发表在 社会生活 | 标签为 , , , | 5条评论

汽車老司機愛自己悅己容2nd插座保护套儿童防触电插孔安全塞防护盖宝宝婴幼儿插头插座孔插板書中自有顔如玉

GWA2 Java 增加多线程数据共享通道 globalData

令举国民众震惊的江苏徐州丰县铁链女(生育八孩女子)一事逐渐被消音( https://ufqi.com/news/ulongpage.3651.html?tit=仍留下徐州丰县生育八孩女子独自面对命运|舆论手札 ),今暂且不论。

GWA2 Java 最近被部署到一个金融类项目( 有福金融:https://ufqi.com/finance )上运行之后,持续遇到并发、数据同步、多进程多线程数据访问控制的挑战。在此前一篇的博客中,我们讨论了在数据同步时的数据加锁的过程细节:Synchronized同步Quque队列Concurrency并发与线程锁Lock ( https://ufqi.com/blog/gwa2-php-synchronized/ )。 今天继续这个话题,讨论 GWA2 Java 寄宿于 Apache Tomcat中多进程多线程编程及运行时环境下,如何实现对多线程间数据的隔离与共享。

前文记述,在Apache Tomcat 等容器中,实现对数据的安全管控的最好的方式是使用 Synchronized 同步机制,让程序单线程运行,但这很难在Application层面扩展处理能力。于是我们修改了规则,默认不再启用 synchronized同步机制在全局。这样 GWA2 Java 重新回到多进程多线程运行环境,并发扩展能力激增。随之而来的就是在多线程运行时环境下,数据的隔离与共享。
有些数据是需要隔离的,比如在多线程并发运行时环境下,当请求1被线程A接管的同时,请求2被线程B接管,如果不做数据隔离的话,在整个进程中的数据都会被重置为较后者进来的请求。
我们需要某种机制将请求的各种数据限制在线程内。

同时,有些数据又需要被共享,一个接口或进程启动后,总有一些全局性的设置或变量,需要能够在所有线程中被访问到。这又要求我们必需提供某种机制能够满足,在多线程环境下,对一些全局数据的读写访问,并保障这些数据是线程安全的(Thread-Safe)。

fig1.单线程与多线程运行时状态示意图

在一番分析和探索之后,我们对GWA2 Java做了如下改进和升级,以实现GWA2 Java从 “线程不安全—单线程安全—多线程安全” 的演进

1/3. 改进全局数据容器data的类型:用ConcurrentHashMap取代HashMap

脱胎于GWA2 PHP,我们始终认为需要一个全局性的数据容器,可以将任务/业务处理过程中所产生的数据临时存放起来,这个数据容器无疑类型是一个字典表之类。在GWA2 Java中,起初使用了 HashMap(非线程安全的),后来遇到数据同步问题后,使用Synchronized同步关键词得以临时解决。
再次的探索研究,我们认为是时候使用 ConcurrentHashMap替代HashMap 了,ConcurrentHashMap 对多线程有更好的支持,而且是Java原生的数据类型。
代价也是有的,毕竟ConcurrentHashMap在数据读写时,要处理线程锁的问题,因为在数据处理上开销更大,速度稍慢。
另外令人不好接受的是,ConcurrentHashMap不接受null空值,key或者value,都不行,这无疑对于痛恨Java null的开发者来说,将会更加多地要注意,存储data数据时,需要考虑到是否null的前置判断。

2/3. 改进多数全局变量的作用域,由对象类的作用域缩小到方法体的作用域

在前一节改动使用 ConcurrentHashMap 取代HashMap后,data容器的确是数据安全了,可请求数据在并发情况下被重写的问题仍在。这源于我们在 JSP文件中声明变量时,使用!感叹号这样的武器。

<%!HashMap data;%>
将会生成一个作用域为对象类的变量data
<%HashMap data%>
将会生成一个作用域为方法体的变量data

这其中的细节可能要参考Java Servlet相关技术规罚手册。

根据Apache Tomcat默认能够将每一个请求分发到一个线程处理的机制,结合fig1.中对多线程的描述,我们发现将数据容器data的作用域由对象类缩小到方法体内,是解决这个问题的答案。
这就解决了请求数据在多线程环境下的数据隔离问题,当GWA2 Java所需要的数据容器及其他多数变量都已经内置于线程内(register和stack区域),其数据自然是被完全隔离的了。

改动也是有代价的,当我们做这样的修改后,data这样的“全局”变量的作用域减少了,是为了线程间数据隔离,同时也阻碍了我们在任何代码块中访问和使用这些数据。
比如在一个自定义的方法体内,在此改动之前,可以直接读取和写入操作data, 而这次修改之后,将不能对data数据进行任何读取或写入操作。

3/3. 增加线程间数据共享通道 globalData

改进到前两步已经实现了多线程安全的GWA2 Java运行时环境保证。但我们还不满足于此,我们仍希望GWA保持整个套系的风格,在GWA2 PHP中,全局变量 data 始终是全局的,任何代码空间都可以访问到。
在2/3.改动之前, GWA2 Java也能够提供这种全局访问的便利性,那是以靠Synchronized同步机制提供了单线程环境。有没有可能在 2/3.多线程运行时环境下,也提供一个具有全局访问便利性的数据容器data?

答案是肯定的,我们为GWA2 Java增加了线程间数据共享通道 globalData.

通过之前第二步的改进我们知道,当使用!感叹号标记的变量声明时,即可声明一个作用域为对象类的变量(fig1.中的code和data区域),这个变量可以在所有线程可见,在当前对象类的所有方法体可见。
如果把它声明为ConcurrentHashMap,其自身数据将是线程安全的,同时如果再进一步提供某种机制,保证每个线程都能够通过它读取到线程Id相关的数据,则又实现了线程间的数据差异。
沿着这个思路,我们定义GWA2 Java多线程间数据共享通道 globalData 。

<%!ConcurrentHashMap globalDataHolder;%>
<%globalDataHolder = new ConcurrentHashMap();%>
<%!
//- write/read global data into/from a thread-safe holder, 09:18 2022-02-24
//- write
public static void globalData(String key, Object value){ .
String threadDataKey = “GWA2-” + ProcessHandle.current().pid() + “-” + Thread.currentThread().getId();
.. }
//- read
public static Object globalData(String key){ … }
%>

如此以来,我们拥有了全局的数据容器globalDataHolder, 只是它的读写是线程安全的,但数据并不是线程安全的(没有线程标记),读写带有线程Id标记的数据时,需要通过全局静态方法 globalData .
预期使用场景, 在GWA2 Java的任何代码区域,可以访问到 globalData, 通过这个通道可以轻松读写线程安全的数据。
任意代码区,写数据: globalData(“a-key-name”, Single_Value_Or_List_Object);
读取数据: String aString = (String)globalData(“a-string-key”);

在GWA2 Java的请求处理的 comm/footer 部分,会对全局的数据容器 globalDataHolder与本地的 data数据做进一步的merge操作,然后一同交给下一步的模板处理引擎Hanjst.

这个通道取名 globalData,也参考了GWA2 PHP的做法,比如在PHP中,任意代码块中,可以访问全局变量,使用关键字 global $myObject ,意思是现在要去读取全局变量 $myObject 这个对象了( https://www.php.net/manual/en/language.variables.scope.php )。
GWA2 套系(GWA2 PHP,GWA Perl, GWA2 Python, GWA2 Aspx),跨越多个编程语言,也希望能超越单个语言限制,赋能软件研发,提升生成力。

以上引用的代码块可以在GWA2 的项目GitHub库( https://github.com/wadelau/GWA2 )中查阅,也可以在 gitee上的GWA2( https://gitee.com/xenxin/GWA2 )访问到。

客户问道:更新升级后的 GWA2 Java 还有bug或漏洞吗?
诚惶诚恐地,我们的答案:没有已知的问题了。
哪一个 GWA2 的版本是最好的?
下一个。


全文原发: https://ufqi.com/blog/gwa2-java-multiple-threads-globaldata/ , -R/22SU


GWA2

-GWA2 吉娃兔 是”通用网络应用架构( General Web Application Architeture, https://ufqi.com/dev/gwa2/ )”,基于 -GWA2 可以轻便构建各种网络应用程序,
包括复杂的在线购物商城、在线医疗、在线教育、 旅游交易平台、社群或者社交网站和新闻资讯网站等,
也包括各种企事业单位网上门户,在线交互及服务作业系统等.
还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部.
-GWA2 是为数不多的支持跨开发语言的应用框架,目前支持 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for Native App, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

-GWA2 is E.A.S.Y 
Easy Along, Swift Yield
轻松启动, 快速产出.


有福金融UfqiFina : https://ufqi.com/finance

有福金融 是一个旨在促进财富稳步增长的工具平台。
UfqiFina is a platform of tools designed to promote wealth growth steadily.

发表在 -GWA2, 编程技术, 计算机技术 | 标签为 , , , , , , | 2条评论

山羊绒围巾女冬英伦百搭围脖双面格子加厚保暖披肩迪士尼母婴显白黑茶色蓝黑色板栗色三元牛奶