2018年5月

只是希腊字母中的两个字母。
但在投资的过程中,
阿尔法(α)和贝塔(β),
代表的却是投资中的策略和收益

什么是阿尔法策略和贝塔策略?
  阿尔法策略
  传统的基本面分析策略,偏重选股,依靠精选行业和个股来超越大盘,这主要依赖于管理者的能力和素质。

  贝塔策略
  被动跟踪指数的策略,偏重择时,依靠准确地把握市场大势,准确择时来获得超越大盘的收益。

经常听到的阿尔法收益和贝塔收益又是什么呢?
  在了解这个问题之前,我们先说一说基金收益的“成员”。
  基金收益,通常由基金策略和大盘上涨带来的收益以及残留收益三部分组成,其中,残留收益是随机变量,平均值为0,可忽略;
  基金策略带来的收益,即投资收益中超出市场收益的部分,称为阿尔法收益;
  大盘上涨带来的收益,即市场收益,是由市场平均收益率乘以一个贝塔系数组成,称为贝塔收益。

举个例子
  初中物理告诉我们,当一个人在行驶中的火车上行走的时候,他的速度等于他对于火车的相对速度加上火车自身行驶的速度。同样的道理,在做基金投资时,我们认为基金的收益等于它的相对收益加上整个市场的涨跌所带来的收益。
  但区别在于,火车速度对于在同一辆火车上的每个人而言都是相同的,而整个市场的涨跌对每只基金提供的收益率却可能不同。这个不同,用数值来区分,这就是贝塔系数,它说明了这只基金和市场的相关性,或者说敏感度大小。
  在这个例子中,火车行驶的速度相当于贝塔收益;每个人自身行走的速度相当于阿尔法收益。

另外,市场上还流行着另一种说法——“阿尔法很贵,贝塔很便宜”。
  之所以这样说,是因为阿尔法收益代表的是基金的策略可以至少部分“战胜”市场,所以这样的投资收益具有可持续性;相反,贝塔收益是承担市场的风险所换来的,一旦市场出现新的变化,其收益将不一定能够得到复制,甚至会出现亏损。
  所以在资本市场,阿尔法收益和贝塔收益的价值是不同的。简单来说,贝塔收益易取,而投资中的阿尔法收益,则相当珍贵。因为获得阿尔法收益,靠的是投资人的真本事,而贝塔只是随大势。
  不仅如此,阿尔法收益甚至还可以作为评价主动管理类基金经理能力的重要指标之一。因为阿尔法收益是由基金经理选股,即通过运用阿尔法策略所带来的收益,考验着基金经理的真正价值。

那么,具体到择基的过程中,投资者该如何选择呢?
  对于投资者来讲,在选择基金的过程中,如果倾向贝塔收益,则可关注单纯的指数基金;如果更多倾向阿尔法收益,则可关注取得更多超额收益的基金。

  1. Hash函数介绍
    Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

消息是任意有限长度,哈希值是固定长度。

Hash的概念起源于1956年,Dumey用它来解决symbol table question(符号表问题)。使得数据表的插入、删除、查询操作可以在平均常数时间完成。
3300429-d6e4b67721df224d.png

  1. Hash函数的特点
    单向性(抗原像):对干任意给定的消息,计算其哈希值容易。但是,对于给定的哈希值h,要找到M使得H(M)=h在计算上是不可行的。

3300429-42d56aea605aa51a.png
抗弱碰撞(抗二次原像):对于给定的消息M1,要发现另一个消息M2,满足H( M1 )=H(M2)在计算上是不可行的。

抗强碰撞:找任意一对不同的消息M1,M2 ,使H(M1)=H(M2 )在计算上是不可行的。

3300429-01234c49ba6ad260.png

  1. SHA-1哈希算法介绍
    SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数。正式名称为 SHA 的家族第一个成员发布于 1993年。然而人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。

最初载明的算法于1993年发布,称做安全散列标准 (Secure Hash Standard),FIPS PUB 180。这个版本常被称为 "SHA-0"。它在发布之后很快就被NSA撤回,并且以 1995年发布的修订版本 FIPS PUB 180-1 (通常称为 "SHA-1") 取代。根据 NSA的说法,它修正了一个在原始算法中会降低密码安全性的错误。然而 NSA 并没有提供任何进一步的解释或证明该错误已被修正。1998年,在一次对 SHA-0 的攻击中发现这次攻击并不能适用于 SHA-1 — 我们不知道这是否就是NSA 所发现的错误,但这或许暗示我们这次修正已经提升了安全性。SHA-1已经被公众密码社群做了非常严密的检验而还没发现到有不安全的地方,它在一段时间被认为是安全的,直到Google宣布攻破SHA-1。

SHA-0 和 SHA-1 会从一个最大 264 位元的讯息中产生一串 160 位元的摘要,然后以设计 MD4 及 MD5 讯息摘要算法的 MIT 教授Ronald L. Rivest类似的原理为基础来加密。

  1. SHA-1算法介绍
    3300429-a64f25ae985a6365.png

3300429-7074db2cf8810f86.png
3300429-eb3b4961f3ab49e6.png

  1. SHA-1算法步骤
    填充消息:

假设输入消息M,首先应该填充消息,保证输入SHA-1计算的整个消息长度是512bits的倍数。
假设消息的长度为1bits,在原始消息M尾部增加1个比特位"1"和k个"0"比特位,l和k满足l + 1 + k ≡ 512 - 64(mod 512),并且为最小负整数。
然后再在填充消息的末尾添加64-bit的块,该64-bit块是原始消息比特位长度变换为二进制块,如果消息长度变换为二进制块的位个数小于64,则在左边补0,使得块的长度刚好等于64bits。
3300429-1534ff45f8ce7783.png
被填充消息分组:
把填充后的整个消息按照512-bit块进行划分,假若刚好划分为N个512-bit块,依次为:M(0),M(1),···,M(N)。而每个512-bit块又可由16个32-bit字组成,第i个512-bit块的第一个32-bit字,记为M0(i),M1(i),···,M15(i)
3300429-75e89fbdaa2a343e.png
初始化变量:
SHA-1的初值变量IV为160bits的数据块,即5个32-bit的字,依次为H0(0),H1(0),H2(0),H3(0),H4(0),初值变量设置为:
H0(0) = 67452301,
H1(0) = EFCDAB89,
H2(0) = 98BADCFE,
H3(0) = 10325476,
H4(0) = C3D2E1F0
3300429-e64e7eed33467653.png
3300429-15fe34f9b4cc5896.png
3300429-9b4ba2577cd51ba5.png
数据扩展:
分块处理中还需要使用W[t],t=0,1,···,79。W[t]是由输入512-bit分块通过混合和移动扩充而来。由输入的M(i)分组,分为16个32-bit字M0(i),M1(i),···,M15(i),然后将16个字扩充为80个32-bit字,扩充方法如下:
3300429-0afc4a8e9a0fb350.png
3300429-5c8efa5d5a296fe2.png
3300429-13028dbe6e367dd1.png

  1. 实验内容
    按照消息摘要函数SHA-1算法的标准FIPS-180-2的要求,从文件中读取消息,然后对消息分组,并对最后一个分组进行填充,并通过数据扩充算法扩充到80个字。

输入为ASCII码,程序的默认输入为FIPS-180-2中示例的“abc”。

输出填充后的最后一个分组中的W0, W1,W14 ,W15.然后数据扩充到80个字,然后输出W16, W79 (十六进制)。其中填充过程写成一个函数,数据扩充过程写成一个函数,数据扩充中循环移位也可以写成一个函数。

  1. 实现代码
    SHA-1的代码官方是有给出的,为了适配实验要求,这是经常修改后的代码,本人菜狗子一个,如果有错误或者不足之处,还望大佬指出。
#include <stdio.h>

include <string.h>

typedef struct SHA1Context
{

unsigned Message_Digest[5];

unsigned Length_Low;
unsigned Length_High;

unsigned char Message_Block[64];
int Message_Block_Index; 

int Computed;
int Corrupted;

} SHA1Context;

define SHA1CircularShift(bits,word) ((((word) << (bits)) & 0xFFFFFFFF) | ((word) >> (32-(bits))))

void SHA1Reset(SHA1Context *context)
{

context->Length_Low             = 0;
context->Length_High            = 0;
context->Message_Block_Index    = 0;

context->Message_Digest[0]      = 0x67452301;
context->Message_Digest[1]      = 0xEFCDAB89;
context->Message_Digest[2]      = 0x98BADCFE;
context->Message_Digest[3]      = 0x10325476;
context->Message_Digest[4]      = 0xC3D2E1F0;

context->Computed   = 0;
context->Corrupted  = 0;

}

void SHA1ProcessMessageBlock(SHA1Context *context)
{

const unsigned K[] =    
{
    0x5A827999,
    0x6ED9EBA1,
    0x8F1BBCDC,
    0xCA62C1D6
};
int         t;
unsigned    temp;
unsigned    W[80];
unsigned    A, B, C, D, E;
for(t = 0; t < 16; t++)
{
    W[t] = ((unsigned) context->Message_Block[t * 4]) << 24;
    W[t] |= ((unsigned) context->Message_Block[t * 4 + 1]) << 16;
    W[t] |= ((unsigned) context->Message_Block[t * 4 + 2]) << 8;
    W[t] |= ((unsigned) context->Message_Block[t * 4 + 3]);
}

for(t = 16; t < 80; t++)
{
   W[t] = SHA1CircularShift(1,W[t-3] ^ W[t-8] ^ W[t-14] ^ W[t-16]);
}

A = context->Message_Digest[0];
B = context->Message_Digest[1];
C = context->Message_Digest[2];
D = context->Message_Digest[3];
E = context->Message_Digest[4];

printf("W[0] = %08lx\n",W[0]);
printf("W[1] = %08lx\n",W[1]);
printf("W[14] = %08lx\n",W[14]);
printf("W[15] = %08lx\n",W[15]);
printf("W[16] = %08lx\n",W[16]);
printf("W[79] = %08lx\n",W[79]);

for(t = 0; t < 20; t++)
{
    temp =  SHA1CircularShift(5,A) + ((B & C) | ((~B) & D)) + E + W[t] + K[0];
    temp &= 0xFFFFFFFF;
    E = D;
    D = C;
    C = SHA1CircularShift(30,B);
    B = A;
    A = temp;
}

for(t = 20; t < 40; t++)
{
    temp = SHA1CircularShift(5,A) + (B ^ C ^ D) + E + W[t] + K[1];
    temp &= 0xFFFFFFFF;
    E = D;
    D = C;
    C = SHA1CircularShift(30,B);
    B = A;
    A = temp;
}

for(t = 40; t < 60; t++)
{
    temp = SHA1CircularShift(5,A) + ((B & C) | (B & D) | (C & D)) + E + W[t] + K[2];
    temp &= 0xFFFFFFFF;
    E = D;
    D = C;
    C = SHA1CircularShift(30,B);
    B = A;
    A = temp;
}

for(t = 60; t < 80; t++)
{
    temp = SHA1CircularShift(5, A) + (B ^ C ^ D) + E + W[t] + K[3];
    temp &= 0xFFFFFFFF;
    E = D;
    D = C;
    C = SHA1CircularShift(30,B);
    B = A;
    A = temp;
}

context->Message_Digest[0] = (context->Message_Digest[0] + A) & 0xFFFFFFFF;
context->Message_Digest[1] = (context->Message_Digest[1] + B) & 0xFFFFFFFF;
context->Message_Digest[2] = (context->Message_Digest[2] + C) & 0xFFFFFFFF;
context->Message_Digest[3] = (context->Message_Digest[3] + D) & 0xFFFFFFFF;
context->Message_Digest[4] = (context->Message_Digest[4] + E) & 0xFFFFFFFF;
context->Message_Block_Index = 0;

}

void SHA1PadMessage(SHA1Context *context)
{

if (context->Message_Block_Index > 55)
{
    context->Message_Block[context->Message_Block_Index++] = 0x80;
    while(context->Message_Block_Index < 64)
    {
        context->Message_Block[context->Message_Block_Index++] = 0;
    }

    SHA1ProcessMessageBlock(context);

    while(context->Message_Block_Index < 56)
    {
        context->Message_Block[context->Message_Block_Index++] = 0;
    }
}
else
{
    context->Message_Block[context->Message_Block_Index++] = 0x80;
    while(context->Message_Block_Index < 56)
    {
        context->Message_Block[context->Message_Block_Index++] = 0;
    }
}

context->Message_Block[56] = (context->Length_High >> 24) & 0xFF;
context->Message_Block[57] = (context->Length_High >> 16) & 0xFF;
context->Message_Block[58] = (context->Length_High >> 8) & 0xFF;
context->Message_Block[59] = (context->Length_High) & 0xFF;
context->Message_Block[60] = (context->Length_Low >> 24) & 0xFF;
context->Message_Block[61] = (context->Length_Low >> 16) & 0xFF;
context->Message_Block[62] = (context->Length_Low >> 8) & 0xFF;
context->Message_Block[63] = (context->Length_Low) & 0xFF;

SHA1ProcessMessageBlock(context);

}

int SHA1Result(SHA1Context *context)
{

if (context->Corrupted)
{
    return 0;
}

if (!context->Computed)
{
    SHA1PadMessage(context);
    context->Computed = 1;
}

return 1;

}

void SHA1Input(SHA1Context context, const unsigned char message_array, unsigned length)
{

if (!length)
{
    return;
}

if (context->Computed || context->Corrupted)
{
    context->Corrupted = 1;
    return;
}

while(length-- && !context->Corrupted)
{
    context->Message_Block[context->Message_Block_Index++] = (*message_array & 0xFF);
    context->Length_Low += 8;
    context->Length_Low &= 0xFFFFFFFF;
    if (context->Length_Low == 0)
    {
        context->Length_High++;
        context->Length_High &= 0xFFFFFFFF;
        if (context->Length_High == 0)
        {
            context->Corrupted = 1;
        }
    }

    if (context->Message_Block_Index == 64)
    {
        SHA1ProcessMessageBlock(context);
    }

    message_array++;
}

}

int main()
{

SHA1Context sha;
int i;
unsigned char input[64];

printf("ASCII string:");
scanf("%s", input);
printf("\n");

SHA1Reset(&sha);
SHA1Input(&sha, (const unsigned char *) input, strlen(input));

if (!SHA1Result(&sha))
{
    fprintf(stderr, "ERROR-- could not compute message digest\n");
}
else
{
    printf("\n\n\nThe resulting 160-bit message digest is:\n\n");
    for(i = 0; i < 5 ; i++)
    {
        printf("%x ", sha.Message_Digest[i]);
    }
    printf("\n\n");
}

return 0;

}

  1. 输出结果
    当输入小于64位时:

3300429-cf3ffe5924507453.png
3300429-24e3d5c5095f8f58.png
当输入大于64位时:
3300429-1946b7104d94b523.png
3300429-94bd04f88461a8ed.png

SHA1和MD5的算法说明
SHA1和MD5的算法都是从MD4算法改进而来的2种算法,基本思路都是将信息分成N个分组,每组64个字节,每个分组都进行摘要运算。当一个分组的摘要运算完毕后,将上一个分组的结果也用于下一个分组的运算。

信息的长度(注意是bit位长度,不是字节长度)用64位表示,也要参加信息摘要运算,而且是放在最后一个分组的末尾,所以长度信息要占据8个字节。

如果信息数据最后一个分组长度小于64个字节,在后面添加0x80标志结束,如果此时数据+结束标志已经<=56个字节,还可以放入长度数据,就在结束标志到第56个字节补0,然后放入长度,如果此时信息数据+结束标志已经大于56字节,那么这个分组后面补0,进行一次摘要运算,然后再建立一个分组,前面全部补0,最后16个字节放长度,再进行一次摘要。

需要注意的地方如下。

MD5最后生成的摘要信息是16个字节,SHA1是20个字节。

MD5和SHA1的分组信息运算,分组里面的的数据都会被视为16个DWORD,而MD5算法认为这些DWORD的字节序列是LITTLE-ENDIAN,而SHA1的算法认为DWORD是BIG-ENDIAN的。所以在不同字节序的主机上要进行转换。

放入最后一个分组的长度信息,是原始数据长度,而且是BIT位长度,其是一个uint64_t,而MD5算法要求放入的长度是LITTLE-ENDIAN的,而SHA1算法则要求这个长度是BIG-ENDIAN的。不同的平台要进行转换。

当然生成的结果,MD5也要求是LITTLE-ENDIAN,SHA1也要求结果是BIG-ENDIAN的,不同的平台还是要进行转换。

我们贴几个摘要处理过程的分组信息,帮助大家理解。如果要处理的数据是3个字节字符串”abc”,其在MD5的算法中,只需要一个分组参加,数据是16进制,如下:

61 62 63 80 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 18 00 00 00 00 00 00 00

而SHA1算法中,也只有一个分组,如下,大家注意长度位置上的差别。十六进制的18标识24个bit3个字节。

61 62 63 80 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18

如果要处理的数据是80个字节的"12345678901234567890123456789012345678901234567890123456789012345678901234567890",其在MD5的算法会被分成2个分组,

第一个分组如下,

31 32 33 34 35 36 37 38 39 30 31 32 33 34 35 36

37 38 39 30 31 32 33 34 35 36 37 38 39 30 31 32

33 34 35 36 37 38 39 30 31 32 33 34 35 36 37 38

39 30 31 32 33 34 35 36 37 38 39 30 31 32 33 34

第二个分组如下

35 36 37 38 39 30 31 32 33 34 35 36 37 38 39 30

80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 00 00 80 02 00 00 00 00 00 00

  1. 首先装好 Ubuntu 64bit,推荐 Ubuntu 14 LTS x64
  2. 命令行输入 sudo apt-get update ,然后输入
  3. apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev
  4. git clone https://github.com/coolsnowwolf/lede 命令下载好源代码,然后 cd lede 进入目录
  5. ./scripts/feeds update -a
    ./scripts/feeds install -a

make menuconfig

  1. 最后选好你要的路由,输入 make -j1 V=s (-j1 后面是线程数。第一次编译推荐用单线程,国内请尽量全局科学上网)即可开始编译你要的固件了。

TargetSystem (x86) ---> (*) x86
Subtarget选中x86_64

配目标文件系统为 EXT4
Target Images --->
ext4
取消选中ext4之外的其他镜像格式。

Seconds to wait before booting the default entry
改为0,每次启动时等待0秒。

用web界面要加 luci,
LuCI-->Collection选中luci。这个是通过网页访问软路由所必须的组建,建议选中;否则就只能使用虚拟化串口或ssh访问软路由了。

LuCI->Applications中选中
luci-app-ddns
luci-app-qos
luci-app-statistics
luci-app-upnp
luci-app-vnstat
luci-app-shadowsocks-libev

这是几个常见应用,根据个人喜好随便选。

Base system
取消选中dnsmasq
选中dnsmasq-full
因为dnsmasq-full支持ipset功能,对于基于域名的xx很有用。

Network->File Transfer中选中
curl
wget
顺手选中两个下载工具。

Network->IP Addresses and Names中选中
bind-dig
ddns-scripts_No-IP_com。(用来支持no-ip.com的ddns服务)
一个是测试工具;
另一个是某个ddns支持,还有其他ddns支持,也可以酌情选中。

Network->Routing and Rediction中选中
ip-full
这个很关键。

Network中选中
iperf3
ipset
一个是测试工具;
另一个是ipset,用于支持基于域名的xx。

Network->Web Servers/Proxies选中那些SS,如果您需要使用SS的话。

Utilities->Editors中选中
nano
也可以选中vim,无所谓,反正都是文本编辑器,选个顺手的就好。

Utilities->Shells中选中
bash
如果您喜欢自己写脚本,可以选中bash,比默认的ash强大一些。

点击Save,保存为.config。
一路Exit退出。

在命令行输入make开始编译。

0x00 案例
系统默认是没有 chacha20 加密方式的,需要手动编译 libsodium 1.0.8 及以上版本。

0x01 解决方案

  1. 安装依赖
    Debian 7/8、Ubuntu 14/15/16 及其衍生系列:

sudo apt-get update
sudo apt-get install build-essential wget -y
Centos 6/7、RHEL 7 及其衍生系列:

yum groupinstall "Development Tools" -y
yum install wget -y

  1. 下载 libsodium 最新版本
    — 可以从libsodium 官网下,也可以从github 下载。选择速度最快的下载方式。

<1> 从官网下载:

wget https://download.libsodium.org/libsodium/releases/LATEST.tar.gz

<2> 从 github 下载(其中 1.0.10 是 libusodium 的版本号,可以改成最新的):

wget https://github.com/jedisct1/libsodium/releases/download/1.0.10/libsodium-1.0.10.tar.gz

<3>. 解压
<1>官网下载的:

tar xzvf LATEST.tar.gz

<2>github 下载的:

tar xzvf libsodium-1.0.10.tar.gz

<4>. 生成配置文件
cd libsodium*

./configure

<5>. 编译并安装
make -j8 && make install

<6>. 添加运行库位置并加载运行库:
echo /usr/local/lib > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig

获取SSR客户端
git clone https://github.com/ssrbackup/shadowsocksr

配置文件
克隆下来的文件夹应该在home目录下,进入~/shadowsocksr,编辑config.json文件:

cd ~/shadowsocksr
sudo vim config.json
编辑以下几项:

"server":"0.0.0.0" //服务器ip
"server_port":8388, //端口
"password":"password", //密码
"protocol":"origin", //协议插件
"obfs":"http_simple", //混淆插件
"method":"aes-256-cfb", //加密方式
运行shadowsocksr
进入~/shadowsocksr/shadowsocks/,执行:

python local.py -c ../config.json
出现以下信息,说明运行成功:

IPv6 support
2018-01-03 10:33:31 INFO util.py:85 loading libcrypto from libcrypto.so.1.0.0
2018-01-03 10:33:31 INFO local.py:50 local start with protocol[auth_sha1_v4] password [dongtaiwang.com] method [aes-256-cfb] obfs [plain] obfs_param []
2018-01-03 10:33:31 INFO local.py:54 starting local at 127.0.0.1:1080
2018-01-03 10:33:31 INFO asyncdns.py:324 dns server: [('127.0.0.1', 53)]

一:损失厌恶症

  ——对交易行为来说,会影响一个人使用机械性交易系统的能力,因为使用交易系统的投资者对于损失的感受要强于对于潜在盈利的感受。交易员或者投资者因为因为遵守交易系统法则而赔钱。执行交易系统因而损失一万美金的痛苦,要远远大于而放弃使用交易系统而错过一个潜在两万美金的盈利。绝大多数投资者患有损失厌恶症。

  二:沉淀成本效应

  ——沉淀成本商业中指已经发生的无法收回的成本。

  例如投资者做一笔交易,初步设定潜在的盈利空间是2000美金,潜在的损失控制是1000美金,结果市场很快下跌导致其帐户损失了500美金,几天后上涨到1000美金,如果理性的执行交易规则,应该立即退场,结果沉淀成本效应使其考虑的不是市场下一步怎样走,而是如何避免这1000美金真的打水漂。止损割肉退出,对他而言这会让损失变成现实,这对有损失厌恶症的投资者而言不很难接收的,因此他期待市场反弹,幻想失而复得。

  沉淀成本效应,实际也是在前面我们谈到的一个根本问题是,投资者可能选择要不损失2000美金甚至更多,或者一点不损失,从而放弃确定的损失1000美金。这在以前的测试中提到过,与之相对应的就是,确定选择盈利1000美金,而放弃盈利2000美金甚至更多也可能不盈利甚至亏损。

  三:处置效应(不愿意丢掉盈利机会的倾向)

  ——是交易员以及投资者喜欢获得确定的收益,而保留亏损的交易。即在证券市场,股民喜欢卖掉价格上涨的股票获得确定收益,却保留价格正在下跌的股票,在期货市场同样如此,处置效应,跟我们谈到的:截止你的亏损、滚动你的利润的交易原则正好相反,处置效应是任亏损不断放大,期待亏损转为盈利或打平出场,而卖掉获得利润的头寸。

  四:结果偏好

  ——一个投资者倾向于一个决策的最终结果而不是本身的质量来判断这个决策的好坏。结果偏好,实际上指出,正确的交易有可能亏钱,而错误的交易也有可能赚钱。关键的问题是投资者大部分喜欢好的结果,而忽视甚至忽略决策质量。比如,根据系统交易,最终执行止损而亏损,不根据系统交易,却相反获得了利润。结果偏好,其反面可能会因为执行交易系统产生的亏损,甚至连续亏损,最终使投资者怀疑自己怀疑交易决策的程序。

  投资生涯的初期,一个老师就讲过:市场有四种钱的问题,该赚的钱一定要赚钱,该亏的钱一定要亏,不该赚的钱不能赚,而不能亏的钱坚决不能亏。因为错误的交易,可能会形成一次甚至几次多次不该赚的钱却赚到的问题。

  五:近期偏好

  近期偏好是投资者更重视近期的数据和经验,近期的交易比以前交易重要,因此近期一连串不成功的交易会导致投资者怀疑他们的方法和决策程序。

  六:瞄定效应

  瞄定效应是指人们在做出一个涉及不确定的决策时,过于依赖那些容易获得的信息,比如盯住近期的一个价位,根据当前价格与这个参考价格的关系来做出决策。

  举例:这个瞄定效应其实也常常发生一种惯性思维错误,比如价格持续上涨到一定程度之后形成拐点,价格开始下跌,趋势有转势迹象,投资者却很难做出抛空举措,原因前面的价格影响,高价位没有能够做空,却在目前价位做空,很难接收的一种瞄定效应,因为投资者瞄定了前面的高价。

  七:潮流效应

  投资者往往因为其他人相信某件事就随波逐流地相信这件事,这被成为潮流效应或羊群效应。价格之所以在泡沫行将破裂时仍疯涨不止,部分可能就是因为潮流效应所造成。

  比如2008年春节之后的豆油期货,在突破10000元之后,随着场外资金的不断涌入,价格冲破12000,甚至冲到15000的位置,潮流效应将价格的泡沫越堆越大。

  八:信奉小数法则

  被小数法则迷惑的投资者相信,一个小样本可以近似准确的反映总体状况,比如一个交易系统6次测试中4次成功,大多数人都说这是个好系统,信奉小数法则的会导致投资者过早的建立信心,或者过早的失去信心。加上对近期偏好与结果偏好的影响,交易者往往在一个系统刚刚开始发挥作用时就将它抛弃。