Fannngxun写字的地方

老和山下的书桌


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

  • 搜索

可汗学院金融学笔记

发表于 2019-04-25 | 分类于 经济
字数统计: 1.6k | 阅读时长 ≈ 5

可汗学院的课程较为浅显,主要是结合生活中的具体例子对各种金融术语进行解析。因此,我个人更偏向于把这份笔记当作是术语字典。

利息

前两集介绍了利息的概念,并举例对利息的计算方法做了说明。利息(interest)分为两种,单利(simple interest)和复利(compound interest)。复利是指在每经过一个计息期后,都要将所剩利息加入本金,以计算下期的利息,俗称利滚利,单利则不用计入。

计算方式如下,其中P为本金(principal), t为时间, r为利率。

单利:

复利:

现值

现值(present value)就是根据当前收益率,算出一笔将来资金的当前价值。

例子:假定年收益率为5%, 现在有两种选择,1. 现在就给你100元。 2. 一年后给你110元。哪种选择更划算?

同样有两种思考方式:

计算一年后收益(yield)= $100 * 1.05 = 105 < 110​$, 选择方案2。

计算现值(PV)= $110 / (1 + 0.05) = 104.76 > 100$, 选择方案2。此时5%就可以理解为贴现率(discount rate)

接下来用表格的方式给出3种选择, 初始值带$符号,假定无风险年利率依然为5%:

Choice1 Choice2 Choice3
Today $100 $104.76 / 1.05 = 99.77$ $20 $+ 50 / 1.05 + 35 / 1.05^2 = 99.37$
Year1 $100 * 1.05 = 105$ $110 / 1.05 = 104.76$ $50
Year2 $105 * 1.05 = 110.25$ $110 $35

现在就能在三种选择间做一个比较了,以前人们在面临制定退休计划或是面对保险推销员时总会有所困惑,如在a年b年c年交纳多少钱,然后在b,c,d年回报多少钱,现在就可以用现值做比较。

在上例中,choice1 是最好的选择。

如果贴现率变成2%呢?

此时choice2 变成了最好的选择。

到目前为止,所有的讨论都是基于相同的贴现率,那么如果贴现率是随时间变化的呢?比如存1年和存5年的利率并不相同。

假设有一项国债,一年的年为利率1%,二年的年利率5%,此时三种方案又如何呢?

在以上三种情景中,支付流并没有改变,利率的改变最终影响了各种选择的现值。

而第三种选择就是所谓的贴现现金流,基于对各个时期利率的估计,利用Excel做一些简单的数学计算。

再次强调,上述计算是在无风险的假设下。在金融领域里,贴现率假设无处不在,这也是金融不同与科学的地方,实际上它没有正确的答案,这些模型只是帮助你理解事物的动态。

资产负债表

也就是 Balance Sheet ,表里有如下的三种概念:

  • 资产(Assets ),可以在将来带来经济利益的东西,如钱可以用来买东西、雇佣工人、度假等,再如房子可以居住;
  • 负债(Liability ),对别人的经济负担或者义务,需要在将来偿还的;
  • 权益(Equity ),所有的资产在偿清债务之后剩余的。

计算公式:A = L + E

假设你现在有$250k现金,房价为 $1000k, 对应着三种情况:

  • A. 贷款买房前
  • B. 贷款后,银行说,你的信用等级不错,那就借给你吧;我就保留了一个IOU借据在银行。
  • C. 买房后, 此时有了法律保障的房契以及银行的借据。
情况 E L A
A $250k 0 $250k
B $250k $750k $1m
C $房子 - $750k $750k 房子

通常银行不会轻易贷款给你,需要有超过贷款额20%左右的资产作为抵押,当然现买的房子也可以。如果还不上贷款,那么银行就会收回房子,这时银行会赚25万,而你自己什么都没有了。而如果在这个过程中房价变化了,比如升值或者贬值了,负债不会变化,而权益会随着房价的变化而变化。

债券和股票

公司和个人一样,也有资产负债表。公司有两种途径来融资,1.发行股票。2.发行债券。这两者的区别是来源于资产负债表的不同部分。

股票(stock)本质上来源于公司的权益,假设有一个公司,它的财报显示总资产是$100m, 负债是$60m, 则对应的权益应为$40m。此时如果它在市场上发行了1000万股股票,理论上每股价格应为$4($Equity / the number of stocks$)。而如果此时市场上的价格为每股$3, 则市场认为这个公司的权益没有财报显示的那么高,当然市场的反应不一定对,也有可能是股价被低估。

公司的债务是在银行贷的款,银行可能将这些债务做成债券(bond)投放到市场上出售,如果银行发行了6w份该公司的债券,则相应的每份价格应为$1000。当债券到期,购买者能获得本金以及一定的利息。

股票划分的是权益,而债券划分的是公司债务。两者都是证券(security),也许原文在表达上更清晰一点:A security in the equity world is a stock,A security in the debt world is a bond.

对于股票持有者,他就是公司拥有人之一,获得的收益会随着公司盈利的变化而变化,而债券持有人相当于公司债权人,一定程度上不受公司经营的影响,换句话说,只要公司还的起钱,无论亏损还是盈利,该还多少钱还得还多少。

思考题:当公司破产清算时,是优先还钱给债券持有人,还是分红给股东?

答案:破产清算,先是偿还企业员工的工资和所欠税款。然后偿还债权人,其次偿还次级债的。最后才轮到股权的清偿。

股市学习从入门到放弃

发表于 2018-12-28 | 分类于 经济
字数统计: 5.6k | 阅读时长 ≈ 18

作为一颗韭菜,虽然摆脱不了被割的命运,但是希望能够多学一点东西,至少被割的明白一点。

新股民必备常识

投资资金的准备

一定是一段时间闲置不用的资金(最多占存款的25%),做好血本无归的打算。

投资方式的准备

长期、中期、短期投资,取决于资金的闲置时间;

激进、稳健、保守,取决于投资者的水平、精力;

投资技巧的准备

选股的技巧;

趋势的判断;

确定买卖的时机,回避风险的技巧;

技术指标,波浪理论;

注意:先学习再入市!!!

交易规则

交易时间:

周一至周五(法定休假日除外)

上午9:30——11:30

下午1:00——3:00

交易单位

股,100股=1手,

委托买入数量必须为100股或其整数倍。

涨跌幅限制

在一个交易日内,除首日上市证券外,每只证券的交易价格相对上一个交易日收市价的涨跌幅度不得超过10%,超过涨跌幅限价的委托为无效委托。

“T+1”交易

“T”表示交易,“T+1”表示交易日第二天。

该制度指的是投资者当天买入的证券不能在当天卖出,需待第二天才可以卖出。

(A股为T+1交收,B股为T+3交收)

投资方法与技巧

证券分析的主要方法

1.基本面分析(侧重长期分析)

分析影响股票市场供求关系的要素:

  • 宏观经济情况
  • 行业动态变化(比如前两年锂电池、汽车,18年芯片)
  • 上市公司的业绩前景、财务结构、经营状况(白酒行业里的贵州茅台)
  • 政治因素,心理因素

资料来源:上市招股书、财务报告、上市报告等

2.技术分析

根据市场行情变化分析

两个主要指标:价格、成交量

3.资金面分析

中国股市从早期庄家过渡到了机构博弈的时代:包括银行基金、社保基金、企业年金、私募基金、保险基金等。

分析以上主要资金流的行为。

证券投资分析的主要步骤

  1. 信息资料的收集和整理
  2. 大势研判
  3. 个股选择 (中长线选行业、区域,如自贸区、概念、业绩、成长性和发展潜力,短期看技术面和资金面)
  4. 制定操作计划(人民币就像兵,不要当作赌博)
  5. 确定买卖时机 (主要依靠分析技术指标)

技术分析的基础知识

  1. 基本要素:量价时空
  2. 最大优点:贴近市场,获得收益周期短,见效快
  3. 主要方法:K线分析、切线分析、形态分析(w底m头)、技术指标(MACD)
  4. 适用范围:短期投资操作,长期投资预测一定要和基本面结合!

技术分析是概率的,不可能百分百正确!

K线理论浅析

K线起源

K线起源于18世纪中叶日本德川幕府时代,从事粮食生意的商人用于记录米价涨跌的一种图表。K线图形似蜡烛,故也称蜡烛图。(Candle前面发K音)

K线含义

K线4个价位是一个四维向量,反应股价的高低和变化趋势。按时间周期不同可以分为:5分钟K线、30分钟K线、60分钟K线、日K线、周K线、月K线、年K线等。

按4个价位的关系,K线可以分成3类:阳线类、阴线类、非阳非阴类。

记录方法

收盘价>开盘价 红色

开盘价>收盘价 绿色

K线类型

  • 阳线类

    ​

a. 没有上下影线的阳线,表明开盘以后,买方势强,股价节节攀升,尾市收于当日最高价。如果涨幅很大,则称大阳线;涨幅小,则称小阳线。

b. 无上影线有下影线的阳K线,表明开盘后股价曾经在某一时刻跌破开盘价,创出全日最低。其后,由于买盘力量强大,股价向上突破开盘价,并以全天最高价收盘。

c. 无下影线有上影线的阳K线,开盘价即是全日最低价,然后股价上升到最高价,收盘时受挫回落构成上影线,但收盘价仍然在开盘价之上。此类K线表明股价在上升中遭受到阻力、但股价仍然在上升。

d. 有上下影线的阳线,实体与影线的关系,以开盘价和收盘价为平衡位。

  • 阴线类

a. 没有上下影线的阴线,表明开市后,股价一路下跌,并以最低价收盘,开盘价即是最高价。

b. 无下影线有上影线的阴K线,属先涨后跌型,收盘价是全日最低价。也称光脚阳线,一般代表行情看淡。

c. 无上影线有下影线的阴K线(图有问题),表明股价先跌而后有所回升,构成下影线收盘。一般说明下档虽然出现了支撑,但行情一时还难以变好。

d. 有上下影线的阴线。

  • 非阳非阴类

a. T字形K线,收盘价等于开盘价,也等于最高价。如果在高位,就是见顶信号。

b. 一字线,最高价、最低价、收盘价、开盘价均相等,全天只有一个成交价。上升期中表示强势,啪啪涨停板;下降期就是弱势(乐视网)。

c. 十字形K线,表明股价曾高于及低于开盘价,但收盘价与开盘价相同。高位见顶信号,低位见底信号。

d. 倒丁字形K线,收盘价等于开盘价,且等于最低价。开盘后涨幅较大,收盘时跌至最低,以开盘价收市。也称零位线。

注意:单独的图形是不能用来判断行情的,一定要结合趋势!!!

移动平均线

使用软件:通达信(随个人喜好)

什么是移动平均线

移动平均线(MA,Moving Average):是以道琼斯的“平均成本概念”为理论基础,采用统计学中“移动平均”原理,将一段时间内的股票价格平均值连成曲线,用来显示股价的历史波动情况,进而反映股价指数未来发展趋势的技术分析方法。

依照计算周期可以分为短期(5、10日),中期(30日)和长期(60、120日)。

MA5:5日平均线,白色。

MA10:10日平均线,黄色。

MA30:30日平均线,紫色。

MA60:60日平均线,绿色。

移动平均线运用法则

移动平均线所表示的意义

事先声明:以下所有判断均有一定滞后性!!!

  • 上升行情初期,短期移动平均线从下向上突破中长期移动平均线,形成的交叉叫黄金交叉。预示股价将上涨。如图所示,5日均线上穿10日均线形成的交叉。10日突破30日也是黄金交叉。
  • 当短期移动平均线向下跌破中长期移动平均线形成的交叉叫做死亡交叉。预示股价将下跌。如图所示,10日均线下穿30日均线。
  • 在上升行情进入稳定期,5、10、30日移动平均线从上而下依次顺序排列,向右上方移动,成为多头排列。预示股价将大幅上涨。
  • 在下跌行情中,5、10、30日移动平均线自下而上依次顺序排列,向右下方移动,成为空头排列,预示股价将大幅下跌。
  • 在上升行情中,股价位于移动平均线之上,走多头排列的均线可视为多方的防线;当股价回档至移动平均线附近时,各条移动平均线依次产生支撑力量,买盘入场推动股价再度上升,这就是MA的助涨作用。
  • 在下跌行情中,股价在移动平均线的下方,呈空头排列的均线可以视为空方的防线,当股价反弹到移动平均线附近时,便会遇到阻力,卖盘涌出,促使股价进一步下跌,这就是MA的助跌作用。

成交量怎么看

有句老话:新手看价,高手看量,老手看势。

这里的量就是指成交量,也是分析庄家动向的重要依据。

成交量是K线图下方的副图。

柱状图颜色与K线一致,高度表示买卖的数量。

多头市场特征和空头市场特征

多头就是看涨股票的人

多头市场特征:

  • 股价上升,成交量增加
  • 股价回档,成交量减少
  • 股价盘整,成交量萎缩
  • 股价再度上升,成交量随之增加

红色阶段股价上升,成交量上升;

紫色阶段股价盘整,成交量萎缩;

绿色阶段,股价回档,成交量减少。

空头是指看空后市,看跌的人

  • 股价下跌,成交量减少
  • 股价反弹,成交量增加
  • 股价盘整,成交量减少
  • 股价再度下跌,成交量下跌

可以看到人气越来越弱。

多空平衡——市场上看涨和看跌的人势力基本均衡

成交量小技巧

温和放量一般出现在市场底部区域,并且在这之前已经出现了一波下跌或者行情调整。

巨量,是指股价在运行过程中突然放出巨大的成交量,一般当天放出的成交量至少是前一天的两倍以上。

天量见天价不一定正确!如图:

股价在下跌过程中出现巨量,一般标志着做空能量的最后一次释放,股价会出现反弹。

股价在上升期中出现巨量,一般意味着动能的耗尽,股价会出现回调或者滞涨。

地量,指成交量呈现极度缩小的状态,表明盘中交易相当的冷淡,成交很不积极。

这种情况一般出现在股价经过一波长期下跌的底部区域。

地量一般会出现阴跌不止的现象,或者证明主力把筹码锁的很死。

通过把股价锁定在底部,洗出不坚定的散户,为盈利做准备。

MACD指标

MACD指标概念和原理

趋向指标——平滑异同移动平均线(MACD,Moving Average Convergence Divergence),是Geral Appel于1979年提出的,它是一项利用短期(常用为12日)移动平均线和长期(常用为26日)移动平均线之间的聚合与分离状况,对买进、卖出时机做出研判的技术指标。有“指标之王”的美誉。

打开软件,最下面的副图就是MACD,双击可展开。

MACD图中也有金叉和死叉,这里的金叉是指白线从下往上上穿黄线,反之则是死叉。

MACD指标简单实战技巧

  • 情况一:低位金叉

DIFF线(白)与DEA线(黄)金叉的位置,如果出现在零轴下方,并且远离零轴,这个金叉就称为低位金叉。投资者可将此时的金叉,仅仅视为股价的一次短期调整。

  • 情况二:零轴附近金叉的买点

如果上涨趋势已经形成,DIFF线与DEA线的金叉发生在零轴附近,那么此时是投资者买入的绝佳时机。

  • 情况三:高位金叉的买点

如果DIFF线与DEA线的金叉发生在零轴以上,且处于距离零轴较远的区域,那么该金叉就被称为高位金叉,高位金叉一般出现在股价上涨过程中的回调。高位金叉一般也是可以买入的。


  • 情况一:低位死叉的卖点

低位死叉,是指发生在零轴下方较远地方的死叉。这种低位死叉,经常出现在下跌趋势中向上反弹结束时,因此低位死叉是反弹结束的卖出信号。此时,没有入场的投资者要注意持币观望,仍然持有股票被深度套牢的投资者,要注意风险。

  • 情况二:零轴附近死叉的卖点

如果之前的市场方向一直都是下跌趋势,此时DIFF线在零轴附近跌破DEA线形成的交叉被称为零轴附近死叉,它表明市场在零轴附近已经积聚了较多的做空能量,死叉出现,预示着市场向下的动能开始释放,股价接下来将延续原来的下跌趋势。

分时走势图

打开软件,选中一只股票,点开,默认是显示日线图,在上方菜单栏中选择分时按钮,即可调出分时图。

什么是走势图

分时走势图也叫即时走势图,它是把股票市场的交易信息实时地用曲线在坐标图上加以显示的技术图形。坐标的横轴是开市的时间,纵轴的上半部分是股价或指数,下半部分显示的是成交量(黄色)。分时走势图是股市现场交易的即时资料。

分时走势图分为指数分时走势图和个股分时走势图。

分时走势图中的名词及含义

上图就是上证指数的分时图,白色曲线表示上证交易所对外公布的大盘指数,也就是加权数。黄色曲线是不考虑上市股票发行数量的多少,将所有股票对上证指数的影响等同对待,是不含加权数的大盘指数。

参考白色曲线和黄色曲线的相对位置关系,可以得到以下信息:

当指数上涨,黄色曲线在白色曲线走势之上时,表示发行数量少(盘小)的股票涨幅较大;而当黄色曲线在白色曲线走势之下,则表示发行数量多(盘大)的股票涨幅较大。

当指数下跌时,如果黄色曲线仍然在白色曲线之上,这表示小盘股的跌幅小于大盘股的跌幅;如果白色曲线反居于黄色曲线之上,则说明小盘股的跌幅大于大盘股的跌幅。

红色、绿色的柱线反映当前大盘所有股票的买盘和卖盘的数量对比情况。红柱增长,表示买盘大于卖盘,指数将逐渐上涨;红柱缩短,表示卖盘大于买盘,指数将逐渐下跌。绿柱增长,指数下跌量增加;绿柱缩短,指数下跌量减小。黄色柱线表示每分钟的成交量,单位为手。


个股的分时走势图就不一样了。

白色曲线表示该种股票分时成交价格,黄色曲线表示该种股票的平均价格。下方柱线是每分钟的成交量。


分时图旁边有一些名词:

外盘指成交价是卖出价时,成交手数的总和;内盘指成交价是买入价时成交手数的总和。

当外盘>>内盘时,且股价也在上涨过程中,表明很多人在抢盘;当外盘<<内盘时,且股价在下跌,表明很多在抛售。(简单的方法就看颜色)

卖一 ~ 五是委托卖出的价格,买一 ~ 五委托买入的价格。旁边黄色的是是委托的手数。

委比:委买与委卖手数之差与之和的比例。

委差:委买手数与委卖手数的差值。

当委比是正值的时候,表示买方的力量强,上涨的概率大;反之,同理。(但这个指标容易作假)

量比:当日总成交手数与近期平均成交手数的比值。>1表示这个时刻的成交手数放大了,<1代表是萎缩的。

PE:市盈率。属于基本面。

股市切线法之趋势线

这一节很玄学,大家看看就好。

股票市场价格随着时间的推移,在图表上会留下其运行轨迹,这一轨迹呈现一定的方向性,方向性反映了价格的波动情况。简单地说,趋势就是价格波动的方向,或者说是证券市场运动的方向。

上升趋势线

上升趋势线是在股价持续上涨过程中,将每次的调整低点相连而成的趋势线。

下降趋势线

股价在持续下跌过程中,将每次的反弹高点相连而形成的趋势线。

对趋势线突破翻转的应用技巧

一般来说,趋势线对价格今后的变动起约束作用,使价格总保持在这条趋势线的上方(上升趋势线)或下方(下降趋势线)。实际上,就是起支撑和压力的作用。

趋势线被突破后,就说明价格下一步的走势将要向相反的方向运行,越重要越有效的趋势线被突破,其转势的信号越强烈。

筹码理论

筹码是什么

在股市中,筹码是投资者手中持有的一定数量的股票。

在软件右下方点击“筹”即可查看筹码分布。

股票的交易是买卖双方在某个价位,进行成交而实现。随着价格的上升或下降,会在不同的区域产生不同的成交量。在不同价位的分布量,就造成了不同价位的持仓成本。点击右下方的“笔”,这个流通盘是固定的,这里有9.56亿的流通盘,就有9.56亿的筹码。将不同价位的筹码按照不同价位横向排列起来,就形成了筹码分布,如上图。

分布图中有不同的颜色,具体的解释在图例中有标注。例如,红色的表示5周期前成本,对于日线来说,就是往前5日~1日;粉红色是10周期成本,就是往前10日~5日。

筹码分布图的作用

  • 能有效判断行情的性质和趋势

    如果K线处于筹码密集区的上方,表示行情较强,即时回调也是暂时的;如果K线在大量筹码下方,则意味着行情较弱,很多人被套牢了。

  • 能有效识别主力建仓和出货的全过程

    一般分为建仓、洗盘、拉升、出货几个阶段。下面几幅图再现了完整的过程,到最后,筹码分布在K线两侧,散户没有实力继续拉升,只能被套牢。

    ​

  • 能有效的判断行情发展中重要的支撑位和阻力位

    可以从上面的主力出货过程看到,当大部分筹码分布于K线以下时,一般可以持积极心态;而当大部分筹码分布于K线以上时,则要小心谨慎。

认识庄家

庄家的分类

一、按照运作周期来分:长线庄家、中线庄家、短线庄家

长线运作周期至少1年,上涨幅度至少一倍,控盘程度很高,能达到60%~80%,有明显坐庄痕迹,庄家实力雄厚,在宏观面、政策面、个股基本面都有一个很好的把握;中线周期一般在半年到一年,控制的筹码在50%左右,上涨幅度在40%以上,中线庄家往往借助中级行情,利用一些利好以及一些个股基本面的重大变化来拉高,或者通过板块联动;短线周期仅为几周或几个月,多见于强反弹的走势中,股价相对低的时候快速拉升,吸引中小散户。

二、按照庄家的主体性质来分:

政府庄家、券商庄家、上市公司庄家、基金庄家

政府庄家:在股市极度低迷的时候才会介入,主要为了维护国家金融秩序,防止经济崩溃。拥有雄厚的资金和配套的政策。

券商庄家:证券公司自己坐庄股票。信息融通,对金融政策反映灵敏,利用担当上市公司的推荐人,在第一时间了解上市公司的基本信息,市场上流通的被散户知晓的信息往往已经过时。注重成交量,可以多收手续费。必要的时候,明知亏本也会坐庄,主要是对成交的新股或者配股的股票进行护盘。

上市公司庄家: 自己炒自己的股票。对本公司的信息了如指掌。为了维护公司形象,会出手护盘,做亏本生意。

基金庄家:注重价值,注重绩优股。组合投资分散风险,力求保证资金的安全。与投资基金管理公司所属券商有千丝万缕的联系,在选股上有较强的契合性。

庄家的优势

  • 资金的优势

    高抛低吸,围点打援

  • 消息方面的优势

    信息渠道,包含获取的渠道和传播的渠道。尤其是上市公司的内幕信息。有时候会散播假消息,迷惑散户。

  • 人才方面的优势

    拥有一批高水平的操盘手、公关人才、行业分析师。

庄家与股评人之间的关系

  • 股评人不知道自己被利用

    庄家会关注一些著名股评人,适当配合股评人的预测。股评家最后落得个”股托“的名声。

  • 股评人被庄家收买

    送现金、送股票、送分红。吸货的时候,大唱悲观论调,动摇股民信心;吸住货时,又大肆吹捧,该股有成长性,有潜力。

  • 庄家自己就是股评人

    大机构会专门培养股评人。

Draw multiple polylines on Google Map with Python

发表于 2018-10-12 | 分类于 可视化
字数统计: 848 | 阅读时长 ≈ 4

起因

类似拥堵路段的绘制,我们需要在地图上根据风险程度,对不同的街道着以不同的颜色。

困难

  • 关于绘制线段,Google Maps 只提供了 JavaScript API, 而我对JavaScript不熟。

  • 数据文件在本地,需要进行预处理,JS并不擅长做数据处理和分析。

  • Google 提供的example只有相连的polyline(轨迹), 而我需要的是绘制很多割裂的线段。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Simple Polylines</title>
    <style>
    /* Always set the map height explicitly to define the size of the div
    * element that contains the map. */
    #map {
    height: 100%;
    }
    /* Optional: Makes the sample page fill the window. */
    html, body {
    height: 100%;
    margin: 0;
    padding: 0;
    }
    </style>
    </head>
    <body>
    <div id="map"></div>
    <script>

    // This example creates a 2-pixel-wide red polyline showing the path of
    // the first trans-Pacific flight between Oakland, CA, and Brisbane,
    // Australia which was made by Charles Kingsford Smith.

    function initMap() {
    var map = new google.maps.Map(document.getElementById('map'), {
    zoom: 3,
    center: {lat: 0, lng: -180},
    mapTypeId: 'terrain'
    });

    var flightPlanCoordinates = [
    {lat: 37.772, lng: -122.214},
    {lat: 21.291, lng: -157.821},
    {lat: -18.142, lng: 178.431},
    {lat: -27.467, lng: 153.027}
    ];
    var flightPath = new google.maps.Polyline({
    path: flightPlanCoordinates,
    geodesic: true,
    strokeColor: '#FF0000',
    strokeOpacity: 1.0,
    strokeWeight: 2
    });

    flightPath.setMap(map);
    }
    </script>
    <script async defer
    src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&callback=initMap">
    </script>
    </body>
    </html>

    解决方案

    最终我选择用Python进行数据处理,将得到的处理结果以字符串形式插入到HTML文本中,保存,即可在浏览器中查看结果。

    注意: string.format() 插入参数处需用“{}”标识,原有的“{}”需用“{{}}”代替。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    def genHTML(filepath):
    polylines, pathcolors = getDataFromFile(filepath)
    return """
    <!DOCTYPE html>
    <html>
    <head>
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no">
    <meta charset="utf-8">
    <title>Simple Polylines</title>
    <style>
    /* Always set the map height explicitly to define the size of the div
    * element that contains the map. */
    #map {{
    height: 100%;
    }}
    /* Optional: Makes the sample page fill the window. */
    html, body {{
    height: 100%;
    margin: 0;
    padding: 0;
    }}
    </style>
    </head>
    <body>
    <div id="map"></div>
    <script>

    // This example creates a 2-pixel-wide red polyline showing the path of
    // the first trans-Pacific flight between Oakland, CA, and Brisbane,
    // Australia which was made by Charles Kingsford Smith.

    function initMap() {{
    var map = new google.maps.Map(document.getElementById('map'), {{
    zoom: 11,
    center: {{lat: 40.65, lng: -74.00}},
    mapTypeId: 'roadmap'
    }});

    var testpaths = [{pathdata}];
    var testpathcolors = [{pathcolors}];

    for (var i=0; i <testpaths.length; i++){{

    var polyline = new google.maps.Polyline({{
    path: testpaths[i],
    geodesic: true,
    strokeColor: testpathcolors[i],
    strokeWeight: 2,
    strokeOpacity: 1
    }});

    polyline.setMap(map);

    }}
    }}
    </script>
    <script async defer
    src="https://maps.googleapis.com/maps/api/js?key={YOUR_API_KEY}&callback=initMap">
    </script>
    </body>
    </html>
    """.format(pathdata=polylines, pathcolors=pathcolors, YOUR_API_KEY="YourKey")

    ​

生成后的HTML文件中的关键片段, 其中分离的线段可以通过多次调用setMap()实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<script>
function initMap() {
var map = new google.maps.Map(document.getElementById('map'), {
zoom: 11,
center: {lat: 40.65, lng: -74.00},
mapTypeId: 'roadmap'
});

var testpaths = [
[{lat: 40.64204491, lng: -73.98123241},
{lat: 40.64170758, lng: -73.98204322}],

[{lat: 40.81448703, lng: -73.95545832},
{lat: 40.81365059, lng: -73.95349239}],
// More coordinates here...
]
var testpathcolors = ['#EE00EE','#6495ED' //more color here...
]

for (var i=0; i <testpaths.length; i++){

var polyline = new google.maps.Polyline({
path: testpaths[i],
geodesic: true,
strokeColor: testpathcolors[i],
strokeWeight: 2,
strokeOpacity: 1
});

polyline.setMap(map);

}
}
</script>

最终的结果:

CS前景思考

发表于 2018-08-12 | 分类于 生而为人
字数统计: 1k | 阅读时长 ≈ 3

几年前选专业的时候,CS处于一个不温不火的状态,其实我本来最想去的是电气,不过最后阴差阳错地进了计算机相关的专业。社会上对程序员一直存在着一种偏见:木讷、不善交际、缺乏生活情趣、社会地位低、人脉资源少。身处这个行业的我虽然很不爽这种言论,但是就我亲身感受而言,这种偏见确实有其生长的土壤。我周围有很多优秀的技术大神,秉持着“技术至上”的理念,对技术的雕琢无可挑剔,但是不少人缺乏与人沟通的技巧,缺乏展示自我的手段和意愿,一心沉醉在技术世界,不闻窗外之事。加上近几年CS大热——留学申请难度逐年递增、海外CS从业人员回国抢食、转行潮、某些网络社区对CS的热捧,使得科班出身的从业人员内心骄纵之气日甚。

月满则亏,水满则溢。做人如此,行业也是如此。股市里有个非常著名的风向标:当菜市场大妈都知道要投资股市的时候,就是退场的最好时机。行业兴衰基本也符合这种规律,当大家一窝蜂地涌向某个行业时,这个行业离衰落也就不远了,至少相对于其本身不复辉煌,这是由市场的滞后性决定的。

这些年IT行业的发展也更加证实了这种判断。各种框架层出不穷,编程门槛和学习成本不断降低,开发效率越来越高,也正因为如此,产生了很多被科班人员嘲讽为“调包侠”的人,这应该是行业的进步,是生产力的进步,但对科班从业人员来说是其实是一种威胁,使得他们经年累月的知识积累无用武之地(有些夸张,但效用降低是真的),使得整体的待遇水平愈发趋近于社会平均水平。

也许有人会说,我不会变成调包侠,我要专注于计算机技术,把技术打磨到极致?很遗憾,这条路过于艰难。打磨到极致当然有用,但是有几人能够打磨到极致呢?技术的提升同样遵循经济学规律,越到后面,你需要投入时间、精力就越多,边际效益递减,边际成本剧增,况且高级技术职位的坑也就那么几个,你有多少信心认定那个坑一定是你的?另一方面,即使你跟上了技术发展的潮流也是不够的。以深度学习为例,这些岗位对知识的要求够高了吧?从2012大放异彩,到如今5年过去,从手撕神经网络,到caffe, tensorflow, 再到如今的keras, 深度学习也渐渐变成只要搭搭积木就能解决问题的技术。这样一来,懂得其他行业专业知识的人虽然代码写得不如科班人员迅速高效,但他们能解决计算机人员无法解决的问题(科班往往只关注计算机本身),由此创造的效益会超过科班高效节省的成本,整个社会会选择哪一种人不言自明。

和唯物史观认为的不同,计算机的历史更像是天才引领的历程,大多数普通人仅仅只是使用者,未来的计算机注定成为一种通用性的工具,CS专业也会变成一个普通的专业。作为科班人员,要正视这种危机,我们真正应该关注的是,如何利用计算机解决各行各业的问题,如何利用自己对计算机的深刻理解建立独一无二的个人价值。

记忆体系与学习方法

发表于 2018-08-12 | 分类于 生而为人
字数统计: 665 | 阅读时长 ≈ 2

高中及其之前的学习,老师都要求我们尽可能地掌握每一个知识点,这种学习方法的唯一目的就是为了在考试中取得高分。但是进入大学以后,知识量爆炸性地增长使得这种方法的学习效率变得很低,同时大学的学习不再纯粹地以分数为导向,更多地以解决实际问题为目标(为了找工作也算一种吧),在这种需求的推动下,势必要对原有的学习方法做出改进。

人脑的的历史可以追溯至万年以前,在这万年间,脑硬件的升级几乎微乎其微,而科技几百年的积累已经让它不堪重负,前沿研究员培养周期的延长便是最好的证明。这个问题很大程度上由人脑的存储结构造成的。人在思考的时候,能存储的条目至多不会超过七个,换句话说,人脑其实顶多只有七个寄存器而已;同时,已经存储在人脑中的知识如果不经常用,也会渐渐遗忘,就好比内存,掉电或者频繁地切换内容也会导致原有记忆的丢失;由此,人们发明了各种工具来辅助记忆,从石板、竹简、印刷、电子存储,再到互联网,人类获取外部知识的成本越来越低。

其实我们完全可以借鉴计算机存储体系设计的思路来优化我们的学习方法。因为我们最终的目标是解决问题,完成项目,所以重要的并不是你记住了哪些可以解决问题的手段(当然在具体的学习中过一遍脑子还是需要的),而是应该知道去哪里能找到解决问题的方法 。思维导图一类工具的出现大大简化了对知识建立索引的过程,索引的体量要远远小于对应的知识总量,减轻了大脑的记忆负担。剩下的工作就是要确定问题属于哪一类?该用哪一种手段解决?确定后到对应的索引中去找即可。那如果现有的记忆索引中没有呢?找资料->学习理解-> 建立索引->添加至索引数据库,OK, Done。

上面的过程其实就是很多介绍学习方法的大牛所说的建立知识体系 ,结构化、体系化的知识确实更适应大脑的特点。

深度学习与电路理论

发表于 2018-08-10 | 分类于 深度学习
字数统计: 351 | 阅读时长 ≈ 1

在Coursera上学习吴恩达的DeepLearning.ai时遇到了一个疑惑——为什么一定要深度学习? 为什么要添加多个隐藏层?吴恩达给出了两种解释:1. 类比人脑, 越靠近输入的层学习越简单的特征,越靠近输出的层将前面各层的特征组合起来学习更加复杂的特征。2. 电路理论。

电路理论

There are functions you can compute with a “small” L-layer deep nerual network that shallower networks require exponentiall more hidden units to compute.

例如异或操作:

其中第一种解释很直观,第二种解释虽然直觉上是认可的,但应该有更通俗明白的解释。

假设输入三位数据$x_1x_2x_3$(e.g. 001), 采用深层网络可以拟合为$x_1⊕x_2⊕x_3$,而浅层网络拟合成什么样呢?这个时候就需要借助数电中根据真值表写逻辑表达式的技巧。

真值表如下

$x_1$ $x_2$ $x_3$ True Value
0 0 0 0
0 0 1 1
0 1 0 1
1 0 0 1
1 1 0 0
1 0 1 0
0 1 1 0
1 1 1 1

所以浅层网络推导为:

$x_1⋅x_2⋅x_3+x_1′⋅x_2′⋅x_3+x_1′⋅x_2⋅x_3′+x_1⋅x_2′⋅x_3′$

显然,深层网络需要的电子器件数为$O(logn)$, 而浅层网络需要$2^{n-1}$指数数量的器件,深层网络的拟合能力要远远强于浅层网络。

纽约犯罪风险预测结果可视化

发表于 2018-06-05 | 分类于 可视化
字数统计: 733 | 阅读时长 ≈ 3

毕设炼丹已经很心累了,系里还强行要求论文也得弄个3~5min视频解说,手动尼克杨问号脸???反正现在视频怎么做还没思路,就先把纽约市的犯罪风险预测结果做个可视化吧。

技术路线

数据科学领域……不用Python是不可能的,这辈子都不可能不用python的,Basemap嫌太丑,Echarts又不会,Plotly还要注册,就只能靠geoplotlib勉强混混日子这样子。

前期准备

三个文件:2015年纽约犯罪风险等级预测结果risk4visualization.csv(毕设结果),纽约人口普查区域编号和实际社区编号的映射文件cd2puma.json(手动编写的), 纽约社区边界文件Community_Districts.geojson(点此下载)。

绘制风险图

设置颜色级别, 风险等级分为0~5级,共六个级别:

1
cmap = ColorMap('Reds', alpha=255, levels=6)

获取颜色,这个函数在绘制每个区域时都会被调用,根据index来查找对应的风险等级,再转化为颜色。这里用的to_color()其实是用于连续值映射的,后来翻阅文档时发现了对应于离散值映射的函数create_set_cmap and colorbrewer,效果应该没差多少也就懒得改了。

1
2
3
4
5
6
7
8
9
def get_color(properties):
key = properties['boro_cd']
demogra_no = cd2puma.get(key)

if demogra_no is None:
return [0, 0, 0, 0]

index = ((recorddate - datetime(2015, 1, 1)).days * 24 + hour) * 55 + pumalist.index(demogra_no)
return cmap.to_color(riskLevel.ix[index, '0.0'], 5, 'lin')

绘制函数,考虑到区域内部用了红色,边界用暖色调会和谐一点,这里选用镉黄色,rgb(255, 153, 18)(颜色表参考):

1
2
3
4
5
6
7
def draw_riskmap(filename):
geoplotlib.set_window_size(800, 600)
geoplotlib.geojson('data/Community_Districts.geojson', fill=True, color=get_color)
geoplotlib.geojson('data/Community_Districts.geojson', color=[255, 153, 18, 100])
geoplotlib.set_smoothing(True)
geoplotlib.set_bbox(BoundingBox)
geoplotlib.savefig('imgs/'+ filename)

geoplotlib库还不支持添加图例和文字说明,这里迂回了一下,派生了一个TextLayer类,重写了draw()方法,使用ui_manager在图右上角添加时间信息。

1
2
3
4
5
6
class TextLayer(BaseLayer):

def draw(self, proj, mouse_x, mouse_y, ui_manager):
datestr = recorddate.strftime('%Y-%m-%d ')
hourstr = str(hour) + ":00"
ui_manager.info(datestr + hourstr)

main()中绘制从2015年12月1日0点至2015年12月2日23点,共48h的风险图。

1
2
3
4
5
6
7
dates = [datetime(2015, 12, 1), datetime(2015, 12, 2)]

for recorddate in dates:
for hour in range(24):
filename = str((recorddate - dates[0]).days * 24 + hour)
geoplotlib.add_layer(TextLayer())
draw_riskmap(filename)

制作动图

将上述获得的48张图片导入PS中,在时间轴中添加帧动画制作GIF。结果如下:

geoplotlib使用体验

在CartoDB Positron提供的背景地图支持下,geoplotlib绘制的图显得精致了不少(当然不能和Echarts这种大杀器相提并论),不过文档和示例还有所欠缺,很多API仅仅靠reference没办法搞清楚用法,只能通过查看源码实现自行领会,或者查看github issue来拾点牙慧。

参考资料

User Guide https://github.com/andrea-cuttone/geoplotlib/wiki/User-Guide

Andrea Cuttone,Sune Lehmann,Jakob Eg Larsen Geoplotlib: a Python Toolbox for Visualizing Geographical Data https://arxiv.org/abs/1608.01933

Kindle 订阅RSS

发表于 2018-06-04 | 分类于 电子设备
字数统计: 430 | 阅读时长 ≈ 1

前几天去配运动眼镜竟然查出了散光,说穿了还是自己作的,明知道睡前躺着水手机伤眼睛,却还是乐此不疲。以前也强迫过自己不把手机带上床,然而收效甚微。那就换个思路吧,既然改变不了睡前看文章的习惯,那就改变文章的载体。相对来说,kindle墨水屏对视力友好了许多。

TIPS: 推荐自备梯子

Reabble 是 Kindle 上的 RSS 新闻阅读器,专为使用电子墨水屏的浏览器设计交互界面,媲美系统原生阅读体验。它使用一款非常优秀的 RSS 阅读器 Inoreader.com 来提供订阅管理。 要使用 Reabble,你首先需要有一个 Inoreader 帐号(点此注册),并在里面添加一些订阅,需要指出的是,国内访问Inoreader不太稳定。

Reabble支持两种阅读方式, 在线阅读和离线阅读。

1. 在线阅读

打开 Kindle 主屏右上角的菜单,选择「体验版网页浏览器」并打开网址 reabble.com,使用 Inoreader 帐号密码登录。

2. 离线阅读

登录 Reabble.com ,打开 Reabble 左下角菜单,选择「推送设置」, 设置完成后,你会在每天指定的时间自动收到文章(接收文件时 Kindle 必须连网)。

Reabble 需要你指定哪些订阅源是自动推送的。在 Inoreader 中选中要推送的单一订阅源, 然后点击工具栏上的「订阅源设置」,再点击「指定到新文件夹」,然后输入「Kindle」。 系统会自动推送所有添加到 Kindle 文件夹中的订阅文章。

参考资料:http://reabble.com/help

Win10 1803更新导致l2tp失效

发表于 2018-06-03 | 分类于 故障排除
字数统计: 393 | 阅读时长 ≈ 1

Win10的强制自动更新一直是个比较头疼的问题,前半个月为了跑代码就把更新时间设在了五月底,本以为交完论文后就可以高枕无忧了,结果头儿的要求比较高,以学校要求托底的愿望破灭,无奈之下只能继续加内容呗,but…坑爹的事情来了,服务器连不上了!!!准确的说,我的服务器需要通过VPN连接,但是VPN拨号一直失败。因为我所有的工作都在服务器端完成,本地基本没有原始数据和代码,这样就抓瞎了TT。

Google了一圈后,发现大多数方法讲的都是重启,重设VPN, 或者修改注册表,前两个试过了没卵用,第三个本着不熟悉的条目不乱改的原则没有尝试,但从底下评论来看,效果也是堪忧。

按照我对微软尿性的理解,这八成又是新更新惹的祸,所以利用win10自带的版本回退功能退回了1709,重新尝试连接之后,果然没有NG。


【填坑时间 2018.10.12】

方法:修改了注册表,向其中添加了一项。

1
2
3
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\PolicyAgent 

"AssumeUDPEncapsulationContextOnSendRule"=dword:0x00000002

参数的解释:https://support.microsoft.com/en-us/help/926179/how-to-configure-an-l2tp-ipsec-server-behind-a-nat-t-device-in-windows

这里还有一个疑问:我挂的VPN连的是校内网的服务器,应该不涉及NAT转换,但修改操作是有效的,不知何解?

Hello, Hexo

发表于 2018-05-30 | 分类于 网站建设
字数统计: 851 | 阅读时长 ≈ 3

使用Hexo + Github搭建个人网站, 是非常简单的一件事。

                                                                                             ——我说的

感谢 Z皓的博客,我是跟着链接中的博文搭建现在的网站的,这篇博文中不会展示其中具体的每一步,仅仅对其中用到的重要的命令做一个总结,想看详细过程的同学可以直接移步链接中的博文。

其实从大三开始我就萌生了建立个站的想法,一方面是为了装逼,另一方面也是为了在这个世界上留下点什么,但是因为课业、比赛等种种原因一直搁置,这一拖就拖到了毕业……写完毕业论文后终于有一小段空闲时间,就把这个已经尘封的计划重新捡起来吧。

第一步:安装Node.js和Git, 在Github中建立个站的repo

第二步:安装Hexo, 推荐新建一个blog文件夹

1
$ npm install hexo -g

检查Hexo是否安装成功

1
$ hexo -v

初始化该文件夹(成功的话可以看到 “Start blogging with Hexo”)

1
$ hexo init

安装所需的组件

1
$ npm install

第三步:体验Hexo

首次体验

1
$ hexo g

开启服务器,访问本地服务器

1
$ hexo s

如果端口被占用了

1
$ hexo server -p <port>

第四步:将Hexo与Github page连接起来

这里省略了设置Git的user name 和 email, 以及ssh key的配置过程。

配置Deployment, 找到网站根目录下的_config.yml文件, 修改repo信息

第五步:撰写博客

新建一篇博文

1
$ hexo new post <blog-name>

在生成以及部署文章之前,需要安装一个扩展

1
$ npm install hexo-deployer-git --save

使用编辑器编好文章,那么就可以生成及部署了

1
$ hexo d -g

部署成功后访问你的地址:http://用户名.github.io。那么将看到生成的文章

到此,基本的搭建过程已经全部结束了,如果想更改博客的样式主题请参考进阶教程。

图片插入问题解决方法

使用Markdown语法插入图片时,首页的显示是正常的,但是点击文章链接查看单篇时,所有的图片均无法正常显示。观察url可知,在首页时,url为:https://hostname/, 而转到单篇文章时url变成了:https://hostname/year/month/date/post-name, Markdown语法显然是失效的。

注意:以下方法仅针对hexo3及以上版本

找到_config.yml配置文件post_asset_folder项,设置为true。

此时创建新博文后在source/_post文件夹下会出现一个post-name.md文件和/post-name文件夹,将博文需要的图片都存放于此。

在文章中需要插入图片的地方输入:

1
{% asset_img <filename> 图片的说明 %}

文章加密

安装加密模块: https://github.com/D0n9X1n/hexo-blog-encrypt

1
$ npm install --save hexo-blog-encrypt

快速使用:

将password字段添加至文章头

1
2
3
4
title: Hello World
date: 2020-03-13 21:12:21
password: muyiio
---
12
Fannngxun

Fannngxun

以无法为有法,以无限为有限

20 日志
11 分类
17 标签
邮箱 知乎
© 2021 Fannngxun | Site words total count: 31.8k
由 Hexo 强力驱动
人次 次
0%