python操作kafka报错:return '<SimpleProducer batch=%s>' % self.async

使用的Anaconda的python3.7版本,发现使用kafka的库连接时报错,错误信息如下:
 
C:\ProgramData\Anaconda3\python.exe C:/git/base_function/kafka_usage.py
Traceback (most recent call last):
File "C:/git/base_function/kafka_usage.py", line 6, in <module>
from kafka import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\__init__.py", line 23, in <module>
from kafka.producer import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\__init__.py", line 4, in <module>
from .simple import SimpleProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\simple.py", line 54
return '<SimpleProducer batch=%s>' % self.async
^
SyntaxError: invalid syntax

因为py3.7里面async已经变成了关键字。所以导致了不兼容。
 
解决办法:
使用最新的kafka版本,但是pyPI上的kafka还没有被替换成最新的,可以使用下面的方法升级kafka python
pip install kafka-python
 
然后问题就解决了。
继续阅读 »
使用的Anaconda的python3.7版本,发现使用kafka的库连接时报错,错误信息如下:
 
C:\ProgramData\Anaconda3\python.exe C:/git/base_function/kafka_usage.py
Traceback (most recent call last):
File "C:/git/base_function/kafka_usage.py", line 6, in <module>
from kafka import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\__init__.py", line 23, in <module>
from kafka.producer import KafkaProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\__init__.py", line 4, in <module>
from .simple import SimpleProducer
File "C:\ProgramData\Anaconda3\lib\site-packages\kafka\producer\simple.py", line 54
return '<SimpleProducer batch=%s>' % self.async
^
SyntaxError: invalid syntax

因为py3.7里面async已经变成了关键字。所以导致了不兼容。
 
解决办法:
使用最新的kafka版本,但是pyPI上的kafka还没有被替换成最新的,可以使用下面的方法升级kafka python
pip install kafka-python
 
然后问题就解决了。 收起阅读 »

【可转债数据】发行速度趋势

随着年后股市一波流,每天涨涨涨,发行可转债的数量也越来越多。
用pyecharts做了一张趋势图,可以显然易见地窥探目前可转债的发行速度。

可转债个数趋势.png

 
实现代码也很简单:
(核心部分)
line=Line()
line.add('可转债个数趋势',b,v,mark_line=["average"], mark_point=["max", "min"])

2018年初的时候只有36只可转债,到了今天(2019-04-08),已经有138只,扩容了4倍有多。
 
不过个人认为随着股市深入回调(具体什么时候我也不知道,小散就不要预测指数跳大神了),发行速度会因为面临破发再次减缓。
 
上图中曲线较为较为平滑的部分就是股市回调阶段,可转债上市就大面积破发。
目前以较大的斜率保持上升,而且目前上市价格都是20%以上。离破发还很远。
但是不能掉以轻心,一旦行情断崖式暴跌,高价转债会面临动辄超过10个点的跌幅。
所以现阶段还是要远离高价转债。当然艺高人胆大者或者套利纯熟者就无视吧,每个人都有自己模式内的操作方法
 
上述数据小编会每周更新一次。
继续阅读 »
随着年后股市一波流,每天涨涨涨,发行可转债的数量也越来越多。
用pyecharts做了一张趋势图,可以显然易见地窥探目前可转债的发行速度。

可转债个数趋势.png

 
实现代码也很简单:
(核心部分)
line=Line()
line.add('可转债个数趋势',b,v,mark_line=["average"], mark_point=["max", "min"])

2018年初的时候只有36只可转债,到了今天(2019-04-08),已经有138只,扩容了4倍有多。
 
不过个人认为随着股市深入回调(具体什么时候我也不知道,小散就不要预测指数跳大神了),发行速度会因为面临破发再次减缓。
 
上图中曲线较为较为平滑的部分就是股市回调阶段,可转债上市就大面积破发。
目前以较大的斜率保持上升,而且目前上市价格都是20%以上。离破发还很远。
但是不能掉以轻心,一旦行情断崖式暴跌,高价转债会面临动辄超过10个点的跌幅。
所以现阶段还是要远离高价转债。当然艺高人胆大者或者套利纯熟者就无视吧,每个人都有自己模式内的操作方法
 
上述数据小编会每周更新一次。 收起阅读 »

numpy datetime转为date,pandas的日期类型转为python的daetime

dataframe的数据格式是这样子的:

d1.PNG

 
info看一下里面的数据类型:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 307 entries, 0 to 306
Data columns (total 7 columns):
日期 307 non-null datetime64[ns]
指数 307 non-null float64
成交额(亿元) 307 non-null float64
涨跌 307 non-null float64
涨跌额 307 non-null float64
转债数目 307 non-null float64
剩余规模 307 non-null float64
dtypes: datetime64[ns](1), float64(6)
memory usage: 16.9 KB

日期 307 non-null datetime64[ns]
 
然后转为list看看:
a=list(df['日期'].values)
如果使用上面的方法,返回的是这样的数据:
[numpy.datetime64('2017-12-29T00:00:00.000000000'),
numpy.datetime64('2018-01-02T00:00:00.000000000'),
numpy.datetime64('2018-01-03T00:00:00.000000000'),
numpy.datetime64('2018-01-04T00:00:00.000000000'),
numpy.datetime64('2018-01-05T00:00:00.000000000'),
numpy.datetime64('2018-01-08T00:00:00.000000000'),
numpy.datetime64('2018-01-09T00:00:00.000000000'),
numpy.datetime64('2018-01-10T00:00:00.000000000'),
numpy.datetime64('2018-01-11T00:00:00.000000000'),
numpy.datetime64('2018-01-12T00:00:00.000000000'),
numpy.datetime64('2018-01-15T00:00:00.000000000'),
numpy.datetime64('2018-01-16T00:00:00.000000000'),
numpy.datetime64('2018-01-17T00:00:00.000000000'),

 
如何转化为python的daetime格式呢?
 
可以使用内置的:s.dt.to_pydatetime()
s为df的一列,也就是series数据格式
b=list(df['日期'].dt.to_pydatetime())
得到的是
[datetime.datetime(2017, 12, 29, 0, 0),
datetime.datetime(2018, 1, 2, 0, 0),
datetime.datetime(2018, 1, 3, 0, 0),
datetime.datetime(2018, 1, 4, 0, 0),
datetime.datetime(2018, 1, 5, 0, 0),
datetime.datetime(2018, 1, 8, 0, 0),
datetime.datetime(2018, 1, 9, 0, 0),
datetime.datetime(2018, 1, 10, 0, 0),
datetime.datetime(2018, 1, 11, 0, 0),
datetime.datetime(2018, 1, 12, 0, 0),
datetime.datetime(2018, 1, 15, 0, 0)

为了不想要小时,分钟,秒的数据,可以清洗一下:
b=[i.strftime('%Y-%m-%d') for i in b]
 
得到:
['2017-12-29',
'2018-01-02',
'2018-01-03',
'2018-01-04',
'2018-01-05',
'2018-01-08',
'2018-01-09',
'2018-01-10',
'2018-01-11',
'2018-01-12',
'2018-01-15',
'2018-01-16',
'2018-01-17',]
 
 
继续阅读 »
dataframe的数据格式是这样子的:

d1.PNG

 
info看一下里面的数据类型:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 307 entries, 0 to 306
Data columns (total 7 columns):
日期 307 non-null datetime64[ns]
指数 307 non-null float64
成交额(亿元) 307 non-null float64
涨跌 307 non-null float64
涨跌额 307 non-null float64
转债数目 307 non-null float64
剩余规模 307 non-null float64
dtypes: datetime64[ns](1), float64(6)
memory usage: 16.9 KB

日期 307 non-null datetime64[ns]
 
然后转为list看看:
a=list(df['日期'].values)
如果使用上面的方法,返回的是这样的数据:
[numpy.datetime64('2017-12-29T00:00:00.000000000'),
numpy.datetime64('2018-01-02T00:00:00.000000000'),
numpy.datetime64('2018-01-03T00:00:00.000000000'),
numpy.datetime64('2018-01-04T00:00:00.000000000'),
numpy.datetime64('2018-01-05T00:00:00.000000000'),
numpy.datetime64('2018-01-08T00:00:00.000000000'),
numpy.datetime64('2018-01-09T00:00:00.000000000'),
numpy.datetime64('2018-01-10T00:00:00.000000000'),
numpy.datetime64('2018-01-11T00:00:00.000000000'),
numpy.datetime64('2018-01-12T00:00:00.000000000'),
numpy.datetime64('2018-01-15T00:00:00.000000000'),
numpy.datetime64('2018-01-16T00:00:00.000000000'),
numpy.datetime64('2018-01-17T00:00:00.000000000'),

 
如何转化为python的daetime格式呢?
 
可以使用内置的:s.dt.to_pydatetime()
s为df的一列,也就是series数据格式
b=list(df['日期'].dt.to_pydatetime())
得到的是
[datetime.datetime(2017, 12, 29, 0, 0),
datetime.datetime(2018, 1, 2, 0, 0),
datetime.datetime(2018, 1, 3, 0, 0),
datetime.datetime(2018, 1, 4, 0, 0),
datetime.datetime(2018, 1, 5, 0, 0),
datetime.datetime(2018, 1, 8, 0, 0),
datetime.datetime(2018, 1, 9, 0, 0),
datetime.datetime(2018, 1, 10, 0, 0),
datetime.datetime(2018, 1, 11, 0, 0),
datetime.datetime(2018, 1, 12, 0, 0),
datetime.datetime(2018, 1, 15, 0, 0)

为了不想要小时,分钟,秒的数据,可以清洗一下:
b=[i.strftime('%Y-%m-%d') for i in b]
 
得到:
['2017-12-29',
'2018-01-02',
'2018-01-03',
'2018-01-04',
'2018-01-05',
'2018-01-08',
'2018-01-09',
'2018-01-10',
'2018-01-11',
'2018-01-12',
'2018-01-15',
'2018-01-16',
'2018-01-17',]
 
  收起阅读 »

python datetime模块:timestamp转为本地时间(东八区)

一般timestamp时间戳格式为10位,如果是13位,则需要除以1000,

1554369904000
为例,计算这个数字的本地时间。
 
如果使用
t=1554369904000
datetime.datetime.fromtimestamp(t/1000)
 
得到的是:
(2019, 4, 4, 17, 25, 4)
 
然而这个时间并不是我想要的,和我想要的时间差了8个时区。
 
那么可以使用
datetime.datetime.utcfromtimestamp(t/1000)
这个返回的就是我想要的时间了
(2019, 4, 4, 9, 25, 4)
 
 
引用:
timestamp转换为datetime
要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t))
2015-04-19 12:20:00
注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。

本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:

2015-04-19 12:20:00
实际上就是UTC+8:00时区的时间:

2015-04-19 12:20:00 UTC+8:00
而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:

2015-04-19 04:20:00 UTC+0:00
timestamp也可以直接被转换到UTC标准时区的时间:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2015-04-19 04:20:00

 
 
继续阅读 »
一般timestamp时间戳格式为10位,如果是13位,则需要除以1000,

1554369904000
为例,计算这个数字的本地时间。
 
如果使用
t=1554369904000
datetime.datetime.fromtimestamp(t/1000)
 
得到的是:
(2019, 4, 4, 17, 25, 4)
 
然而这个时间并不是我想要的,和我想要的时间差了8个时区。
 
那么可以使用
datetime.datetime.utcfromtimestamp(t/1000)
这个返回的就是我想要的时间了
(2019, 4, 4, 9, 25, 4)
 
 
引用:
timestamp转换为datetime
要把timestamp转换为datetime,使用datetime提供的fromtimestamp()方法:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t))
2015-04-19 12:20:00
注意到timestamp是一个浮点数,它没有时区的概念,而datetime是有时区的。上述转换是在timestamp和本地时间做转换。

本地时间是指当前操作系统设定的时区。例如北京时区是东8区,则本地时间:

2015-04-19 12:20:00
实际上就是UTC+8:00时区的时间:

2015-04-19 12:20:00 UTC+8:00
而此刻的格林威治标准时间与北京时间差了8小时,也就是UTC+0:00时区的时间应该是:

2015-04-19 04:20:00 UTC+0:00
timestamp也可以直接被转换到UTC标准时区的时间:

>>> from datetime import datetime
>>> t = 1429417200.0
>>> print(datetime.fromtimestamp(t)) # 本地时间
2015-04-19 12:20:00
>>> print(datetime.utcfromtimestamp(t)) # UTC时间
2015-04-19 04:20:00

 
  收起阅读 »

【python】pymongo find_one_and_update的用法

原生的mongo语句是这样的:
db.collection.findOneAndUpdate(
<filter>,
<update>,
{
projection: <document>,
sort: <document>,
maxTimeMS: <number>,
upsert: <boolean>,
returnNewDocument: <boolean>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)

转换成python pymongo是这样的:
>>> db.example.find_one_and_update(
... {'_id': 'userid'},
... {'$inc': {'seq': 1}},
... projection={'seq': True, '_id': False},
... return_document=ReturnDocument.AFTER)

上面的语句的意思是:
找到_id 为userid的值得文档,然后把该文档中的seq的值+1,然后返回seq的数据,不显示_id列
最后返回的数据是这样的:

{'seq': 2}
 
注意
findOneAndUpdate
是获取mongo文档中第一条满足条件的数据并做修改。该函数是线程安全的。意思就是在多个线程中操作,不会对同一条数据进行获取修改。
也就是该操作是原子操作。
 
ReturnDocument 引用的库
 
class pymongo.collection.ReturnDocument
 
在开头 from pymongo.collection import ReturnDocument
 
原创文章
转载请注明出处:
http://30daydo.com/article/445
继续阅读 »
原生的mongo语句是这样的:
db.collection.findOneAndUpdate(
<filter>,
<update>,
{
projection: <document>,
sort: <document>,
maxTimeMS: <number>,
upsert: <boolean>,
returnNewDocument: <boolean>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ]
}
)

转换成python pymongo是这样的:
>>> db.example.find_one_and_update(
... {'_id': 'userid'},
... {'$inc': {'seq': 1}},
... projection={'seq': True, '_id': False},
... return_document=ReturnDocument.AFTER)

上面的语句的意思是:
找到_id 为userid的值得文档,然后把该文档中的seq的值+1,然后返回seq的数据,不显示_id列
最后返回的数据是这样的:

{'seq': 2}
 
注意
findOneAndUpdate
是获取mongo文档中第一条满足条件的数据并做修改。该函数是线程安全的。意思就是在多个线程中操作,不会对同一条数据进行获取修改。
也就是该操作是原子操作。
 
ReturnDocument 引用的库
 
class pymongo.collection.ReturnDocument
 
在开头 from pymongo.collection import ReturnDocument
 
原创文章
转载请注明出处:
http://30daydo.com/article/445 收起阅读 »

scrapy-redis使用redis集群进行分布式爬取

正常情况单机的redis可以满足scrapy-redis进行分布式爬取,可是如果单机的redis的内存过小,很容易导致系统内存不够,读取数据缓慢,如果使用docker运行redis,更加可能导致redis的容器的进程被杀掉。(笔者就曾经经常遇到这种情况,机器内存才8GB,上面跑了N个docker容器,一旦内存吃紧,某个容器就被kill掉,导致爬虫经常出问题)。
 
使用redis集群可以增加redis集体内存,防止出现上面的情况。
 
scrapy redis-cluster很简单,只需要按照以下步骤:
 
1. 按照库
pip install scrapy-redis-cluster
 
2. 修改settings文件
 
# Redis集群地址
REDIS_MASTER_NODES = [
{"host": "192.168.10.233", "port": "30001"},
{"host": "192.168.10.234", "port": "30002"},
{"host": "192.168.10.235", "port": "30003"},
]

# 使用的哈希函数数,默认为6
BLOOMFILTER_HASH_NUMBER = 6

# Bloomfilter使用的Redis内存位,30表示2 ^ 30 = 128MB,默认为22 (1MB 可去重130W URL)
BLOOMFILTER_BIT = 22

# 不清空redis队列
SCHEDULER_PERSIST = True
# 调度队列
SCHEDULER = "scrapy_redis_cluster.scheduler.Scheduler"
# 去重
DUPEFILTER_CLASS = "scrapy_redis_cluster.dupefilter.RFPDupeFilter"
# queue
SCHEDULER_QUEUE_CLASS = 'scrapy_redis_cluster.queue.PriorityQueue'

然后就可以运行啦。
继续阅读 »
正常情况单机的redis可以满足scrapy-redis进行分布式爬取,可是如果单机的redis的内存过小,很容易导致系统内存不够,读取数据缓慢,如果使用docker运行redis,更加可能导致redis的容器的进程被杀掉。(笔者就曾经经常遇到这种情况,机器内存才8GB,上面跑了N个docker容器,一旦内存吃紧,某个容器就被kill掉,导致爬虫经常出问题)。
 
使用redis集群可以增加redis集体内存,防止出现上面的情况。
 
scrapy redis-cluster很简单,只需要按照以下步骤:
 
1. 按照库
pip install scrapy-redis-cluster
 
2. 修改settings文件
 
# Redis集群地址
REDIS_MASTER_NODES = [
{"host": "192.168.10.233", "port": "30001"},
{"host": "192.168.10.234", "port": "30002"},
{"host": "192.168.10.235", "port": "30003"},
]

# 使用的哈希函数数,默认为6
BLOOMFILTER_HASH_NUMBER = 6

# Bloomfilter使用的Redis内存位,30表示2 ^ 30 = 128MB,默认为22 (1MB 可去重130W URL)
BLOOMFILTER_BIT = 22

# 不清空redis队列
SCHEDULER_PERSIST = True
# 调度队列
SCHEDULER = "scrapy_redis_cluster.scheduler.Scheduler"
# 去重
DUPEFILTER_CLASS = "scrapy_redis_cluster.dupefilter.RFPDupeFilter"
# queue
SCHEDULER_QUEUE_CLASS = 'scrapy_redis_cluster.queue.PriorityQueue'

然后就可以运行啦。 收起阅读 »

【Dataframe warning】Try using .loc[row_indexer,col_indexer] = value instead

使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1

如果想把A列中大于5的数换成100,如何操作 ?
 
      A  B  C  D  E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1


df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
 
继续阅读 »
使用dataframe直接赋值操作时
 
df['当前日期'] = datetime.date.today()
 
会出现下面的警告信息
Try using .loc[row_indexer,col_indexer] = value instead 
 
虽然得到的最终结果是正常的,可是为什么会出现上面的警告呢?
 
因为上面的操作如果稍微复杂点,那么就可能导致赋值失败。 因为中间会产生一个切片的临时副本。
 
比如:
df
A B C D E
0 5 0 3 3 7
1 9 3 5 2 4
2 7 6 8 8 1

如果想把A列中大于5的数换成100,如何操作 ?
 
      A  B  C  D  E
0 5 0 3 3 7
1 1000 3 5 2 4
2 1000 6 8 8 1


df[df.A > 5]['A'] = 1000
 
上面的这个表达式是不会生效的。
 
要生效,需要写成以下:
df.loc[df.A > 5, 'A'] = 1000
 
为什么呢?
因为df[df.A]得到是一个临时切片结果,等于一个中间变量,然后在这个中间变量上的A列上做赋值操作,但是最原始的df却没有被改变。
或者你可以这样写
df=df[df.A>5]
df.A=1000
 
 
  收起阅读 »

指数基金的诞生 源于公司内部矛盾


望京博格|文

似乎所有伟大事物都诞生都源于逆境!

古代诗词歌赋大多都是诗人身处逆境有感而发;指数基金的诞生也源于一场公司内部斗争。
如果你理解了指数基金是如何诞生的,则你对应指数基金的理解也将更为深刻,接着开始约翰博格与指数基金的故事:

(一)饮鸩止渴
先锋集团的前身是1920年沃尔特摩根建立的惠灵顿基金。最初的美国基金公司创始人都经历过美国1929-1931年的大萧条,在大萧条期间美国道琼斯指数的最大跌幅为90%。在此之后,大多数基金公司采取的都是相对保守的平衡型策略:一半国债一半蓝筹。
在20世纪60年代中期,基金行业不再墨守陈规于传统的投资风格。 这被称为”沸腾时代“,其间很多年前的基金经理开始追逐各种投机股票,后来很多成熟基金经理也开始效仿追逐各种投机股票。这些股票走势如火如荼,但是通常没有基本面的支撑。投资者与基金行业不再关心什么投资”蓝筹股“的基金或者风格保守的平衡型基金,取而代之的是各种追逐“妖股”且净值高涨的基金。

1965-1974年,期间美国市场流行”漂亮50“,以施乐(Xerox),宝丽来(Polaroid),IBM,雅芳(Avon )为代表成长股飙涨。导致投资者开始追逐业绩飙涨的股票型基金,传统的平衡型基金被投资者抛弃。
在1955年平衡型基金市场份额为55%,到1965年的17%,降至1970年的5%,到1975年,这个比例更是将下降到仅剩1%。惠灵顿基金的旗舰基金都是平衡型基金,在这个样环境中度日如年。在这个关键时刻,老摩根将公司的管理权交给年轻的约翰博格。
规模是基金公司的生命之血。对于年轻的博格而言,扭转公司颓势的唯一方法是合并一家以成长股投资见长基金公司。在拜访几家备选基金公司并被拒绝之后,博格决定收购位于波士顿由四个年轻人的合伙公司[Thorndike,Doran,Paine&Lewis,Inc],以及他们旗下Ivest基金。
在合并公司的新中,四个新合伙人各拥有10%合计40%投票权,博格还是担任CEO拥有28%的投票权,公开发行的那部分拥有剩余32%的投票权,之后惠灵顿发行自己的成长股基金。

(二)替罪羔羊
历经十年的”漂亮50“行情,由于这些看似漂亮的成长股公司的业绩并没有跟上股价的上升,随着而来的业绩增速下滑导致”漂亮50“行情的破灭,在1973-1974年标普500指数下跌了50%以上。
与此同时,惠灵顿的新商业模式开始失败。博格新合伙人管理的四个新基金中的三个基金濒临清盘。从高到低,Ivest基金的规模缩水65%,好在后来它都清盘,否则会被列入金融历史的最差基金名录上。(附言:原来清盘是一条遮羞布)
新伙伴管理的另外两个股票型基金同样业绩不如人意,导致基金最后失败。更糟糕的是,在新管理层其咄咄逼人的形势下,曾经保守的惠灵顿基金管理的资产也大幅缩水。 在1966年至1976年的十年间,惠灵顿的平衡型基金称为在全美国业绩最差的平衡型基金(源于股票仓位持有漂亮50股票,在熊市跌的最惨)。
随着1973-1974年熊市的到来,博格与新伙伴自1966年以来的愉快合作也面临着分崩离析。糟糕的市场和糟糕的基金业绩意味着糟糕的业务,摧毁了惠灵顿并购的新伙伴与博格之间的任何信任。新的波士顿合作伙伴很快找到了替罪羊。当然不是他们自己,尽管他们管理的股票型基金业绩如此糟糕。 他们选择博格,合并之后惠灵顿首席执行官,作为替罪羊为惠灵顿基金持有人亏损以及公司股东的亏损负责。 由于合并初期新公司投票权改变,在熊市中期,1974年1月23日,他们联合起来解雇了CEO-约翰博格。

(三)对决开始
约翰博格是一个不会轻易服输的人。 在美国,基金还有独立的董事会(在国内称为持有人大会,由于海外基金大多数是公司型基金,所以基金常设的董事会)。惠灵顿基金的董事会与惠灵顿基金管理公司董事会成员构成有很大重合,但是由于基金汇集客户资产,所有在基金董事会中独立董事拥有很强的话语权。
博格被免除惠灵顿基金管理公司的董事长与CEO职位,但他还是惠灵顿基金的董事长与CEO,所以他要召开惠灵顿基金的董事会议,罢免惠灵顿基金管理公司作为其投资顾问的权力,也就是公募基金更换基金管理人。这件事在美国基金行业从未发生,即便到现在也仅在惠灵顿基金发生过,当然在国内基金行业20年也没有发生过。
由于独立董事的支持,博格与惠灵顿基金管理公司达成折衷方案:

(1)惠灵顿基金(后改名为先锋基金)成立新的子公司负责基金的运营工作,包括基金会计、TA登记、客户服务等;
(2)惠灵顿基金的投资管理与基金发行还由惠灵顿基金管理公司负责。
这里面第二点很重要,如果先锋发行新的基金,投资管理还是有惠灵顿基金公司负责。
(四)指数基金诞生
约翰博格与惠灵顿基金管理公司新的CEO之间仇恨已经无法化解。在1975年约翰博格打算发行一只新基金,但是又不想受到折衷方案影响(方案规定基金投资管理必须由惠灵顿基金管理公司负责)。
约翰博格必须想出摆脱”折衷方案影响“方法,在这个时候他想到指数基金,并得到(1970年获得诺贝尔经济学奖的)保罗萨缪尔森的支持。由于指数基金是一个“不需要管理的”基金,这样就无需惠灵顿基金管理公司插足先锋基金的新的业务。
1976年8月成立的第一个“市场指数”共同基金,最初名为“第一指数投资信托”(First Index Investment Trust)。指数化是终极的“不激进不保守”投资策略,充分保证了参与金融市场的涨跌。
其实第一个指数基金并不顺利,成立规模仅1200万美元(募集目标是5亿美元),而且之后经历83个月的净赎回……当时基金行业巨头们都在猜测这个指数基金什么时候会夭折,第二个指数基金在第一个指数基金成立约十年之后才出现。

(五)指数基金壮大
在先锋集团创立之前,美国基金销售如同国内现状一样,几乎所有的基金销售都以赚取销售提成为生。在那个时代,基金的认购/申购费为5%,即投资者买100美元基金,仅有95美元归入基金资产,其余5美元作为基金销售的奖励。
虽然博格的指数起初发展并不顺利,但是他也没有闲着。在1975年纽约交易所受到各方压力,结束了固定佣金指数,美国市场开始走向低佣金时代。
在这个时候约翰博格推出“免佣”基金,即销售先锋集团的基金,先锋集团不支付基金销售任何费用。这一举措在当时的同行看来似乎是“大逆不道”,先锋一边推出免佣基金,一边进一步降低基金费率,导致在之后四五年中,先锋靠降低费率导致其基金业绩大幅跑赢同业,导致投资者开始追捧先锋集团旗下产品。
其他基金同业(例如富达)被逼推出“免佣”基金,销售基金再也没有销售提成了,导致当时80%的基金销售人员失业! 但是投资者还需要专业人员帮助构建投资组合,在这个时候投资顾问(FA)诞生了。
投资顾问,帮助客户构建资产配置组合并收取咨询费,基金公司也不再支付销售提成。对于投资顾问而言,提高客户业绩最有效的方式,就是通过低成本的指数基金构建资产配置组合。
先锋集团的产品受到投资顾问偏爱,而先锋特殊的结构决定了随着其管理规模进一步增长,其基金费率则进一步降低,导致投资顾问更加偏爱先锋集团的产品,以至与进入相互促进的螺旋增长的模式,截至2018年底,先锋集团的管理规模已经突破5万亿美元,必须在强调一次:第一指数基金的成立规模仅0.12亿美元!(完)
参考文献:
(1)《约翰博格与先锋集团传记》
(2)《Stay The Course》
继续阅读 »

望京博格|文

似乎所有伟大事物都诞生都源于逆境!

古代诗词歌赋大多都是诗人身处逆境有感而发;指数基金的诞生也源于一场公司内部斗争。
如果你理解了指数基金是如何诞生的,则你对应指数基金的理解也将更为深刻,接着开始约翰博格与指数基金的故事:

(一)饮鸩止渴
先锋集团的前身是1920年沃尔特摩根建立的惠灵顿基金。最初的美国基金公司创始人都经历过美国1929-1931年的大萧条,在大萧条期间美国道琼斯指数的最大跌幅为90%。在此之后,大多数基金公司采取的都是相对保守的平衡型策略:一半国债一半蓝筹。
在20世纪60年代中期,基金行业不再墨守陈规于传统的投资风格。 这被称为”沸腾时代“,其间很多年前的基金经理开始追逐各种投机股票,后来很多成熟基金经理也开始效仿追逐各种投机股票。这些股票走势如火如荼,但是通常没有基本面的支撑。投资者与基金行业不再关心什么投资”蓝筹股“的基金或者风格保守的平衡型基金,取而代之的是各种追逐“妖股”且净值高涨的基金。

1965-1974年,期间美国市场流行”漂亮50“,以施乐(Xerox),宝丽来(Polaroid),IBM,雅芳(Avon )为代表成长股飙涨。导致投资者开始追逐业绩飙涨的股票型基金,传统的平衡型基金被投资者抛弃。
在1955年平衡型基金市场份额为55%,到1965年的17%,降至1970年的5%,到1975年,这个比例更是将下降到仅剩1%。惠灵顿基金的旗舰基金都是平衡型基金,在这个样环境中度日如年。在这个关键时刻,老摩根将公司的管理权交给年轻的约翰博格。
规模是基金公司的生命之血。对于年轻的博格而言,扭转公司颓势的唯一方法是合并一家以成长股投资见长基金公司。在拜访几家备选基金公司并被拒绝之后,博格决定收购位于波士顿由四个年轻人的合伙公司[Thorndike,Doran,Paine&Lewis,Inc],以及他们旗下Ivest基金。
在合并公司的新中,四个新合伙人各拥有10%合计40%投票权,博格还是担任CEO拥有28%的投票权,公开发行的那部分拥有剩余32%的投票权,之后惠灵顿发行自己的成长股基金。

(二)替罪羔羊
历经十年的”漂亮50“行情,由于这些看似漂亮的成长股公司的业绩并没有跟上股价的上升,随着而来的业绩增速下滑导致”漂亮50“行情的破灭,在1973-1974年标普500指数下跌了50%以上。
与此同时,惠灵顿的新商业模式开始失败。博格新合伙人管理的四个新基金中的三个基金濒临清盘。从高到低,Ivest基金的规模缩水65%,好在后来它都清盘,否则会被列入金融历史的最差基金名录上。(附言:原来清盘是一条遮羞布)
新伙伴管理的另外两个股票型基金同样业绩不如人意,导致基金最后失败。更糟糕的是,在新管理层其咄咄逼人的形势下,曾经保守的惠灵顿基金管理的资产也大幅缩水。 在1966年至1976年的十年间,惠灵顿的平衡型基金称为在全美国业绩最差的平衡型基金(源于股票仓位持有漂亮50股票,在熊市跌的最惨)。
随着1973-1974年熊市的到来,博格与新伙伴自1966年以来的愉快合作也面临着分崩离析。糟糕的市场和糟糕的基金业绩意味着糟糕的业务,摧毁了惠灵顿并购的新伙伴与博格之间的任何信任。新的波士顿合作伙伴很快找到了替罪羊。当然不是他们自己,尽管他们管理的股票型基金业绩如此糟糕。 他们选择博格,合并之后惠灵顿首席执行官,作为替罪羊为惠灵顿基金持有人亏损以及公司股东的亏损负责。 由于合并初期新公司投票权改变,在熊市中期,1974年1月23日,他们联合起来解雇了CEO-约翰博格。

(三)对决开始
约翰博格是一个不会轻易服输的人。 在美国,基金还有独立的董事会(在国内称为持有人大会,由于海外基金大多数是公司型基金,所以基金常设的董事会)。惠灵顿基金的董事会与惠灵顿基金管理公司董事会成员构成有很大重合,但是由于基金汇集客户资产,所有在基金董事会中独立董事拥有很强的话语权。
博格被免除惠灵顿基金管理公司的董事长与CEO职位,但他还是惠灵顿基金的董事长与CEO,所以他要召开惠灵顿基金的董事会议,罢免惠灵顿基金管理公司作为其投资顾问的权力,也就是公募基金更换基金管理人。这件事在美国基金行业从未发生,即便到现在也仅在惠灵顿基金发生过,当然在国内基金行业20年也没有发生过。
由于独立董事的支持,博格与惠灵顿基金管理公司达成折衷方案:

(1)惠灵顿基金(后改名为先锋基金)成立新的子公司负责基金的运营工作,包括基金会计、TA登记、客户服务等;
(2)惠灵顿基金的投资管理与基金发行还由惠灵顿基金管理公司负责。
这里面第二点很重要,如果先锋发行新的基金,投资管理还是有惠灵顿基金公司负责。
(四)指数基金诞生
约翰博格与惠灵顿基金管理公司新的CEO之间仇恨已经无法化解。在1975年约翰博格打算发行一只新基金,但是又不想受到折衷方案影响(方案规定基金投资管理必须由惠灵顿基金管理公司负责)。
约翰博格必须想出摆脱”折衷方案影响“方法,在这个时候他想到指数基金,并得到(1970年获得诺贝尔经济学奖的)保罗萨缪尔森的支持。由于指数基金是一个“不需要管理的”基金,这样就无需惠灵顿基金管理公司插足先锋基金的新的业务。
1976年8月成立的第一个“市场指数”共同基金,最初名为“第一指数投资信托”(First Index Investment Trust)。指数化是终极的“不激进不保守”投资策略,充分保证了参与金融市场的涨跌。
其实第一个指数基金并不顺利,成立规模仅1200万美元(募集目标是5亿美元),而且之后经历83个月的净赎回……当时基金行业巨头们都在猜测这个指数基金什么时候会夭折,第二个指数基金在第一个指数基金成立约十年之后才出现。

(五)指数基金壮大
在先锋集团创立之前,美国基金销售如同国内现状一样,几乎所有的基金销售都以赚取销售提成为生。在那个时代,基金的认购/申购费为5%,即投资者买100美元基金,仅有95美元归入基金资产,其余5美元作为基金销售的奖励。
虽然博格的指数起初发展并不顺利,但是他也没有闲着。在1975年纽约交易所受到各方压力,结束了固定佣金指数,美国市场开始走向低佣金时代。
在这个时候约翰博格推出“免佣”基金,即销售先锋集团的基金,先锋集团不支付基金销售任何费用。这一举措在当时的同行看来似乎是“大逆不道”,先锋一边推出免佣基金,一边进一步降低基金费率,导致在之后四五年中,先锋靠降低费率导致其基金业绩大幅跑赢同业,导致投资者开始追捧先锋集团旗下产品。
其他基金同业(例如富达)被逼推出“免佣”基金,销售基金再也没有销售提成了,导致当时80%的基金销售人员失业! 但是投资者还需要专业人员帮助构建投资组合,在这个时候投资顾问(FA)诞生了。
投资顾问,帮助客户构建资产配置组合并收取咨询费,基金公司也不再支付销售提成。对于投资顾问而言,提高客户业绩最有效的方式,就是通过低成本的指数基金构建资产配置组合。
先锋集团的产品受到投资顾问偏爱,而先锋特殊的结构决定了随着其管理规模进一步增长,其基金费率则进一步降低,导致投资顾问更加偏爱先锋集团的产品,以至与进入相互促进的螺旋增长的模式,截至2018年底,先锋集团的管理规模已经突破5万亿美元,必须在强调一次:第一指数基金的成立规模仅0.12亿美元!(完)
参考文献:
(1)《约翰博格与先锋集团传记》
(2)《Stay The Course》
收起阅读 »

python析构函数的执行顺序

在python里面,由于有自动回收内存的机制,所以析构函数的用处要比C++弱得多。 
 
下面看代码:
 
class Foobar(object):

def __init__(self):
print('class start')

def __del__(self):
print('class end')

def main()
obj = Foobar()
print('where is del?')
print('main end')

main()

上面的代码输出结果是什么呢? 卖个关子,自己执行看看吧。
继续阅读 »
在python里面,由于有自动回收内存的机制,所以析构函数的用处要比C++弱得多。 
 
下面看代码:
 
class Foobar(object):

def __init__(self):
print('class start')

def __del__(self):
print('class end')

def main()
obj = Foobar()
print('where is del?')
print('main end')

main()

上面的代码输出结果是什么呢? 卖个关子,自己执行看看吧。 收起阅读 »

【手把手教你】量价关系分析与Python实现

如果操作过量,即使对市场判断正确,仍会一败涂地。——索罗斯

引言

成交量是股票市场的温度计,许多股票的疯狂上涨并非基本面发生了实质性的变化,而是短期筹码和资金供求关系造成的。量价关系分析法是一种将价格走势与成交量变化相结合的研究方法,正所谓,大军未动,粮草先行。成交量一直被看为是股票市场的“粮草”,成交量的变化是股价变化的前兆。因此,成交量是分析判断市场行情,并作出投资决策时的重要依据,也是各种技术分析指标应用时不可或缺的参照。

本文延续“手把手教你使用Python的TA-Lib”系列,着重介绍交易量指标(Volume Indicators)及其运用。【手把手教你】股市技术分析利器之TA-Lib(一)主要探讨了重叠指标的相关原理与Python实现,【手把手教你】股市技术分析利器之TA-Lib(二)则着重介绍了TA-Lib中强大的数学运算、数学变换、统计函数、价格变换、周期指标和波动率指标函数及其应用实例。TA-Lib的安装使用可查看以前推文。

                        


01
A/D Line 累积派发线


Chaikin Accumulation/Distribution Line (AD),是Marc Chaikin提出的用来平衡交易量的指标,以当日收盘价、最高价和最低价来估算一段时间内该股票累积的资金流量, 用来确定潜在的趋势以及预测趋势反转。


函数名:AD

调用格式:ta.AD(high,low,close,volume)

计算方法: AD=前日AD值+(多空对比*成交量)

多空对比=((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价);注意:当最高价等于最低价时,多空对比 = (收盘价 / 昨收盘) - 1

运用要点:

AD测量资金流向,AD向上表明多方占优势,反之表明空方占优势;

AD与价格的背离可视为买卖信号:底背离考虑买入,顶背离考虑卖出;

AD指标无需设置参数,但在应用时,可结合均线、MACD、KDJ等指标进行分析;

AD指标忽略了缺口的影响,有时无法真实反映价格与成交量的关系。


02
A/D Oscillator 震荡指标


震荡指标是计算长短周期的AD差,将资金流动情况与价格行为相对比,用来研判市场中资金流入和流出的情况。


函数名:ADOSC

调用格式:ta. ADOSC(high,low,close,volume,

              fastperiod=3,slowperiod=10)

计算方法:fastperiod AD - slowperiod AD,AD的计算同上。

运用要点:

交易信号是背离:看涨背离做多,看跌背离做空;

股价与90天移动平均结合,与其他指标结合;

由正变负卖出,由负变正买进。

03
OBV - 能量潮


全称为 On Balance Volume, 由 Joe Granville 提出,通过统计成交量变动的趋势推测股价趋势。


函数名:OBV

调用格式:ta.OBV(close, volume)

计算公式:以某日为基期,逐日累计每日股票总成交量,若隔日指数或股票上涨,则基期OBV加上本日成交量为本日OBV。隔日指数或股票下跌, 则基期OBV减去本日成交量为本日OBV。

研判:

以“N”字型为波动单位,一浪高于一浪称“上升潮”,下跌称“跌潮”;

上升潮买进,跌潮卖出;

须配合K线图、股价走势和其他指标。


04
应用实例代码


#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False


#引入TA-Lib库
import talib as ta


#获取交易数据函数,这里使用tushare的老接口,比较方便
import tushare as ts
def get_data(code,start='2018-11-01',end='2019-03-26'):
    df=ts.get_k_data(code,start,end)
    df.index=pd.to_datetime(df.date)
    df=df.sort_index()
    return df[['open','close','high','low','volume']]


#获取当前交易是所有股票代码和名字
basics=ts.get_stock_basics()
print(len(basics))
#basics.head()


3602


index={'上证综指': 'sh','深证成指': 'sz','沪深300': 'hs300',
               '创业板指': 'cyb', '上证50': 'sz50','中小板指': 'zxb'}


#将当前交易的股票和常用指数代码和名称写入字典,方便调用
stock=dict(zip(basics.name,basics.index))
stocks=dict(stock,**index)



计算交易量指标并可视化

#使用matplotlib画k线图以及
import matplotlib.patches as patches
def plot_line(name):   
    code=stocks[name]
    data=get_data(code)
    fig = plt.figure(figsize=(12,5))
    ax1 = fig.add_axes([0, 1, 1, 1])               
    ax1.set_title(name+"K线图与交易量指标",  fontsize=15)
    ax1.set_xlim(-1, len(data)+1)

    for i in range(len(data)):
        close_price,open_price = data.iloc[i, 1], data.iloc[i, 0]
        high_price, low_price = data.iloc[i,2], data.iloc[i, 3]
        trade_date = data.index[i]
        if close_price > open_price:#画阳线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, fill=False, color='r'))
            ax1.plot([i, i], [low_price, open_price], 'r')
            ax1.plot([i, i], [close_price, high_price], 'r')
        else:#画阴线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, color='g'))
            ax1.plot([i, i], [low_price, high_price], color='g')
    ax1.set_title("Price", fontsize=15, loc='left', color='r')
    #设置x轴标签
    ax1.set_xticks(range(0,len(data),5))#位置
    ax1.set_xticklabels([(data.index[i]).strftime('%Y-%m-%d') for i in ax1.get_xticks()] , rotation=20)
    high, low, close, volume = np.array(data['high']),np.array(data['low']),np.array(data['close']),np.array(data['volume'])
    #计算AD线
    AD = ta.AD(high, low, close, volume)       
    #计算ADOSC线
    ADOSC = ta.ADOSC(high,low, close, volume, fastperiod=3, slowperiod=10)      
    #计算OBC线
    OBV = ta.OBV(close, volume)                                                        

    ax2 = ax1.twinx() 
    ax2.plot(AD, color='r', linewidth=2, label='AD')
    ax2.plot(ADOSC, color='b', linewidth=2, label='ADOSC')
    ax2.plot(OBV, color='y', linewidth=2, label='OBV')
    ax2.legend(loc=0)
plot_line('东方通信')plot_line('上证综指')plot_line('创业板指')plot_line('中国平安')最后,在万矿上使用AD线进行了历史回测,作为演示例子,这里只对东方通信和中国平安股票进行了回测,期间为2018年1月1日至2019年3月25日。从AD线单一指标回测来看,在市场反弹或形成向上趋势时跑赢市场,但是最大回撤也比较大,如东方通信达到43.2%,当然这与回测期间和标的选择有很大的关系。这里只是作为演示例子,深入研究还得待结合其他指标。


东方通信AD线回测结果:


中国平安AD线回测结果:

结语

价量分析系统属于技术分析,而技术分析是股票分析的温度计。温度计无法预测未来的准确温度,更不可能决定温度。因此,技术分析只是告诉你发生了什么,但不能预测未来会发生什么。不要过于依赖技术指标提供的信号,市场总是充满突发性的事件,交易者情绪波动较大,因此股价并不是总是沿着规律运行。在使用量价关系时,不仅要分析量价关系中量的变化对价的影响,还应该分析量变化的原因,更应该知道这些变化之后交易者的情绪或行为,只有这样才能真正体会量价关系的精髓,提高自己预判的准确率。
继续阅读 »
如果操作过量,即使对市场判断正确,仍会一败涂地。——索罗斯

引言

成交量是股票市场的温度计,许多股票的疯狂上涨并非基本面发生了实质性的变化,而是短期筹码和资金供求关系造成的。量价关系分析法是一种将价格走势与成交量变化相结合的研究方法,正所谓,大军未动,粮草先行。成交量一直被看为是股票市场的“粮草”,成交量的变化是股价变化的前兆。因此,成交量是分析判断市场行情,并作出投资决策时的重要依据,也是各种技术分析指标应用时不可或缺的参照。

本文延续“手把手教你使用Python的TA-Lib”系列,着重介绍交易量指标(Volume Indicators)及其运用。【手把手教你】股市技术分析利器之TA-Lib(一)主要探讨了重叠指标的相关原理与Python实现,【手把手教你】股市技术分析利器之TA-Lib(二)则着重介绍了TA-Lib中强大的数学运算、数学变换、统计函数、价格变换、周期指标和波动率指标函数及其应用实例。TA-Lib的安装使用可查看以前推文。

                        


01
A/D Line 累积派发线


Chaikin Accumulation/Distribution Line (AD),是Marc Chaikin提出的用来平衡交易量的指标,以当日收盘价、最高价和最低价来估算一段时间内该股票累积的资金流量, 用来确定潜在的趋势以及预测趋势反转。


函数名:AD

调用格式:ta.AD(high,low,close,volume)

计算方法: AD=前日AD值+(多空对比*成交量)

多空对比=((收盘价-最低价)-(最高价-收盘价))/(最高价-最低价);注意:当最高价等于最低价时,多空对比 = (收盘价 / 昨收盘) - 1

运用要点:

AD测量资金流向,AD向上表明多方占优势,反之表明空方占优势;

AD与价格的背离可视为买卖信号:底背离考虑买入,顶背离考虑卖出;

AD指标无需设置参数,但在应用时,可结合均线、MACD、KDJ等指标进行分析;

AD指标忽略了缺口的影响,有时无法真实反映价格与成交量的关系。


02
A/D Oscillator 震荡指标


震荡指标是计算长短周期的AD差,将资金流动情况与价格行为相对比,用来研判市场中资金流入和流出的情况。


函数名:ADOSC

调用格式:ta. ADOSC(high,low,close,volume,

              fastperiod=3,slowperiod=10)

计算方法:fastperiod AD - slowperiod AD,AD的计算同上。

运用要点:

交易信号是背离:看涨背离做多,看跌背离做空;

股价与90天移动平均结合,与其他指标结合;

由正变负卖出,由负变正买进。

03
OBV - 能量潮


全称为 On Balance Volume, 由 Joe Granville 提出,通过统计成交量变动的趋势推测股价趋势。


函数名:OBV

调用格式:ta.OBV(close, volume)

计算公式:以某日为基期,逐日累计每日股票总成交量,若隔日指数或股票上涨,则基期OBV加上本日成交量为本日OBV。隔日指数或股票下跌, 则基期OBV减去本日成交量为本日OBV。

研判:

以“N”字型为波动单位,一浪高于一浪称“上升潮”,下跌称“跌潮”;

上升潮买进,跌潮卖出;

须配合K线图、股价走势和其他指标。


04
应用实例代码


#先引入后面可能用到的包(package)
import pandas as pd  
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline   

#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False


#引入TA-Lib库
import talib as ta


#获取交易数据函数,这里使用tushare的老接口,比较方便
import tushare as ts
def get_data(code,start='2018-11-01',end='2019-03-26'):
    df=ts.get_k_data(code,start,end)
    df.index=pd.to_datetime(df.date)
    df=df.sort_index()
    return df[['open','close','high','low','volume']]


#获取当前交易是所有股票代码和名字
basics=ts.get_stock_basics()
print(len(basics))
#basics.head()


3602


index={'上证综指': 'sh','深证成指': 'sz','沪深300': 'hs300',
               '创业板指': 'cyb', '上证50': 'sz50','中小板指': 'zxb'}


#将当前交易的股票和常用指数代码和名称写入字典,方便调用
stock=dict(zip(basics.name,basics.index))
stocks=dict(stock,**index)



计算交易量指标并可视化

#使用matplotlib画k线图以及
import matplotlib.patches as patches
def plot_line(name):   
    code=stocks[name]
    data=get_data(code)
    fig = plt.figure(figsize=(12,5))
    ax1 = fig.add_axes([0, 1, 1, 1])               
    ax1.set_title(name+"K线图与交易量指标",  fontsize=15)
    ax1.set_xlim(-1, len(data)+1)

    for i in range(len(data)):
        close_price,open_price = data.iloc[i, 1], data.iloc[i, 0]
        high_price, low_price = data.iloc[i,2], data.iloc[i, 3]
        trade_date = data.index[i]
        if close_price > open_price:#画阳线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, fill=False, color='r'))
            ax1.plot([i, i], [low_price, open_price], 'r')
            ax1.plot([i, i], [close_price, high_price], 'r')
        else:#画阴线
            ax1.add_patch(patches.Rectangle((i-0.2, open_price), 0.4, close_price-open_price, color='g'))
            ax1.plot([i, i], [low_price, high_price], color='g')
    ax1.set_title("Price", fontsize=15, loc='left', color='r')
    #设置x轴标签
    ax1.set_xticks(range(0,len(data),5))#位置
    ax1.set_xticklabels([(data.index[i]).strftime('%Y-%m-%d') for i in ax1.get_xticks()] , rotation=20)
    high, low, close, volume = np.array(data['high']),np.array(data['low']),np.array(data['close']),np.array(data['volume'])
    #计算AD线
    AD = ta.AD(high, low, close, volume)       
    #计算ADOSC线
    ADOSC = ta.ADOSC(high,low, close, volume, fastperiod=3, slowperiod=10)      
    #计算OBC线
    OBV = ta.OBV(close, volume)                                                        

    ax2 = ax1.twinx() 
    ax2.plot(AD, color='r', linewidth=2, label='AD')
    ax2.plot(ADOSC, color='b', linewidth=2, label='ADOSC')
    ax2.plot(OBV, color='y', linewidth=2, label='OBV')
    ax2.legend(loc=0)
plot_line('东方通信')plot_line('上证综指')plot_line('创业板指')plot_line('中国平安')最后,在万矿上使用AD线进行了历史回测,作为演示例子,这里只对东方通信和中国平安股票进行了回测,期间为2018年1月1日至2019年3月25日。从AD线单一指标回测来看,在市场反弹或形成向上趋势时跑赢市场,但是最大回撤也比较大,如东方通信达到43.2%,当然这与回测期间和标的选择有很大的关系。这里只是作为演示例子,深入研究还得待结合其他指标。


东方通信AD线回测结果:


中国平安AD线回测结果:

结语

价量分析系统属于技术分析,而技术分析是股票分析的温度计。温度计无法预测未来的准确温度,更不可能决定温度。因此,技术分析只是告诉你发生了什么,但不能预测未来会发生什么。不要过于依赖技术指标提供的信号,市场总是充满突发性的事件,交易者情绪波动较大,因此股价并不是总是沿着规律运行。在使用量价关系时,不仅要分析量价关系中量的变化对价的影响,还应该分析量变化的原因,更应该知道这些变化之后交易者的情绪或行为,只有这样才能真正体会量价关系的精髓,提高自己预判的准确率。 收起阅读 »

postman使用_analyze端点 ElasticSearch

POSTMAN
ES 6.x如何使用_analyze端点

因为使用curl编辑查询语句很不方便。平时用postman最多,故平时查询ES经常使用postman查询。
_analyze端点是用于查询分析器的分析效果。

文档中使用如下方法查询

curl -XPOST 'localhost:9200/_analyze?analyzer=standard' -d 'I love Bears and Fish.'
只是奇怪,为何post的内容 'I love Bears and Fish.'不需要字段名?
试验了几次后,发现在6.x上,该字段的字段名是text
所以请求body应该是这样的

postman1.PNG


可以使用get方法来使用_analyze端点
继续阅读 »
POSTMAN
ES 6.x如何使用_analyze端点

因为使用curl编辑查询语句很不方便。平时用postman最多,故平时查询ES经常使用postman查询。
_analyze端点是用于查询分析器的分析效果。

文档中使用如下方法查询

curl -XPOST 'localhost:9200/_analyze?analyzer=standard' -d 'I love Bears and Fish.'
只是奇怪,为何post的内容 'I love Bears and Fish.'不需要字段名?
试验了几次后,发现在6.x上,该字段的字段名是text
所以请求body应该是这样的

postman1.PNG


可以使用get方法来使用_analyze端点 收起阅读 »

可转债如何配债

由于还是有很多人不断问我如何配债的问题,这里以歌尔声学为例简单说明下。

1、如果你在登记日也就是12月11日收盘时还持有一定数量歌尔声学正股的话,那么你在配债日也就是12月12日就会看到账户里有相应数量的歌尔配债。注意这里的单位是张,如图,

1.jpg

 
由于我只有800股歌尔声学,因此获得了13张配债,1张对应100元,这时双击它,左侧出现了卖出菜单,价格和配债代码都自动填好了,输入13张或者点击全部,然后点“卖出”。(需要注意的是:有些券商这里是买入。)

2、不管是卖出还是买入,然后检查下委托情况和扣款情况,如下图:

2.jpg


3.jpg

 

可以看到我已经被扣款1300元,这样就算成功完成了这次的13张配债.
 
可转债低佣金开户,沪市转债费率百分之二,全市场最低。
有兴趣的朋友可以扫描开户:



 
继续阅读 »
由于还是有很多人不断问我如何配债的问题,这里以歌尔声学为例简单说明下。

1、如果你在登记日也就是12月11日收盘时还持有一定数量歌尔声学正股的话,那么你在配债日也就是12月12日就会看到账户里有相应数量的歌尔配债。注意这里的单位是张,如图,

1.jpg

 
由于我只有800股歌尔声学,因此获得了13张配债,1张对应100元,这时双击它,左侧出现了卖出菜单,价格和配债代码都自动填好了,输入13张或者点击全部,然后点“卖出”。(需要注意的是:有些券商这里是买入。)

2、不管是卖出还是买入,然后检查下委托情况和扣款情况,如下图:

2.jpg


3.jpg

 

可以看到我已经被扣款1300元,这样就算成功完成了这次的13张配债.
 
可转债低佣金开户,沪市转债费率百分之二,全市场最低。
有兴趣的朋友可以扫描开户:



  收起阅读 »

pycharm中格式化json字符

首先把json字符保存为json后缀,然后看看json字符串中是否用的双引号,注意,单引号不起作用,要把单引号替换成双引号,然后按快捷键ctrl+alt+L 就可以快速格式化json了。
 
效果如下
 

json.PNG

 
首先把json字符保存为json后缀,然后看看json字符串中是否用的双引号,注意,单引号不起作用,要把单引号替换成双引号,然后按快捷键ctrl+alt+L 就可以快速格式化json了。
 
效果如下
 

json.PNG

 

scrapy命令行执行传递多个参数给spider 动态传参

有时候在命令行执行scrapy,比如scrapy crawl spiderXXXX,如果我想要传递一个自定义的参数进去给scrapy,比如我想传递一个爬取的页码数目,我要每次爬取10页。
 
那么需要在spider中定义一个构造函数
 
    def __init__(self,page=None,*args, **kwargs):
super(Gaode,self).__init__(*args, **kwargs)
self.page=page


def start_requests(self):
XXXXXX 调用self.page 即可
yield Request(XXXX)

 
然后在启动scrapy的时候赋予参数的值:
 
scrapy crawl spider -a page=10
 
就可以动态传入参数
 
原创文章
转载请注明出处:http://30daydo.com/article/436
 
继续阅读 »
有时候在命令行执行scrapy,比如scrapy crawl spiderXXXX,如果我想要传递一个自定义的参数进去给scrapy,比如我想传递一个爬取的页码数目,我要每次爬取10页。
 
那么需要在spider中定义一个构造函数
 
    def __init__(self,page=None,*args, **kwargs):
super(Gaode,self).__init__(*args, **kwargs)
self.page=page


def start_requests(self):
XXXXXX 调用self.page 即可
yield Request(XXXX)

 
然后在启动scrapy的时候赋予参数的值:
 
scrapy crawl spider -a page=10
 
就可以动态传入参数
 
原创文章
转载请注明出处:http://30daydo.com/article/436
  收起阅读 »

学习强国Python自动化代码

话不多说,爱国爱党爱人民!!! 本代码转载至github其他人,与本人无关。
 
# _*_ coding: utf-8 _*_

from selenium import webdriver
import time

__author__ = 'Silent_Coder'
__date__ = '2019/3/12 22:41'

HOME_PAGE = 'https://www.xuexi.cn/'
VIDEO_LINK = 'https://www.xuexi.cn/a191dbc3067d516c3e2e17e2e08953d6/b87d700beee2c44826a9202c75d18c85.html?pageNumber=39'
LONG_VIDEO_LINK = 'https://www.xuexi.cn/f65dae4a57fe21fcc36f3506d660891c/b2e5aa79be613aed1f01d261c4a2ae17.html'
LONG_VIDEO_LINK2 = 'https://www.xuexi.cn/0040db2a403b0b9303a68b9ae5a4cca0/b2e5aa79be613aed1f01d261c4a2ae17.html'
TEST_VIDEO_LINK = 'https://www.xuexi.cn/8e35a343fca20ee32c79d67e35dfca90/7f9f27c65e84e71e1b7189b7132b4710.html'
SCORES_LINK = 'https://pc.xuexi.cn/points/my-points.html'
LOGIN_LINK = 'https://pc.xuexi.cn/points/login.html'
ARTICLES_LINK = 'https://www.xuexi.cn/d05cad69216e688d304bb91ef3aac4c6/9a3668c13f6e303932b5e0e100fc248b.html'

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(executable_path=r'D:\OneDrive\Python\selenium\chromedriver.exe',options=options)


def login_simulation():
"""模拟登录"""
# 方式一:使用cookies方式
# 先自己登录,然后复制token值覆盖
# cookies = {'name': 'token', 'value': ''}
# browser.add_cookie(cookies)

# 方式二:自己扫码登录
browser.get(LOGIN_LINK)
browser.maximize_window()
browser.execute_script("var q=document.documentElement.scrollTop=1000")
time.sleep(10)
browser.get(HOME_PAGE)
print("模拟登录完毕\n")


def watch_videos():
"""观看视频"""
browser.get(VIDEO_LINK)
videos = browser.find_elements_by_xpath("//div[@id='Ck3ln2wlyg3k00']")
spend_time = 0

for i, video in enumerate(videos):
if i > 6:
break
video.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)

# 点击播放
browser.find_element_by_xpath("//div[@class='outter']").click()
# 获取视频时长
video_duration_str = browser.find_element_by_xpath("//span[@class='duration']").get_attribute('innerText')
video_duration = int(video_duration_str.split(':')[0]) * 60 + int(video_duration_str.split(':')[1])
# 保持学习,直到视频结束
time.sleep(video_duration + 3)
spend_time += video_duration + 3
browser.close()
browser.switch_to_window(all_handles[0])

# if spend_time < 3010:
# browser.get(LONG_VIDEO_LINK)
# browser.execute_script("var q=document.documentElement.scrollTop=850")
# try:
# browser.find_element_by_xpath("//div[@class='outter']").click()
# except:
# pass
#
# # 观看剩下的时间
# time.sleep(3010 - spend_time)
browser.get(TEST_VIDEO_LINK)
time.sleep(3010 - spend_time)
print("播放视频完毕\n")


def read_articles():
"""阅读文章"""
browser.get(ARTICLES_LINK)
articles = browser.find_elements_by_xpath("//div[@id='Ca4gvo4bwg7400']")
for index, article in enumerate(articles):
if index > 7:
break
article.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)
for i in range(0, 2000, 100):

js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
for i in range(2000, 0, -100):
js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
time.sleep(80)
browser.close()
browser.switch_to_window(all_handles[0])
print("阅读文章完毕\n")


def get_scores():
"""获取当前积分"""
browser.get(SCORES_LINK)
time.sleep(2)
gross_score = browser.find_element_by_xpath("//*[@id='app']/div/div[2]/div/div[2]/div[2]/span[1]")\
.get_attribute('innerText')
today_score = browser.find_element_by_xpath("//span[@class='my-points-points']").get_attribute('innerText')
print("当前总积分:" + str(gross_score))
print("今日积分:" + str(today_score))
print("获取积分完毕,即将退出\n")


if __name__ == '__main__':
login_simulation() # 模拟登录
read_articles() # 阅读文章
watch_videos() # 观看视频
get_scores() # 获得今日积分
browser.quit()
继续阅读 »
话不多说,爱国爱党爱人民!!! 本代码转载至github其他人,与本人无关。
 
# _*_ coding: utf-8 _*_

from selenium import webdriver
import time

__author__ = 'Silent_Coder'
__date__ = '2019/3/12 22:41'

HOME_PAGE = 'https://www.xuexi.cn/'
VIDEO_LINK = 'https://www.xuexi.cn/a191dbc3067d516c3e2e17e2e08953d6/b87d700beee2c44826a9202c75d18c85.html?pageNumber=39'
LONG_VIDEO_LINK = 'https://www.xuexi.cn/f65dae4a57fe21fcc36f3506d660891c/b2e5aa79be613aed1f01d261c4a2ae17.html'
LONG_VIDEO_LINK2 = 'https://www.xuexi.cn/0040db2a403b0b9303a68b9ae5a4cca0/b2e5aa79be613aed1f01d261c4a2ae17.html'
TEST_VIDEO_LINK = 'https://www.xuexi.cn/8e35a343fca20ee32c79d67e35dfca90/7f9f27c65e84e71e1b7189b7132b4710.html'
SCORES_LINK = 'https://pc.xuexi.cn/points/my-points.html'
LOGIN_LINK = 'https://pc.xuexi.cn/points/login.html'
ARTICLES_LINK = 'https://www.xuexi.cn/d05cad69216e688d304bb91ef3aac4c6/9a3668c13f6e303932b5e0e100fc248b.html'

options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation'])
browser = webdriver.Chrome(executable_path=r'D:\OneDrive\Python\selenium\chromedriver.exe',options=options)


def login_simulation():
"""模拟登录"""
# 方式一:使用cookies方式
# 先自己登录,然后复制token值覆盖
# cookies = {'name': 'token', 'value': ''}
# browser.add_cookie(cookies)

# 方式二:自己扫码登录
browser.get(LOGIN_LINK)
browser.maximize_window()
browser.execute_script("var q=document.documentElement.scrollTop=1000")
time.sleep(10)
browser.get(HOME_PAGE)
print("模拟登录完毕\n")


def watch_videos():
"""观看视频"""
browser.get(VIDEO_LINK)
videos = browser.find_elements_by_xpath("//div[@id='Ck3ln2wlyg3k00']")
spend_time = 0

for i, video in enumerate(videos):
if i > 6:
break
video.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)

# 点击播放
browser.find_element_by_xpath("//div[@class='outter']").click()
# 获取视频时长
video_duration_str = browser.find_element_by_xpath("//span[@class='duration']").get_attribute('innerText')
video_duration = int(video_duration_str.split(':')[0]) * 60 + int(video_duration_str.split(':')[1])
# 保持学习,直到视频结束
time.sleep(video_duration + 3)
spend_time += video_duration + 3
browser.close()
browser.switch_to_window(all_handles[0])

# if spend_time < 3010:
# browser.get(LONG_VIDEO_LINK)
# browser.execute_script("var q=document.documentElement.scrollTop=850")
# try:
# browser.find_element_by_xpath("//div[@class='outter']").click()
# except:
# pass
#
# # 观看剩下的时间
# time.sleep(3010 - spend_time)
browser.get(TEST_VIDEO_LINK)
time.sleep(3010 - spend_time)
print("播放视频完毕\n")


def read_articles():
"""阅读文章"""
browser.get(ARTICLES_LINK)
articles = browser.find_elements_by_xpath("//div[@id='Ca4gvo4bwg7400']")
for index, article in enumerate(articles):
if index > 7:
break
article.click()
all_handles = browser.window_handles
browser.switch_to_window(all_handles[-1])
browser.get(browser.current_url)
for i in range(0, 2000, 100):

js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
for i in range(2000, 0, -100):
js_code = "var q=document.documentElement.scrollTop=" + str(i)
browser.execute_script(js_code)
time.sleep(5)
time.sleep(80)
browser.close()
browser.switch_to_window(all_handles[0])
print("阅读文章完毕\n")


def get_scores():
"""获取当前积分"""
browser.get(SCORES_LINK)
time.sleep(2)
gross_score = browser.find_element_by_xpath("//*[@id='app']/div/div[2]/div/div[2]/div[2]/span[1]")\
.get_attribute('innerText')
today_score = browser.find_element_by_xpath("//span[@class='my-points-points']").get_attribute('innerText')
print("当前总积分:" + str(gross_score))
print("今日积分:" + str(today_score))
print("获取积分完毕,即将退出\n")


if __name__ == '__main__':
login_simulation() # 模拟登录
read_articles() # 阅读文章
watch_videos() # 观看视频
get_scores() # 获得今日积分
browser.quit()
收起阅读 »

scrapyd 日志文件中文乱码 解决方案

用网页打开scrapyd的后台管理页面后,选择日志,会发现里面的中文是乱码。即使下载下来看也是乱码。
网上一般的解决方法是修改scrapyd的源码,增加一个utf8的编码页面,需要重新写一个html的页面框架,对于一般只是看看日志的朋友来说,没必要这么大刀阔斧的。
 
可以直接使用postman来打开日志文件,里面的中文是正常的。

scrapyd.PNG

 
继续阅读 »
用网页打开scrapyd的后台管理页面后,选择日志,会发现里面的中文是乱码。即使下载下来看也是乱码。
网上一般的解决方法是修改scrapyd的源码,增加一个utf8的编码页面,需要重新写一个html的页面框架,对于一般只是看看日志的朋友来说,没必要这么大刀阔斧的。
 
可以直接使用postman来打开日志文件,里面的中文是正常的。

scrapyd.PNG

  收起阅读 »

运行keras报错 No module named 'numpy.core._multiarray_umath'

python用的是anaconda安装的。
ModuleNotFoundError                       Traceback (most recent call last)
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.multiarray failed to import

The above exception was the direct cause of the following exception:

SystemError Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\importlib\_bootstrap.py in _find_and_load(name, import_)

SystemError: <class '_frozen_importlib._ModuleLockManager'> returned a result with an error set
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core._multiarray_umath failed to import
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.umath failed to import
2019-03-26 18:01:48.643796: F tensorflow/python/lib/core/bfloat16.cc:675] Check failed: PyBfloat16_Type.tp_base != nullptr
 
以前没遇到这个问题,所以怀疑是conda自带的numpy版本过低,然后使用命令 pip install numpy -U
把numpy更新到最新的版本,然后问题就解决了。
 
继续阅读 »
python用的是anaconda安装的。
ModuleNotFoundError                       Traceback (most recent call last)
ModuleNotFoundError: No module named 'numpy.core._multiarray_umath'
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.multiarray failed to import

The above exception was the direct cause of the following exception:

SystemError Traceback (most recent call last)
C:\ProgramData\Anaconda3\lib\importlib\_bootstrap.py in _find_and_load(name, import_)

SystemError: <class '_frozen_importlib._ModuleLockManager'> returned a result with an error set
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core._multiarray_umath failed to import
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
ImportError: numpy.core.umath failed to import
2019-03-26 18:01:48.643796: F tensorflow/python/lib/core/bfloat16.cc:675] Check failed: PyBfloat16_Type.tp_base != nullptr
 
以前没遇到这个问题,所以怀疑是conda自带的numpy版本过低,然后使用命令 pip install numpy -U
把numpy更新到最新的版本,然后问题就解决了。
  收起阅读 »

最新版的anaconda无法使用pip安装软件:报错 SSL module is not available

错误信息:
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.ustc.edu.cn/an ... gt%3B
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
SSLError(MaxRetryError('HTTPSConnectionPool(host=\'mirrors.ustc.edu.cn\', port=443): Max retries exceeded with url: /anaconda/cloud/conda-forge/win-64/repodata.json (Caused by SSLError("Can\'t connect to HTTPS URL because the SSL module is not available."))'))

折腾了很久,最新版的anaconda使用的是python3.7,也按照网上的方法,把openssl安装了,可是问题还是没有得到解决。
 
无奈下只能下载其他版本的anaconda。 可以到这里下载:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 
下载一个旧版本的anaconda,然后问题就得到解决了。
 
 
############ 更新 ############## 
 
新建一个 .condarc 文件,在 windows下的用户名目录下 ,  如 administrator下,
输入以下的内容:
 
channels:
- http://mirrors.tuna.tsinghua.e ... main/
- http://mirrors.tuna.tsinghua.e ... onda/
- http://mirrors.tuna.tsinghua.e ... free/
show_channel_urls: true
ssl_verify: true

重新下载即可。
继续阅读 »
错误信息:
CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://mirrors.ustc.edu.cn/an ... gt%3B
Elapsed: -

An HTTP error occurred when trying to retrieve this URL.
HTTP errors are often intermittent, and a simple retry will get you on your way.
SSLError(MaxRetryError('HTTPSConnectionPool(host=\'mirrors.ustc.edu.cn\', port=443): Max retries exceeded with url: /anaconda/cloud/conda-forge/win-64/repodata.json (Caused by SSLError("Can\'t connect to HTTPS URL because the SSL module is not available."))'))

折腾了很久,最新版的anaconda使用的是python3.7,也按照网上的方法,把openssl安装了,可是问题还是没有得到解决。
 
无奈下只能下载其他版本的anaconda。 可以到这里下载:
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 
下载一个旧版本的anaconda,然后问题就得到解决了。
 
 
############ 更新 ############## 
 
新建一个 .condarc 文件,在 windows下的用户名目录下 ,  如 administrator下,
输入以下的内容:
 
channels:
- http://mirrors.tuna.tsinghua.e ... main/
- http://mirrors.tuna.tsinghua.e ... onda/
- http://mirrors.tuna.tsinghua.e ... free/
show_channel_urls: true
ssl_verify: true

重新下载即可。 收起阅读 »

shapely windows的安装方式

在win7上默认使用pip 安装会失败。
报错:
pip install Shapely
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 24: invalid continuation byte

应该是版本兼容问题。 到官网上:https://shapely.readthedocs.io/en/latest/project.html#requirements
发现,windows只能使用源文件安装或者使用conda安装。
 
 
源文件安装:
先下载
下载链接:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely 
 
然后使用pip安装
 
继续阅读 »
在win7上默认使用pip 安装会失败。
报错:
pip install Shapely
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd5 in position 24: invalid continuation byte

应该是版本兼容问题。 到官网上:https://shapely.readthedocs.io/en/latest/project.html#requirements
发现,windows只能使用源文件安装或者使用conda安装。
 
 
源文件安装:
先下载
下载链接:
https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely 
 
然后使用pip安装
  收起阅读 »

踩坑了

flask  循环导入的问题
flask  循环导入的问题

【2019-03-16】市场热度预测 - 通过检测某个论坛(集思录)的热度衡量

很早前就有这个想法,只是最终实践最近才完成,其实并不是很大难度,只是把这个事情早早抛诸脑后。
 
首先得有数据,有了数据就可以慢慢分析了。
 
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:

echarts.png

 
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
 
感觉这个是不错逃顶抄底指标呀。
 
文章中的数据每周更新,敬请留意。
 
原创文章
转载请注明出处:
http://30daydo.com/article/428
 
继续阅读 »
很早前就有这个想法,只是最终实践最近才完成,其实并不是很大难度,只是把这个事情早早抛诸脑后。
 
首先得有数据,有了数据就可以慢慢分析了。
 
首先是集思录,把数据进行重新采用,按照周采样,然后绘图:

echarts.png

 
看到这张图后,瞬间也是震惊了,我觉得应该要逃离了。当然不是马上撤离,但是应该时间不会太久,1-2周就应该空仓了。
 
感觉这个是不错逃顶抄底指标呀。
 
文章中的数据每周更新,敬请留意。
 
原创文章
转载请注明出处:
http://30daydo.com/article/428
  收起阅读 »

推个大佬的公众号

一线柚子

1.png

 
 
人很好
文笔很好
思路逻辑狠厉害
 
目前是一片价值洼地  ^_^
一线柚子

1.png

 
 
人很好
文笔很好
思路逻辑狠厉害
 
目前是一片价值洼地  ^_^

争先恐后开科创板当韭菜当试验品


争先恐后开科创板当韭菜当试验品

一个市场理性不理性 和人数有非常大的关系 现在科创板之所以设置一个门槛 就是因为这个是要当试验品的 所以有巨大的风险 一般老百姓是难以承受的

现在有一种理论 就是一开始科创板肯定是涨的 至于以后就不管了 关键是一开始是多久呢?你能看到 别人也能看到 最后就是比手快了

科创板也好 创业板也好 中小板也好 无非是换个名字而已 企业还是这样的企业 体制还是这样的体制 人还是这批人 股票也还是这样的股票 

散户投资股票并无优势 既没有资金 也没有信息 频繁交易无非给券商打工 勉强的一点优势就是能熬 不过能熬也要买在低位吧 类似48元的中石油 估计到孙子辈不知道能不能解套了 

所以 还是老老实实点 买股票只有人少没量的时候才能进 人多量大的时候还是出来看热闹吧 还是那句话 管住手
继续阅读 »

争先恐后开科创板当韭菜当试验品

一个市场理性不理性 和人数有非常大的关系 现在科创板之所以设置一个门槛 就是因为这个是要当试验品的 所以有巨大的风险 一般老百姓是难以承受的

现在有一种理论 就是一开始科创板肯定是涨的 至于以后就不管了 关键是一开始是多久呢?你能看到 别人也能看到 最后就是比手快了

科创板也好 创业板也好 中小板也好 无非是换个名字而已 企业还是这样的企业 体制还是这样的体制 人还是这批人 股票也还是这样的股票 

散户投资股票并无优势 既没有资金 也没有信息 频繁交易无非给券商打工 勉强的一点优势就是能熬 不过能熬也要买在低位吧 类似48元的中石油 估计到孙子辈不知道能不能解套了 

所以 还是老老实实点 买股票只有人少没量的时候才能进 人多量大的时候还是出来看热闹吧 还是那句话 管住手
收起阅读 »

CZWZ

 技术栈 
    前端:layui
    后端:falsk + elasticsearch +mysql
 
-----------------------抓紧学习研究-----------------------
jenkins
slack
 
 
 
 技术栈 
    前端:layui
    后端:falsk + elasticsearch +mysql
 
-----------------------抓紧学习研究-----------------------
jenkins
slack
 
 
 

《机器学习在线 解析阿里云机器学习平台》读后感

IMG_20190310_201215R.jpg

 现在阿里云的在线学习平台要收费了,一年1700多,所以看了第二章,准备上机试试。没办法,不建议大家看这本书,如果你买了阿里云的学习平台,那么可以去看一下。 不过,既然能买阿里的平台的,应该是直接是要在上面部署的了,这本书是入门的入门,所以还是不要看了。
 
 
继续阅读 »
IMG_20190310_201215R.jpg

 现在阿里云的在线学习平台要收费了,一年1700多,所以看了第二章,准备上机试试。没办法,不建议大家看这本书,如果你买了阿里云的学习平台,那么可以去看一下。 不过,既然能买阿里的平台的,应该是直接是要在上面部署的了,这本书是入门的入门,所以还是不要看了。
 
  收起阅读 »

2019-03-02

“人生为了回家,终究离开家。”
 
“人生为了回家,终究离开家。”
 

2月


1.png

 
 
这样的行情自己也第一次经历 
记录下
开始职业就是熊市,弄得现在看不懂就赶紧空仓。。。

1.png

 
 
这样的行情自己也第一次经历 
记录下
开始职业就是熊市,弄得现在看不懂就赶紧空仓。。。

关于风险


上涨中所有风险都会被忽视
下跌中所有风险都会被放大

可是实际的事实却是:
上涨中所有风险都会被积累
下跌中所有风险都会被释放

上涨中所有风险都会被忽视
下跌中所有风险都会被放大

可是实际的事实却是:
上涨中所有风险都会被积累
下跌中所有风险都会被释放

大鳄 索罗斯的“反身性”理论 --大师就是大师,或者说是个疯子

转载的文章,很有思考价值。推荐一看,需要点耐心。
 索罗斯的投资思想很庞杂,晦涩难懂,很容易产生歧义。

从严格意义上来讲,索罗斯从来没有对外透露过他的具体投资方法。索罗斯在哈佛大学演讲时说幽默的说,凡是读过他书的人绝对赚不到钱,因为没有人能够知道真实的他。

一位观众举手问他:“你能告诉我们真实的你是什么样的吗?”索罗斯笑答:“不能,说出了就没有索罗斯了。”
所以,外界只能是从他的哲学和投资案例来了解他,我也不例外。

我读过索罗斯写的所有书,也读过很多研究索罗斯投资思想的博士硕士论文,我对索罗斯的投资思想有自己的看法。我认为,索罗斯的投资思想是建立在一个基石上,这个基石是错误、可错性、彻底的可错性。市场会犯错误,人会犯错误,一切貌似正确的投资理论也只不过是等待接受检验的错误而已,说得更极端点-----塑造了历史面貌的思想无非是一些内涵丰富的谬论。

一套富于衍生性的谬论往往最初被人们视为真知灼见,只有在它被解释为现实之后,它的缺陷才开始暴露出来,然后将会出现另一套同样内涵丰富的但与之正相反的新谬论,并且这一过程仍将不断地进行下去。这种观点在正统那里可以说是“异端邪说”,但索罗斯靠着这个思想衍生出来的投资方法获得惊人的成就。

可错性与索罗斯的哲学信仰一脉相承。

索罗斯的哲学根基主要是来源于卡尔﹒波普的证伪主义,还有部分是来源于哈耶克的《感觉的秩序》和《科学的反革命》。证伪主义可以说是认识论上的一次革命,它震耳发聩地提出了新的观点。它认为所有的科学知识都是暂时的,都是等待被证伪的,一些今天看来颠簸不破的真理,很可能只是明天的谬论而已。科学命题不能被证实,只可以被证伪,可证伪性是科学与非科学的划分标准。人类科学知识的增长不是累积式的前进,而是排除错误式的前进,先提出假说,然后予以反驳。

由此,索罗斯提出两个反对,一是反对归纳法,二是反对科学主义。

索罗斯认为,不可能经由归纳法则概括出赢取超额利润的一般方法,假如存在,那么投资者理论上就可以通吃市场,而市场将不复存在。归纳法是典型的累积式的认识论,它违法了从猜想到反驳的证伪原则。用黑天鹅理论来说,即使发现了99只白天鹅,也不能用归纳法说所有的天鹅都是白的,也许第100只是黑的。所以,索罗斯认为,试图照搬自然科学研究方法来归纳出金融市场的历史过程、或者从历史过程中总结出一般性的盈利方法,都犯了投资大忌。

与此同时,索罗斯还极力反对科学主义。自然科学和社会科学有巨大的差异,前者研究的对象是独立的事实,无论研究者抱着什么样的态度都改变不了事实,而后者参杂了观察者的偏见,研究者的信仰、价值观、立场、思维方式的差异都可以重塑事实。金融市场属于后者,股价怎么走不仅取决于事实即基本面,也取决于人们的偏见即怎么看待基本面,由此金融市场就充满巨大的不确定性。
为了说明这个问题,索罗斯引用量子力学的理论。海森堡的量子力学认为,量子粒子的质量和速度不可能同时得到精确的测量,其原因在于测量行为干扰了测量对象,在这种情况下,不确定因素是由外部观察者引入的。
 
融市场本身,从而让股价的走势不再是独立的,它总是与参与思维发生反复的共振,这也就是反身性。
 
既然是这样,金融市场就不可能用简单的科学方法来计算。而科学主义者却机械地、毫无批判地将科学方法加诸其研究之上,从这个意义上来说,科学主义恰恰是对科学精神的背叛。

索罗斯赞哈耶克的观点,科学主义是我们的现代科学文明中自我毁灭的力量,是滥用理性的极端表现。他反对任何人假借科学的名义而妄称掌握终极真理的理性狂妄。这也就是为什么投资大师反对过度数学化、工程化倾向,索罗斯甚至不无讽刺的说,他的数学符号从来不比ɑ、? 更多。
而另一个大师巴菲特也说,他用到的数学知识不超过小学水平。索罗斯很反对一些主流经济学家所谓的数量分析,他认同凯恩斯的观点:经济现实中的变量往往是互相依赖的,而某些传统的学者却假设它们是独立存在的,从而用偏微分的方法得出一定的结论,而当他们把结论用于现实时,却又忘记了这些结论赖以存在的假设条件……这是典型的伪数学方法……假设条件使那些作者们能在矫揉造作和毫无用处的数学符号中,忘记现实世界的复杂性和互相依赖的性质。

对归纳法和科学主义的深恶痛疾让索罗斯不得不另辟蹊径,由此索罗斯进入了反身性的世界,并最终得出炼金术的观点。
什么是反身性?

这个概念很晦涩,我们来一层一层的认识它。我们先来看一个命题:一个罗马人说,所有罗马人都撒谎。请问这个罗马人的话是真命题还是假命题?如果相信他,那么就面临一个逻辑悖论:承认了至少有一个罗马人说真话,从而又否定了他。这就是著名的“说谎者悖论”。大哲学家罗素面对这个悖论的时候说,我们应该把命题分为涉及自身的陈述和不涉及自身的陈述,如此就可以解决说谎者悖论。这里就引出一个重要的因素:涉及自身。

索罗斯由此出发来导出反身性概念,索罗斯认为,凡是涉及命题者自身、在内容上“或真”的命题,都是反身性命题。

进一步说,研究对象受到研究者自身的影响就叫反身性。如此一来,股票市场天然就是反身性了,因为股票参与者的观点必然影响到股价,进而让股价不再独立。为了说明这个问题,索罗斯又引出两个函数:

y=f(x) 认知函数
x=F(y) 参与函数

人的行为是y,人的认识是x,行为是认识的函数,表述为认知函数。
其含义是:有什么样的知识就有什么样的行为。而人的行为对人的认识有反作用,认识是行为的函数,表述为参与函数,其含义是:有某一类行为就会有某一类知识。“两个函数同时发挥作用,互相干扰。函数以自变量为前提产生确定的结果,但在这种情境下,一个函数的自变量是另外一个函数的因变量。

确定的结果不再出现,我们看到的是一种相互作用,其中情景和参与者的观点两者均为因变量,以致一个初始变化会突然同时引起情景和参与者观点的进一步变化,我称之为反身性。”上述函数又会产生递归性,它们不会产生均衡,而只有一个永无止境的变化过程。用函数表达其变化为:
y=f(F(y))
x=F(f(x))
这就是说,x和y都是它自身变化的函数——认识是认识变化的的函数,行为是行为变化的函数。它实际上也是一种“自回归系统”。索罗斯用这这个函数是想说明,金融市场根本区别于自然科学研究的过程,在那里,一组事件跟随另一组事件,不受思维和认知的干扰。而金融市场是思维参与其中,因果关系不再是一组事件直接导向下一组事件,相反,它以一种类似鞋襻的模式将事实联结与认知,认知复联结于事实。
如此,反身性理论构建完毕,用通俗的话来解释,就是参与者的认知和被认知对象互相影响,基本面影响观点,观点反过来也影响基本面,它们永不均衡,互动变化,以致无穷。

美国学者约翰﹒特雷恩在《大师的投资习惯》中对此有过精彩解读:“‘反身性原理’的本质是指认知可以改变事件,而事件反过来又改变认知。这种效应通常被称为‘反馈’。这就好比,如果你拴住一条脾气好的狗并踢他,骂它‘坏狗’,那么这条狗会真的变得很凶,并扑过来咬你,而这又会引来更多的踢打、更多的撕咬。”

再举个更直白的例子,如果投资者相信美元升值,那么他们的购买行为讲会让美元上涨,这反过来又会使利率降低,刺激经济增长,从而推动美元再次升值。这也就回到前面的那个说谎者的悖论,凡是涉及自我的命题,自我都难逃脱干系。在这个过程中,任何简单的只研究股价本身而不顾参与者偏见的科学主义都是错的。

说得更极端些,那些即使是认识错误的命题,只要有足够强大的影响力,它依然能在股市获利,这就是为什么股价有时候看起来泡沫很大但买的人很多,有时候看起来又低得可怜但无人问津。因为金融市场是个“炼金术”,投资者的决策意意识和决策行为具有像“炼金师”那么改变“事实结构”的“意志力”。在科学家看来,改变“物质结构”的“意念”是伪科学的,但在金融世界里,“改变市场结构”的“主流偏见”却是真是的,却是可以赚大钱的。所以,金融市场拒绝了科学主义,却接纳了金融炼金术。

整理一下刚才的逻辑,索罗斯认为,很多认知貌似真理,其实是错的、不确定的,它们所谓的正确只是暂时的、等待证伪的。无论它们是通过归纳法还是科学主义得到的认识,都不足以垄断真理和科学,在自然科学领域如此,在社会科学领域更是如此。更荒谬的是,很多人把自然科学的方法和结论强加在社会现象的研究中,这如同把魔术方法应用到自然科学领域的炼金术一样,只能使炼金术身败名裂。

社会科学是特殊的领域,研究者可以对研究对象施加自己的影响,在社会、政治、经济事物中,理论即使没有确凿的证据也可以是有效的,因为社会科学充满反身性,只要主流偏见足够强大,谬论也会在某些情况下变成“真理”,所以金融炼金术可以大行其道。

金融市场是反身性市场,它的决策不可能成为一个科学研究的命题,相反,它更像一个“非科学”的“炼金术”,因为金融市场中的决策评价取决于参与者们歪曲了的见解。正是因为参与者的决策并非基于客观的条件,而是对条件的解释,所以金融市场的根子是不确定的、是可错的。

没有人能完全正确认识市场,任何所谓正确的认识都只能是猜测,它还须接受反驳和证伪。投资的过程就是不断提出猜想并让市场验证和反驳的过程,而不是用科学命题去决策的过程。在索罗斯眼里,金融市场是不确定的,这种不确定是根本性的、是绝对的,任何看法都可能错,任何错误都可能发生,它们本质上也就是风险。索罗斯思想的底色就是可错性、不确定性、认知的不完备性,也就是风险性。

索罗斯的哲学认知论让他怀疑一切,包括他自己。
 
索罗斯谈到他为什么和罗杰斯分道扬镳时说,罗杰斯有个重大缺陷:“他极为藐视华尔街专业人才的精明”----尽管在这一点上索罗斯认为自己和罗杰斯看法相同----但是“罗杰斯却极为自信,从来不承认自己也可能犯错”,而“我却时刻相信自己也会犯错误”。这道出了索罗斯内心的哲学根基:证伪主义。市场总是错的,我也总会犯错。这就形成了索罗斯对股市的根本判断:股市风险第一,不确定第一,所以要想在股市生存必须时刻学会逃跑,因为投资本质上是在冒险。
 
个人总结一下,个人理解,要成为索罗斯这种人,那么就是个疯子。 因为他需要怀疑周围的一切,包括他自己,因为在索罗斯看来,什么都是可以证伪的。这样的人,在我看来,会被人理解为人格分裂。 如果不是他靠这个积累了大量财富,绝对会被人当做是一个疯子。
 

继续阅读 »
转载的文章,很有思考价值。推荐一看,需要点耐心。
 索罗斯的投资思想很庞杂,晦涩难懂,很容易产生歧义。

从严格意义上来讲,索罗斯从来没有对外透露过他的具体投资方法。索罗斯在哈佛大学演讲时说幽默的说,凡是读过他书的人绝对赚不到钱,因为没有人能够知道真实的他。

一位观众举手问他:“你能告诉我们真实的你是什么样的吗?”索罗斯笑答:“不能,说出了就没有索罗斯了。”
所以,外界只能是从他的哲学和投资案例来了解他,我也不例外。

我读过索罗斯写的所有书,也读过很多研究索罗斯投资思想的博士硕士论文,我对索罗斯的投资思想有自己的看法。我认为,索罗斯的投资思想是建立在一个基石上,这个基石是错误、可错性、彻底的可错性。市场会犯错误,人会犯错误,一切貌似正确的投资理论也只不过是等待接受检验的错误而已,说得更极端点-----塑造了历史面貌的思想无非是一些内涵丰富的谬论。

一套富于衍生性的谬论往往最初被人们视为真知灼见,只有在它被解释为现实之后,它的缺陷才开始暴露出来,然后将会出现另一套同样内涵丰富的但与之正相反的新谬论,并且这一过程仍将不断地进行下去。这种观点在正统那里可以说是“异端邪说”,但索罗斯靠着这个思想衍生出来的投资方法获得惊人的成就。

可错性与索罗斯的哲学信仰一脉相承。

索罗斯的哲学根基主要是来源于卡尔﹒波普的证伪主义,还有部分是来源于哈耶克的《感觉的秩序》和《科学的反革命》。证伪主义可以说是认识论上的一次革命,它震耳发聩地提出了新的观点。它认为所有的科学知识都是暂时的,都是等待被证伪的,一些今天看来颠簸不破的真理,很可能只是明天的谬论而已。科学命题不能被证实,只可以被证伪,可证伪性是科学与非科学的划分标准。人类科学知识的增长不是累积式的前进,而是排除错误式的前进,先提出假说,然后予以反驳。

由此,索罗斯提出两个反对,一是反对归纳法,二是反对科学主义。

索罗斯认为,不可能经由归纳法则概括出赢取超额利润的一般方法,假如存在,那么投资者理论上就可以通吃市场,而市场将不复存在。归纳法是典型的累积式的认识论,它违法了从猜想到反驳的证伪原则。用黑天鹅理论来说,即使发现了99只白天鹅,也不能用归纳法说所有的天鹅都是白的,也许第100只是黑的。所以,索罗斯认为,试图照搬自然科学研究方法来归纳出金融市场的历史过程、或者从历史过程中总结出一般性的盈利方法,都犯了投资大忌。

与此同时,索罗斯还极力反对科学主义。自然科学和社会科学有巨大的差异,前者研究的对象是独立的事实,无论研究者抱着什么样的态度都改变不了事实,而后者参杂了观察者的偏见,研究者的信仰、价值观、立场、思维方式的差异都可以重塑事实。金融市场属于后者,股价怎么走不仅取决于事实即基本面,也取决于人们的偏见即怎么看待基本面,由此金融市场就充满巨大的不确定性。
为了说明这个问题,索罗斯引用量子力学的理论。海森堡的量子力学认为,量子粒子的质量和速度不可能同时得到精确的测量,其原因在于测量行为干扰了测量对象,在这种情况下,不确定因素是由外部观察者引入的。
 
融市场本身,从而让股价的走势不再是独立的,它总是与参与思维发生反复的共振,这也就是反身性。
 
既然是这样,金融市场就不可能用简单的科学方法来计算。而科学主义者却机械地、毫无批判地将科学方法加诸其研究之上,从这个意义上来说,科学主义恰恰是对科学精神的背叛。

索罗斯赞哈耶克的观点,科学主义是我们的现代科学文明中自我毁灭的力量,是滥用理性的极端表现。他反对任何人假借科学的名义而妄称掌握终极真理的理性狂妄。这也就是为什么投资大师反对过度数学化、工程化倾向,索罗斯甚至不无讽刺的说,他的数学符号从来不比ɑ、? 更多。
而另一个大师巴菲特也说,他用到的数学知识不超过小学水平。索罗斯很反对一些主流经济学家所谓的数量分析,他认同凯恩斯的观点:经济现实中的变量往往是互相依赖的,而某些传统的学者却假设它们是独立存在的,从而用偏微分的方法得出一定的结论,而当他们把结论用于现实时,却又忘记了这些结论赖以存在的假设条件……这是典型的伪数学方法……假设条件使那些作者们能在矫揉造作和毫无用处的数学符号中,忘记现实世界的复杂性和互相依赖的性质。

对归纳法和科学主义的深恶痛疾让索罗斯不得不另辟蹊径,由此索罗斯进入了反身性的世界,并最终得出炼金术的观点。
什么是反身性?

这个概念很晦涩,我们来一层一层的认识它。我们先来看一个命题:一个罗马人说,所有罗马人都撒谎。请问这个罗马人的话是真命题还是假命题?如果相信他,那么就面临一个逻辑悖论:承认了至少有一个罗马人说真话,从而又否定了他。这就是著名的“说谎者悖论”。大哲学家罗素面对这个悖论的时候说,我们应该把命题分为涉及自身的陈述和不涉及自身的陈述,如此就可以解决说谎者悖论。这里就引出一个重要的因素:涉及自身。

索罗斯由此出发来导出反身性概念,索罗斯认为,凡是涉及命题者自身、在内容上“或真”的命题,都是反身性命题。

进一步说,研究对象受到研究者自身的影响就叫反身性。如此一来,股票市场天然就是反身性了,因为股票参与者的观点必然影响到股价,进而让股价不再独立。为了说明这个问题,索罗斯又引出两个函数:

y=f(x) 认知函数
x=F(y) 参与函数

人的行为是y,人的认识是x,行为是认识的函数,表述为认知函数。
其含义是:有什么样的知识就有什么样的行为。而人的行为对人的认识有反作用,认识是行为的函数,表述为参与函数,其含义是:有某一类行为就会有某一类知识。“两个函数同时发挥作用,互相干扰。函数以自变量为前提产生确定的结果,但在这种情境下,一个函数的自变量是另外一个函数的因变量。

确定的结果不再出现,我们看到的是一种相互作用,其中情景和参与者的观点两者均为因变量,以致一个初始变化会突然同时引起情景和参与者观点的进一步变化,我称之为反身性。”上述函数又会产生递归性,它们不会产生均衡,而只有一个永无止境的变化过程。用函数表达其变化为:
y=f(F(y))
x=F(f(x))
这就是说,x和y都是它自身变化的函数——认识是认识变化的的函数,行为是行为变化的函数。它实际上也是一种“自回归系统”。索罗斯用这这个函数是想说明,金融市场根本区别于自然科学研究的过程,在那里,一组事件跟随另一组事件,不受思维和认知的干扰。而金融市场是思维参与其中,因果关系不再是一组事件直接导向下一组事件,相反,它以一种类似鞋襻的模式将事实联结与认知,认知复联结于事实。
如此,反身性理论构建完毕,用通俗的话来解释,就是参与者的认知和被认知对象互相影响,基本面影响观点,观点反过来也影响基本面,它们永不均衡,互动变化,以致无穷。

美国学者约翰﹒特雷恩在《大师的投资习惯》中对此有过精彩解读:“‘反身性原理’的本质是指认知可以改变事件,而事件反过来又改变认知。这种效应通常被称为‘反馈’。这就好比,如果你拴住一条脾气好的狗并踢他,骂它‘坏狗’,那么这条狗会真的变得很凶,并扑过来咬你,而这又会引来更多的踢打、更多的撕咬。”

再举个更直白的例子,如果投资者相信美元升值,那么他们的购买行为讲会让美元上涨,这反过来又会使利率降低,刺激经济增长,从而推动美元再次升值。这也就回到前面的那个说谎者的悖论,凡是涉及自我的命题,自我都难逃脱干系。在这个过程中,任何简单的只研究股价本身而不顾参与者偏见的科学主义都是错的。

说得更极端些,那些即使是认识错误的命题,只要有足够强大的影响力,它依然能在股市获利,这就是为什么股价有时候看起来泡沫很大但买的人很多,有时候看起来又低得可怜但无人问津。因为金融市场是个“炼金术”,投资者的决策意意识和决策行为具有像“炼金师”那么改变“事实结构”的“意志力”。在科学家看来,改变“物质结构”的“意念”是伪科学的,但在金融世界里,“改变市场结构”的“主流偏见”却是真是的,却是可以赚大钱的。所以,金融市场拒绝了科学主义,却接纳了金融炼金术。

整理一下刚才的逻辑,索罗斯认为,很多认知貌似真理,其实是错的、不确定的,它们所谓的正确只是暂时的、等待证伪的。无论它们是通过归纳法还是科学主义得到的认识,都不足以垄断真理和科学,在自然科学领域如此,在社会科学领域更是如此。更荒谬的是,很多人把自然科学的方法和结论强加在社会现象的研究中,这如同把魔术方法应用到自然科学领域的炼金术一样,只能使炼金术身败名裂。

社会科学是特殊的领域,研究者可以对研究对象施加自己的影响,在社会、政治、经济事物中,理论即使没有确凿的证据也可以是有效的,因为社会科学充满反身性,只要主流偏见足够强大,谬论也会在某些情况下变成“真理”,所以金融炼金术可以大行其道。

金融市场是反身性市场,它的决策不可能成为一个科学研究的命题,相反,它更像一个“非科学”的“炼金术”,因为金融市场中的决策评价取决于参与者们歪曲了的见解。正是因为参与者的决策并非基于客观的条件,而是对条件的解释,所以金融市场的根子是不确定的、是可错的。

没有人能完全正确认识市场,任何所谓正确的认识都只能是猜测,它还须接受反驳和证伪。投资的过程就是不断提出猜想并让市场验证和反驳的过程,而不是用科学命题去决策的过程。在索罗斯眼里,金融市场是不确定的,这种不确定是根本性的、是绝对的,任何看法都可能错,任何错误都可能发生,它们本质上也就是风险。索罗斯思想的底色就是可错性、不确定性、认知的不完备性,也就是风险性。

索罗斯的哲学认知论让他怀疑一切,包括他自己。
 
索罗斯谈到他为什么和罗杰斯分道扬镳时说,罗杰斯有个重大缺陷:“他极为藐视华尔街专业人才的精明”----尽管在这一点上索罗斯认为自己和罗杰斯看法相同----但是“罗杰斯却极为自信,从来不承认自己也可能犯错”,而“我却时刻相信自己也会犯错误”。这道出了索罗斯内心的哲学根基:证伪主义。市场总是错的,我也总会犯错。这就形成了索罗斯对股市的根本判断:股市风险第一,不确定第一,所以要想在股市生存必须时刻学会逃跑,因为投资本质上是在冒险。
 
个人总结一下,个人理解,要成为索罗斯这种人,那么就是个疯子。 因为他需要怀疑周围的一切,包括他自己,因为在索罗斯看来,什么都是可以证伪的。这样的人,在我看来,会被人理解为人格分裂。 如果不是他靠这个积累了大量财富,绝对会被人当做是一个疯子。
 

收起阅读 »

Elasticsearch : Failed to obtain node lock, is the following location writable

准备运行 Elasticsearch的时候出现报错: Failed to obtain node lock, is the following location writable。
看了下权限,没有问题,可以写。
后来发现后台的ES进程没有的得到释放,使用kill命令杀掉
ps -axu | grep 'java'
找到对应的进程ID,然后杀掉
 
kill ID号
 
然后重新调用./elasticsearch 就可以了。
 
继续阅读 »
准备运行 Elasticsearch的时候出现报错: Failed to obtain node lock, is the following location writable。
看了下权限,没有问题,可以写。
后来发现后台的ES进程没有的得到释放,使用kill命令杀掉
ps -axu | grep 'java'
找到对应的进程ID,然后杀掉
 
kill ID号
 
然后重新调用./elasticsearch 就可以了。
  收起阅读 »