持有封基老师文章合集 word版【包含公众号所有文字】

股票绫波丽 发表了文章 • 0 个评论 • 203 次浏览 • 2021-09-03 16:11 • 来自相关话题

 
用程序爬取的数据,不得不说,封基老师从18年开始写文章。坚持每天写一篇。
里面有不少理念都是很适合上班族的。
 
文章是word版
 

 
 
下载地址:
链接:https://pan.baidu.com/s/1EZwJ6tsFiS92ftAdeNKWDw 
提取码:dcp4
  查看全部

 
用程序爬取的数据,不得不说,封基老师从18年开始写文章。坚持每天写一篇。
里面有不少理念都是很适合上班族的。
 
文章是word版
 

 
 
下载地址:
链接:https://pan.baidu.com/s/1EZwJ6tsFiS92ftAdeNKWDw 
提取码:dcp4
 

国盛证券Ptrade

股票绫波丽 发表了文章 • 0 个评论 • 1168 次浏览 • 2021-07-06 08:40 • 来自相关话题

目前不少在A股做量化的大部分使用tushare,优矿,米筐,聚宽等等,无论教程,还是实际操作,基本没见有教怎么用程序下单,实盘交易的。

而退而求其次使用按键精灵,模拟点击交易软件进行点击下单,非常不稳定,无法判断下单后是否成交,也无法实时获取行情数据。如果使用tushare或者新浪接口数据,扫描一次全市场的行情用时很久且不稳定,等扫描结束,再下单,此时价格可能已经是几分钟前的了,且此类接口调用次数多是会被封IP的。

笔者使用的是券商提供的量化软件:Ptrade。是恒生电子研发的提供给机构使用的程序化交易软件。提供策略回测,下单API接口,实时行情获取,并且使用的开发语言python,易于上手。

策略回测与实盘交易




研究页面

研究页面,熟悉python jupyter notebook的朋友对这个界面肯定很熟悉。

研究的页面实际就运行你逐行输出调试程序,了解每个函数的具体使用,或者你策略的中途结果调试。





 
回测策略

实际代码需要在回测策略里面写,写完后确定无误,就可以放在仿真环境下真实运行。如果你运行得到的结果很满意,那么就可以直接部署到实盘服务器上。实盘服务器是在券商那边,不需要个人购买服务器,也不需要本地开着这个Ptrade,就是说不需要在个人电脑上一直开着跑,你的最终代码和程序是在券商服务器上部署与运行,除非有报错异常停止,不然在你不暂停或者停止的前提下,可以一直运行下去。












条件满足后下单

可视化量化

同时也提供一些常见的现成的量化策略,选中后只要鼠标点点点也能够自动化跑这些策略了,当然里面很多参数都可以用鼠标点点点修改。





 
接口文档也非常详细:




 
一些常见策略代码:

集合竞价追涨停策略def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
#每天9:23分运行集合竞价处理函数
run_daily(context, aggregate_auction_func, time='9:23')

def aggregate_auction_func(context):
stock = g.security
#最新价
snapshot = get_snapshot(stock)
price = snapshot[stock]['last_px']
#涨停价
up_limit = snapshot[stock]['up_px']
#如果最新价不小于涨停价,买入
if float(price) >= float(up_limit):
order(g.security, 100, limit_price=up_limit)

def handle_data(context, data):
pass
双均线策略def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
pass

#当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def handle_data(context, data):
security = g.security

#得到十日历史价格
df = get_history(10, '1d', 'close', security, fq=None, include=False)

# 得到五日均线价格
ma5 = round(df['close'][-5:].mean(), 3)

# 得到十日均线价格
ma10 = round(df['close'][-10:].mean(), 3)

# 取得昨天收盘价
price = data[security]['close']

# 得到当前资金余额
cash = context.portfolio.cash

# 如果当前有余额,并且五日均线大于十日均线
if ma5 > ma10:
# 用所有 cash 买入股票
order_value(security, cash)
# 记录这次买入
log.info("Buying %s" % (security))

# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(security).amount > 0:
# 全部卖出
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
 
tick级别均线策略

通俗点就是按照秒级别进行操作。def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
#每3秒运行一次主函数
run_interval(context, func, seconds=3)

#盘前准备历史数据
def before_trading_start(context, data):
history = get_history(10, '1d', 'close', g.security, fq='pre', include=False)
g.close_array = history['close'].values

#当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def func(context):

stock = g.security

#获取最新价
snapshot = get_snapshot(stock)
price = snapshot[stock]['last_px']

# 得到五日均线价格
days = 5
ma5 = get_MA_day(stock, days, g.close_array[-4:], price)
# 得到十日均线价格
days = 10
ma10 = get_MA_day(stock, days, g.close_array[-9:], price)

# 得到当前资金余额
cash = context.portfolio.cash

# 如果当前有余额,并且五日均线大于十日均线
if ma5 > ma10:
# 用所有 cash 买入股票
order_value(stock, cash)
# 记录这次买入
log.info("Buying %s" % (stock))

# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(stock).amount > 0:
# 全部卖出
order_target(stock, 0)
# 记录这次卖出
log.info("Selling %s" % (stock))

#计算实时均线函数
def get_MA_day(stock,days,close_array,current_price):
close_sum = close_array[-(days-1):].sum()
MA = (current_price + close_sum)/days
return MA

def handle_data(context, data):
pass
 
macd策略def f_expma(N,m,EXPMA1,price):
a = m/(N+1)
EXPMA2 = a * price + (1 - a)*EXPMA1
return EXPMA2 #2为后一天值

#定义macd函数,输入平滑系数参数、前一日值,输出当日值
def macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,price):
EXPMA12_2 = f_expma(N1,m,EXPMA12_1,price)
EXPMA26_2 = f_expma(N2,m,EXPMA26_1,price)
DIF2 = EXPMA12_2 - EXPMA26_2
a = m/(N3+1)
DEA2 = a * DIF2 + (1 - a)*DEA1
BAR2=2*(DIF2-DEA2)
return EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2

def initialize(context):
global init_price
init_price = None
# 获取沪深300股票
g.security = get_index_stocks('000300.SS')
#g.security = ['600570.SS']
# 设置我们要操作的股票池, 这里我们只操作一支股票
set_universe(g.security)

def handle_data(context, data):
# 获取历史数据,这里只获取了2天的数据,如果希望最终MACD指标结果更准确最好是获取
# 从股票上市至今的所有历史数据,即增加获取的天数
close_price = get_history(2, '1d', field='close', security_list=g.security)
#如果是停牌不进行计算
for security in g.security:
if data[security].is_open >0:
global init_price,EXPMA12_1,EXPMA26_1,EXPMA12_2,EXPMA26_2,DIF1,DIF2,DEA1,DEA2
if init_price is None:
init_price = close_price[security].mean()#nan和N-1个数,mean为N-1个数的均值
EXPMA12_1 = init_price
EXPMA26_1 = init_price
DIF1 = init_price
DEA1 = init_price
# m用于计算平滑系数a=m/(N+1)
m = 2.0
#设定指数平滑基期数
N1 = 12
N2 = 26
N3 = 9
EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2 = macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,close_price[security][-1])
# 取得当前价格
current_price = data[security].price
# 取得当前的现金
cash = context.portfolio.cash
# DIF、DEA均为正,DIF向上突破DEA,买入信号参考
if DIF2 > 0 and DEA2 > 0 and DIF1 < DEA1 and DIF2 > DEA2:
# 计算可以买多少只股票
number_of_shares = int(cash/current_price)
# 购买量大于0时,下单
if number_of_shares > 0:
# 以市单价买入股票,日回测时即是开盘价
order(security, +number_of_shares)
# 记录这次买入
log.info("Buying %s" % (security))
# DIF、DEA均为负,DIF向下突破DEA,卖出信号参考
elif DIF2 < 0 and DEA2 < 0 and DIF1 > DEA1 and DIF2 < DEA2 and get_position(security).amount > 0:
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
# 将今日的值赋给全局变量作为下一次前一日的值
DEA1 = DEA2
DIF1 = DIF2
EXPMA12_1 = EXPMA12_2
EXPMA26_1 = EXPMA26_2
 
软件与交易接口开通条件:

开通该券商后,存入资金30W放2周即可开通,开通后可取出。开通后股票交易免五

本身券商的交易费率为股票万一,可转债沪百万分之二,深十万分之五,基金万0.6 免五,非常厚道,不太了解量化行业的可以了解下,不少面向机构的量化交易软件的佣金是万2.5的,且开户门槛高,基本是500W以上,比如华泰的matic量化的门槛是1千万元起步。

所以笔者还是很推荐目前该券商的量化交易接口。

需要开通咨询了解的朋友可以扫码联系: 查看全部
目前不少在A股做量化的大部分使用tushare,优矿,米筐,聚宽等等,无论教程,还是实际操作,基本没见有教怎么用程序下单,实盘交易的。

而退而求其次使用按键精灵,模拟点击交易软件进行点击下单,非常不稳定,无法判断下单后是否成交,也无法实时获取行情数据。如果使用tushare或者新浪接口数据,扫描一次全市场的行情用时很久且不稳定,等扫描结束,再下单,此时价格可能已经是几分钟前的了,且此类接口调用次数多是会被封IP的。

笔者使用的是券商提供的量化软件:Ptrade。是恒生电子研发的提供给机构使用的程序化交易软件。提供策略回测,下单API接口,实时行情获取,并且使用的开发语言python,易于上手。

策略回测与实盘交易
UrD5TUnxZD.png

研究页面

研究页面,熟悉python jupyter notebook的朋友对这个界面肯定很熟悉。

研究的页面实际就运行你逐行输出调试程序,了解每个函数的具体使用,或者你策略的中途结果调试。

Hc8f4UtMfW.png

 
回测策略

实际代码需要在回测策略里面写,写完后确定无误,就可以放在仿真环境下真实运行。如果你运行得到的结果很满意,那么就可以直接部署到实盘服务器上。实盘服务器是在券商那边,不需要个人购买服务器,也不需要本地开着这个Ptrade,就是说不需要在个人电脑上一直开着跑,你的最终代码和程序是在券商服务器上部署与运行,除非有报错异常停止,不然在你不暂停或者停止的前提下,可以一直运行下去。

Pig1iRRQnP.png



25YjBEdOqa.png


条件满足后下单

可视化量化

同时也提供一些常见的现成的量化策略,选中后只要鼠标点点点也能够自动化跑这些策略了,当然里面很多参数都可以用鼠标点点点修改。

kTmn9iOXaS.png

 
接口文档也非常详细:
v4QFDpHNpd.png

 
一些常见策略代码:

集合竞价追涨停策略
def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
#每天9:23分运行集合竞价处理函数
run_daily(context, aggregate_auction_func, time='9:23')

def aggregate_auction_func(context):
stock = g.security
#最新价
snapshot = get_snapshot(stock)
price = snapshot[stock]['last_px']
#涨停价
up_limit = snapshot[stock]['up_px']
#如果最新价不小于涨停价,买入
if float(price) >= float(up_limit):
order(g.security, 100, limit_price=up_limit)

def handle_data(context, data):
pass

双均线策略
def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
pass

#当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def handle_data(context, data):
security = g.security

#得到十日历史价格
df = get_history(10, '1d', 'close', security, fq=None, include=False)

# 得到五日均线价格
ma5 = round(df['close'][-5:].mean(), 3)

# 得到十日均线价格
ma10 = round(df['close'][-10:].mean(), 3)

# 取得昨天收盘价
price = data[security]['close']

# 得到当前资金余额
cash = context.portfolio.cash

# 如果当前有余额,并且五日均线大于十日均线
if ma5 > ma10:
# 用所有 cash 买入股票
order_value(security, cash)
# 记录这次买入
log.info("Buying %s" % (security))

# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(security).amount > 0:
# 全部卖出
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))

 
tick级别均线策略

通俗点就是按照秒级别进行操作。
def initialize(context):
# 初始化此策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = '600570.SS'
set_universe(g.security)
#每3秒运行一次主函数
run_interval(context, func, seconds=3)

#盘前准备历史数据
def before_trading_start(context, data):
history = get_history(10, '1d', 'close', g.security, fq='pre', include=False)
g.close_array = history['close'].values

#当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def func(context):

stock = g.security

#获取最新价
snapshot = get_snapshot(stock)
price = snapshot[stock]['last_px']

# 得到五日均线价格
days = 5
ma5 = get_MA_day(stock, days, g.close_array[-4:], price)
# 得到十日均线价格
days = 10
ma10 = get_MA_day(stock, days, g.close_array[-9:], price)

# 得到当前资金余额
cash = context.portfolio.cash

# 如果当前有余额,并且五日均线大于十日均线
if ma5 > ma10:
# 用所有 cash 买入股票
order_value(stock, cash)
# 记录这次买入
log.info("Buying %s" % (stock))

# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(stock).amount > 0:
# 全部卖出
order_target(stock, 0)
# 记录这次卖出
log.info("Selling %s" % (stock))

#计算实时均线函数
def get_MA_day(stock,days,close_array,current_price):
close_sum = close_array[-(days-1):].sum()
MA = (current_price + close_sum)/days
return MA

def handle_data(context, data):
pass

 
macd策略
def f_expma(N,m,EXPMA1,price):
a = m/(N+1)
EXPMA2 = a * price + (1 - a)*EXPMA1
return EXPMA2 #2为后一天值

#定义macd函数,输入平滑系数参数、前一日值,输出当日值
def macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,price):
EXPMA12_2 = f_expma(N1,m,EXPMA12_1,price)
EXPMA26_2 = f_expma(N2,m,EXPMA26_1,price)
DIF2 = EXPMA12_2 - EXPMA26_2
a = m/(N3+1)
DEA2 = a * DIF2 + (1 - a)*DEA1
BAR2=2*(DIF2-DEA2)
return EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2

def initialize(context):
global init_price
init_price = None
# 获取沪深300股票
g.security = get_index_stocks('000300.SS')
#g.security = ['600570.SS']
# 设置我们要操作的股票池, 这里我们只操作一支股票
set_universe(g.security)

def handle_data(context, data):
# 获取历史数据,这里只获取了2天的数据,如果希望最终MACD指标结果更准确最好是获取
# 从股票上市至今的所有历史数据,即增加获取的天数
close_price = get_history(2, '1d', field='close', security_list=g.security)
#如果是停牌不进行计算
for security in g.security:
if data[security].is_open >0:
global init_price,EXPMA12_1,EXPMA26_1,EXPMA12_2,EXPMA26_2,DIF1,DIF2,DEA1,DEA2
if init_price is None:
init_price = close_price[security].mean()#nan和N-1个数,mean为N-1个数的均值
EXPMA12_1 = init_price
EXPMA26_1 = init_price
DIF1 = init_price
DEA1 = init_price
# m用于计算平滑系数a=m/(N+1)
m = 2.0
#设定指数平滑基期数
N1 = 12
N2 = 26
N3 = 9
EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2 = macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,close_price[security][-1])
# 取得当前价格
current_price = data[security].price
# 取得当前的现金
cash = context.portfolio.cash
# DIF、DEA均为正,DIF向上突破DEA,买入信号参考
if DIF2 > 0 and DEA2 > 0 and DIF1 < DEA1 and DIF2 > DEA2:
# 计算可以买多少只股票
number_of_shares = int(cash/current_price)
# 购买量大于0时,下单
if number_of_shares > 0:
# 以市单价买入股票,日回测时即是开盘价
order(security, +number_of_shares)
# 记录这次买入
log.info("Buying %s" % (security))
# DIF、DEA均为负,DIF向下突破DEA,卖出信号参考
elif DIF2 < 0 and DEA2 < 0 and DIF1 > DEA1 and DIF2 < DEA2 and get_position(security).amount > 0:
# 卖出所有股票,使这只股票的最终持有量为0
order_target(security, 0)
# 记录这次卖出
log.info("Selling %s" % (security))
# 将今日的值赋给全局变量作为下一次前一日的值
DEA1 = DEA2
DIF1 = DIF2
EXPMA12_1 = EXPMA12_2
EXPMA26_1 = EXPMA26_2

 
软件与交易接口开通条件:

开通该券商后,存入资金30W放2周即可开通,开通后可取出。开通后股票交易免五

本身券商的交易费率为股票万一,可转债沪百万分之二,深十万分之五,基金万0.6 免五,非常厚道,不太了解量化行业的可以了解下,不少面向机构的量化交易软件的佣金是万2.5的,且开户门槛高,基本是500W以上,比如华泰的matic量化的门槛是1千万元起步。

所以笔者还是很推荐目前该券商的量化交易接口。

需要开通咨询了解的朋友可以扫码联系:

量化交易接口python A股

股票绫波丽 发表了文章 • 0 个评论 • 630 次浏览 • 2021-07-01 11:22 • 来自相关话题

不少在A股做量化的基本千篇一律tushare,优矿,米筐,聚宽等等,无论教程也好。
 
实际操作也好,几乎没见几个人教你怎么用程序下单,实盘交易。


稍微好点的easytrader使用的是模拟点击交易软件进行点击下单,基本无法判断下单后是否成交,也无法实时获取行情数据。别跟我说用tushare或者新浪这些接口数据,除非你做的是低频交易。
 
试试扫描一次全市场的行情看看用时多少?等得到满足条件了,再下单,此时价格可能已经在涨停板上封住了。


笔者使用的是券商提供的量化软件:Ptrade。
 
是恒生电子研发的提供给券商机构使用的程序化交易软件。提供策略回测,自动下单功能,使用的开发语言python。


策略回测与实盘交易






研究页面


研究页面,熟悉python jupyter notebook的朋友对这个界面肯定很熟悉。

研究的页面实际就运行你逐行输出调试程序,了解每个函数的具体使用,或者你策略的中途结果调试。








回测策略

实际代码需要在回测策略里面写,写完后确定无误,就可以放在仿真环境下真实运行。
 
如果你运行得到的结果很满意,那么就可以直接部署到实盘服务器上。
 
实盘服务器是在券商那边,不需要个人购买服务器,也不需要本地开着这个Ptrade,就是说不需要在个人电脑上一直开着跑,你的最终代码和程序是在券商服务器上部署与运行,除非有报错异常停止,不然在你不暂停或者停止的前提下,可以一直运行下去。












条件满足后下单

可视化量化

同时也提供一些常见的现成的量化策略,选中后只要鼠标点点点也能够自动化跑这些策略了,当然里面很多参数都可以用鼠标点点点修改。






接口文档也非常详细:








一些常见策略代码:

双均线策略 def initialize(context):
2 # 初始化此策略
3 # 设置我们要操作的股票池, 这里我们只操作一支股票
4 g.security = '600570.SS'
5 set_universe(g.security)
6 pass
7
8 #当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
9 def handle_data(context, data):
10 security = g.security
11
12 #得到十日历史价格
13 df = get_history(10, '1d', 'close', security, fq=None, include=False)
14
15 # 得到五日均线价格
16 ma5 = round(df['close'][-5:].mean(), 3)
17
18 # 得到十日均线价格
19 ma10 = round(df['close'][-10:].mean(), 3)
20
21 # 取得昨天收盘价
22 price = data[security]['close']
23
24 # 得到当前资金余额
25 cash = context.portfolio.cash
26
27 # 如果当前有余额,并且五日均线大于十日均线
28 if ma5 > ma10:
29 # 用所有 cash 买入股票
30 order_value(security, cash)
31 # 记录这次买入
32 log.info("Buying %s" % (security))
33
34 # 如果五日均线小于十日均线,并且目前有头寸
35 elif ma5 < ma10 and get_position(security).amount > 0:
36 # 全部卖出
37 order_target(security, 0)
38 # 记录这次卖出
39 log.info("Selling %s" % (security))
 macd策略
指数平滑均线函数,以price计算,可以选择收盘、开盘价等价格,N为时间周期,m用于计算平滑系数a=m/(N+1),EXPMA1为前一日值 def f_expma(N,m,EXPMA1,price):
2 a = m/(N+1)
3 EXPMA2 = a * price + (1 - a)*EXPMA1
4 return EXPMA2 #2为后一天值
5
6 #定义macd函数,输入平滑系数参数、前一日值,输出当日值
7 def macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,price):
8 EXPMA12_2 = f_expma(N1,m,EXPMA12_1,price)
9 EXPMA26_2 = f_expma(N2,m,EXPMA26_1,price)
10 DIF2 = EXPMA12_2 - EXPMA26_2
11 a = m/(N3+1)
12 DEA2 = a * DIF2 + (1 - a)*DEA1
13 BAR2=2*(DIF2-DEA2)
14 return EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2
15
16 def initialize(context):
17 global init_price
18 init_price = None
19 # 获取沪深300股票
20 g.security = get_index_stocks('000300.SS')
21 #g.security = ['600570.SS']
22 # 设置我们要操作的股票池, 这里我们只操作一支股票
23 set_universe(g.security)
24
25 def handle_data(context, data):
26 # 获取历史数据,这里只获取了2天的数据,如果希望最终MACD指标结果更准确最好是获取
27 # 从股票上市至今的所有历史数据,即增加获取的天数
28 close_price = get_history(2, '1d', field='close', security_list=g.security)
29 #如果是停牌不进行计算
30 for security in g.security:
31 if data[security].is_open >0:
32 global init_price,EXPMA12_1,EXPMA26_1,EXPMA12_2,EXPMA26_2,DIF1,DIF2,DEA1,DEA2
33 if init_price is None:
34 init_price = close_price[security].mean()#nan和N-1个数,mean为N-1个数的均值
35 EXPMA12_1 = init_price
36 EXPMA26_1 = init_price
37 DIF1 = init_price
38 DEA1 = init_price
39 # m用于计算平滑系数a=m/(N+1)
40 m = 2.0
41 #设定指数平滑基期数
42 N1 = 12
43 N2 = 26
44 N3 = 9
45 EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2 = macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,close_price[security][-1])
46 # 取得当前价格
47 current_price = data[security].price
48 # 取得当前的现金
49 cash = context.portfolio.cash
50 # DIF、DEA均为正,DIF向上突破DEA,买入信号参考
51 if DIF2 > 0 and DEA2 > 0 and DIF1 < DEA1 and DIF2 > DEA2:
52 # 计算可以买多少只股票
53 number_of_shares = int(cash/current_price)
54 # 购买量大于0时,下单
55 if number_of_shares > 0:
56 # 以市单价买入股票,日回测时即是开盘价
57 order(security, +number_of_shares)
58 # 记录这次买入
59 log.info("Buying %s" % (security))
60 # DIF、DEA均为负,DIF向下突破DEA,卖出信号参考
61 elif DIF2 < 0 and DEA2 < 0 and DIF1 > DEA1 and DIF2 < DEA2 and get_position(security).amount > 0:
62 # 卖出所有股票,使这只股票的最终持有量为0
63 order_target(security, 0)
64 # 记录这次卖出
65 log.info("Selling %s" % (security))
66 # 将今日的值赋给全局变量作为下一次前一日的值
67 DEA1 = DEA2
68 DIF1 = DIF2
69 EXPMA12_1 = EXPMA12_2
70 EXPMA26_1 = EXPMA26_2
 
同时也支持可转债T+0交易,笔者平时也主要是进行的可转债的交易。
 
软件与交易接口开通条件,

开通改券商后,存入资金50W放2周即可开通,开通后可取出。

本身券商的交易费率为股票万一免五,可转债百万分之二,非常厚道,因为不少面向机构的量化交易软件的佣金是万2.5的,笔者之前在国金渠道开的就是,坑的一比。所以笔者还是很推荐目前该券商的量化交易接口。
 
需要可以关注公众号获取开通链接: 查看全部
不少在A股做量化的基本千篇一律tushare,优矿,米筐,聚宽等等,无论教程也好。
 
实际操作也好,几乎没见几个人教你怎么用程序下单,实盘交易。


稍微好点的easytrader使用的是模拟点击交易软件进行点击下单,基本无法判断下单后是否成交,也无法实时获取行情数据。别跟我说用tushare或者新浪这些接口数据,除非你做的是低频交易。
 
试试扫描一次全市场的行情看看用时多少?等得到满足条件了,再下单,此时价格可能已经在涨停板上封住了。


笔者使用的是券商提供的量化软件:Ptrade
 
是恒生电子研发的提供给券商机构使用的程序化交易软件。提供策略回测,自动下单功能,使用的开发语言python。


策略回测与实盘交易

UrD5TUnxZD.png


研究页面


研究页面,熟悉python jupyter notebook的朋友对这个界面肯定很熟悉。

研究的页面实际就运行你逐行输出调试程序,了解每个函数的具体使用,或者你策略的中途结果调试。


Hc8f4UtMfW.png



回测策略

实际代码需要在回测策略里面写,写完后确定无误,就可以放在仿真环境下真实运行。
 
如果你运行得到的结果很满意,那么就可以直接部署到实盘服务器上。
 
实盘服务器是在券商那边,不需要个人购买服务器,也不需要本地开着这个Ptrade,就是说不需要在个人电脑上一直开着跑,你的最终代码和程序是在券商服务器上部署与运行,除非有报错异常停止,不然在你不暂停或者停止的前提下,可以一直运行下去。

Pig1iRRQnP.png



25YjBEdOqa.png


条件满足后下单

可视化量化

同时也提供一些常见的现成的量化策略,选中后只要鼠标点点点也能够自动化跑这些策略了,当然里面很多参数都可以用鼠标点点点修改。

kTmn9iOXaS.png


接口文档也非常详细:


v4QFDpHNpd.png



一些常见策略代码:

双均线策略
    def initialize(context):
2 # 初始化此策略
3 # 设置我们要操作的股票池, 这里我们只操作一支股票
4 g.security = '600570.SS'
5 set_universe(g.security)
6 pass
7
8 #当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
9 def handle_data(context, data):
10 security = g.security
11
12 #得到十日历史价格
13 df = get_history(10, '1d', 'close', security, fq=None, include=False)
14
15 # 得到五日均线价格
16 ma5 = round(df['close'][-5:].mean(), 3)
17
18 # 得到十日均线价格
19 ma10 = round(df['close'][-10:].mean(), 3)
20
21 # 取得昨天收盘价
22 price = data[security]['close']
23
24 # 得到当前资金余额
25 cash = context.portfolio.cash
26
27 # 如果当前有余额,并且五日均线大于十日均线
28 if ma5 > ma10:
29 # 用所有 cash 买入股票
30 order_value(security, cash)
31 # 记录这次买入
32 log.info("Buying %s" % (security))
33
34 # 如果五日均线小于十日均线,并且目前有头寸
35 elif ma5 < ma10 and get_position(security).amount > 0:
36 # 全部卖出
37 order_target(security, 0)
38 # 记录这次卖出
39 log.info("Selling %s" % (security))

 macd策略
指数平滑均线函数,以price计算,可以选择收盘、开盘价等价格,N为时间周期,m用于计算平滑系数a=m/(N+1),EXPMA1为前一日值
    def f_expma(N,m,EXPMA1,price):
2 a = m/(N+1)
3 EXPMA2 = a * price + (1 - a)*EXPMA1
4 return EXPMA2 #2为后一天值
5
6 #定义macd函数,输入平滑系数参数、前一日值,输出当日值
7 def macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,price):
8 EXPMA12_2 = f_expma(N1,m,EXPMA12_1,price)
9 EXPMA26_2 = f_expma(N2,m,EXPMA26_1,price)
10 DIF2 = EXPMA12_2 - EXPMA26_2
11 a = m/(N3+1)
12 DEA2 = a * DIF2 + (1 - a)*DEA1
13 BAR2=2*(DIF2-DEA2)
14 return EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2
15
16 def initialize(context):
17 global init_price
18 init_price = None
19 # 获取沪深300股票
20 g.security = get_index_stocks('000300.SS')
21 #g.security = ['600570.SS']
22 # 设置我们要操作的股票池, 这里我们只操作一支股票
23 set_universe(g.security)
24
25 def handle_data(context, data):
26 # 获取历史数据,这里只获取了2天的数据,如果希望最终MACD指标结果更准确最好是获取
27 # 从股票上市至今的所有历史数据,即增加获取的天数
28 close_price = get_history(2, '1d', field='close', security_list=g.security)
29 #如果是停牌不进行计算
30 for security in g.security:
31 if data[security].is_open >0:
32 global init_price,EXPMA12_1,EXPMA26_1,EXPMA12_2,EXPMA26_2,DIF1,DIF2,DEA1,DEA2
33 if init_price is None:
34 init_price = close_price[security].mean()#nan和N-1个数,mean为N-1个数的均值
35 EXPMA12_1 = init_price
36 EXPMA26_1 = init_price
37 DIF1 = init_price
38 DEA1 = init_price
39 # m用于计算平滑系数a=m/(N+1)
40 m = 2.0
41 #设定指数平滑基期数
42 N1 = 12
43 N2 = 26
44 N3 = 9
45 EXPMA12_2,EXPMA26_2,DIF2,DEA2,BAR2 = macd(N1,N2,N3,m,EXPMA12_1,EXPMA26_1,DEA1,close_price[security][-1])
46 # 取得当前价格
47 current_price = data[security].price
48 # 取得当前的现金
49 cash = context.portfolio.cash
50 # DIF、DEA均为正,DIF向上突破DEA,买入信号参考
51 if DIF2 > 0 and DEA2 > 0 and DIF1 < DEA1 and DIF2 > DEA2:
52 # 计算可以买多少只股票
53 number_of_shares = int(cash/current_price)
54 # 购买量大于0时,下单
55 if number_of_shares > 0:
56 # 以市单价买入股票,日回测时即是开盘价
57 order(security, +number_of_shares)
58 # 记录这次买入
59 log.info("Buying %s" % (security))
60 # DIF、DEA均为负,DIF向下突破DEA,卖出信号参考
61 elif DIF2 < 0 and DEA2 < 0 and DIF1 > DEA1 and DIF2 < DEA2 and get_position(security).amount > 0:
62 # 卖出所有股票,使这只股票的最终持有量为0
63 order_target(security, 0)
64 # 记录这次卖出
65 log.info("Selling %s" % (security))
66 # 将今日的值赋给全局变量作为下一次前一日的值
67 DEA1 = DEA2
68 DIF1 = DIF2
69 EXPMA12_1 = EXPMA12_2
70 EXPMA26_1 = EXPMA26_2

 
同时也支持可转债T+0交易,笔者平时也主要是进行的可转债的交易。
 
软件与交易接口开通条件,

开通改券商后,存入资金50W放2周即可开通,开通后可取出。

本身券商的交易费率为股票万一免五,可转债百万分之二,非常厚道,因为不少面向机构的量化交易软件的佣金是万2.5的,笔者之前在国金渠道开的就是,坑的一比。所以笔者还是很推荐目前该券商的量化交易接口。
 
需要可以关注公众号获取开通链接:

李笑来:普通人如何练习做到深入思考

闲聊李魔佛 发表了文章 • 0 个评论 • 416 次浏览 • 2021-05-28 19:21 • 来自相关话题

李笑来:
普通人如何练习做到深入思考?
喜欢和聪明人打交道

1. 聪明人的定义:
对一些清晰,必要,准确的概念,很明白,没必要的东西可能就被抛弃。
聪明不是天生的,而是长期积累,锻炼。
我不相信聪明人赚不到钱。

如何锻炼:
 
同一个问题,经常去想,就会比别人想的深刻,周全。
 
对一件事情想象得深刻,并不是靠聪明就可以做得来的。
 
独立的时间,空间,不干扰。

别忘了问题,天天想,想得比别人多,足够多。 查看全部
李笑来:
普通人如何练习做到深入思考?
喜欢和聪明人打交道

1. 聪明人的定义:
对一些清晰,必要,准确的概念,很明白,没必要的东西可能就被抛弃。
聪明不是天生的,而是长期积累,锻炼。
我不相信聪明人赚不到钱。

如何锻炼:
 
同一个问题,经常去想,就会比别人想的深刻,周全。
 
对一件事情想象得深刻,并不是靠聪明就可以做得来的。
 
独立的时间,空间,不干扰。

别忘了问题,天天想,想得比别人多,足够多。

可转债费率百分之二 全市场最便宜

券商万一免五李魔佛 发表了文章 • 0 个评论 • 1122 次浏览 • 2021-03-14 02:03 • 来自相关话题

开户费率有优惠,有利于做可转债方向的朋友







 
可转债沪市百万分之二,深市十万分之四。支持同花顺交易
没有最低5元限制,也没有任何最低限制。
需要的朋友欢迎扫码加我开户吧
 
 

备注:开户
非诚勿扰!
  查看全部
开户费率有优惠,有利于做可转债方向的朋友


qAF2Py9qxD.png


 
可转债沪市百万分之二,深市十万分之四。支持同花顺交易
没有最低5元限制,也没有任何最低限制。
需要的朋友欢迎扫码加我开户吧
 
 

备注:开户
非诚勿扰!
 

a股券商开户 万1免五 没有最低消费

券商万一免五李魔佛 发表了文章 • 0 个评论 • 4205 次浏览 • 2021-03-07 17:51 • 来自相关话题

最近市场上貌似没有几家万一免5的了,之前的银河证券被举报了,免5的费率被取消了。
不过之前还找到一家万一免五的,没有最低费率,用多少算多少,比如买了1000元股票,那么费率只有1000*万分之一,等于1分钱,略等于不用钱哈。 
优势杠杆的。 
 
需要的点击下面链接即可开户: 注意:当前默认的免五已经取消了,需要开通量化交易权限后可以进行免五操作。
 
开通ptrade和qmt量化交易接口的条件,入金30万,过2周左右可以开通。


交割单:




心动不,赶紧心动吧。

该券商也支持同花顺客户端登录,做量化的使用easytrader也可以友好支持。
 
如果有疑问,可以扫码咨询。备注:开户


  查看全部
最近市场上貌似没有几家万一免5的了,之前的银河证券被举报了,免5的费率被取消了。
不过之前还找到一家万一免五的,没有最低费率,用多少算多少,比如买了1000元股票,那么费率只有1000*万分之一,等于1分钱,略等于不用钱哈。 
优势杠杆的。 
 
需要的点击下面链接即可开户: 注意:当前默认的免五已经取消了,需要开通量化交易权限后可以进行免五操作。
 
开通ptrade和qmt量化交易接口的条件,入金30万,过2周左右可以开通。


交割单:
mmexport1615658165249.jpg

心动不,赶紧心动吧。

该券商也支持同花顺客户端登录,做量化的使用easytrader也可以友好支持。
 
如果有疑问,可以扫码咨询。备注:开户


 

scrapy源码分析<一>:入口函数以及是如何运行

python爬虫李魔佛 发表了文章 • 0 个评论 • 2976 次浏览 • 2019-08-31 10:47 • 来自相关话题

运行scrapy crawl example 命令的时候,就会执行我们写的爬虫程序。
下面我们从源码分析一下scrapy执行的流程:
 

执行scrapy crawl 命令时,调用的是Command类class Command(ScrapyCommand):

requires_project = True

def syntax(self):
return '[options]'

def short_desc(self):
return 'Runs all of the spiders - My Defined'

def run(self,args,opts):
print('==================')
print(type(self.crawler_process))
spider_list = self.crawler_process.spiders.list() # 找到爬虫类

for name in spider_list:
print('=================')
print(name)
self.crawler_process.crawl(name,**opts.__dict__)

self.crawler_process.start()
然后我们去看看crawler_process,这个是来自ScrapyCommand,而ScrapyCommand又是CrawlerProcess的子类,而CrawlerProcess又是CrawlerRunner的子类

在CrawlerRunner构造函数里面主要作用就是这个 def __init__(self, settings=None):
if isinstance(settings, dict) or settings is None:
settings = Settings(settings)
self.settings = settings
self.spider_loader = _get_spider_loader(settings) # 构造爬虫
self._crawlers = set()
self._active = set()
self.bootstrap_failed = False
1. 加载配置文件def _get_spider_loader(settings):

cls_path = settings.get('SPIDER_LOADER_CLASS')

# settings文件没有定义SPIDER_LOADER_CLASS,所以这里获取到的是系统的默认配置文件,
# 默认配置文件在接下来的代码块A
# SPIDER_LOADER_CLASS = 'scrapy.spiderloader.SpiderLoader'

loader_cls = load_object(cls_path)
# 这个函数就是根据路径转为类对象,也就是上面crapy.spiderloader.SpiderLoader 这个
# 字符串变成一个类对象
# 具体的load_object 对象代码见下面代码块B

return loader_cls.from_settings(settings.frozencopy())
默认配置文件defautl_settting.py# 代码块A
#......省略若干
SCHEDULER = 'scrapy.core.scheduler.Scheduler'
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue'
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.ScrapyPriorityQueue'

SPIDER_LOADER_CLASS = 'scrapy.spiderloader.SpiderLoader' 就是这个值
SPIDER_LOADER_WARN_ONLY = False

SPIDER_MIDDLEWARES = {}

load_object的实现# 代码块B 为了方便,我把异常处理的去除
from importlib import import_module #导入第三方库

def load_object(path):
dot = path.rindex('.')
module, name = path[:dot], path[dot+1:]
# 上面把路径分为基本路径+模块名

mod = import_module(module)
obj = getattr(mod, name)
# 获取模块里面那个值

return obj

测试代码:In [33]: mod = import_module(module)

In [34]: mod
Out[34]: <module 'scrapy.spiderloader' from '/home/xda/anaconda3/lib/python3.7/site-packages/scrapy/spiderloader.py'>

In [35]: getattr(mod,name)
Out[35]: scrapy.spiderloader.SpiderLoader

In [36]: obj = getattr(mod,name)

In [37]: obj
Out[37]: scrapy.spiderloader.SpiderLoader

In [38]: type(obj)
Out[38]: type
在代码块A中,loader_cls是SpiderLoader,最后返回的的是SpiderLoader.from_settings(settings.frozencopy())
接下来看看SpiderLoader.from_settings, def from_settings(cls, settings):
return cls(settings)
返回类对象自己,所以直接看__init__函数即可class SpiderLoader(object):
"""
SpiderLoader is a class which locates and loads spiders
in a Scrapy project.
"""
def __init__(self, settings):
self.spider_modules = settings.getlist('SPIDER_MODULES')
# 获得settting中的模块名字,创建scrapy的时候就默认帮你生成了
# 你可以看看你的settings文件里面的内容就可以找到这个值,是一个list

self.warn_only = settings.getbool('SPIDER_LOADER_WARN_ONLY')
self._spiders = {}
self._found = defaultdict(list)
self._load_all_spiders() # 加载所有爬虫

核心就是这个_load_all_spiders:
走起:def _load_all_spiders(self):
for name in self.spider_modules:

for module in walk_modules(name): # 这个遍历文件夹里面的文件,然后再转化为类对象,
# 保存到字典:self._spiders = {}
self._load_spiders(module) # 模块变成spider

self._check_name_duplicates() # 去重,如果名字一样就异常

接下来看看_load_spiders
核心就是下面的。def iter_spider_classes(module):
from scrapy.spiders import Spider

for obj in six.itervalues(vars(module)): # 找到模块里面的变量,然后迭代出来
if inspect.isclass(obj) and \
issubclass(obj, Spider) and \
obj.__module__ == module.__name__ and \
getattr(obj, 'name', None): # 有name属性,继承于Spider
yield obj
这个obj就是我们平时写的spider类了。
原来分析了这么多,才找到了我们平时写的爬虫类

待续。。。。
 
原创文章
转载请注明出处
http://30daydo.com/article/530
  查看全部
运行scrapy crawl example 命令的时候,就会执行我们写的爬虫程序。
下面我们从源码分析一下scrapy执行的流程:
 

执行scrapy crawl 命令时,调用的是Command类
class Command(ScrapyCommand):

requires_project = True

def syntax(self):
return '[options]'

def short_desc(self):
return 'Runs all of the spiders - My Defined'

def run(self,args,opts):
print('==================')
print(type(self.crawler_process))
spider_list = self.crawler_process.spiders.list() # 找到爬虫类

for name in spider_list:
print('=================')
print(name)
self.crawler_process.crawl(name,**opts.__dict__)

self.crawler_process.start()

然后我们去看看crawler_process,这个是来自ScrapyCommand,而ScrapyCommand又是CrawlerProcess的子类,而CrawlerProcess又是CrawlerRunner的子类

在CrawlerRunner构造函数里面主要作用就是这个
      def __init__(self, settings=None):
if isinstance(settings, dict) or settings is None:
settings = Settings(settings)
self.settings = settings
self.spider_loader = _get_spider_loader(settings) # 构造爬虫
self._crawlers = set()
self._active = set()
self.bootstrap_failed = False

1. 加载配置文件
def _get_spider_loader(settings):

cls_path = settings.get('SPIDER_LOADER_CLASS')

# settings文件没有定义SPIDER_LOADER_CLASS,所以这里获取到的是系统的默认配置文件,
# 默认配置文件在接下来的代码块A
# SPIDER_LOADER_CLASS = 'scrapy.spiderloader.SpiderLoader'

loader_cls = load_object(cls_path)
# 这个函数就是根据路径转为类对象,也就是上面crapy.spiderloader.SpiderLoader 这个
# 字符串变成一个类对象
# 具体的load_object 对象代码见下面代码块B

return loader_cls.from_settings(settings.frozencopy())

默认配置文件defautl_settting.py
# 代码块A
#......省略若干
SCHEDULER = 'scrapy.core.scheduler.Scheduler'
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleLifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.LifoMemoryQueue'
SCHEDULER_PRIORITY_QUEUE = 'scrapy.pqueues.ScrapyPriorityQueue'

SPIDER_LOADER_CLASS = 'scrapy.spiderloader.SpiderLoader' 就是这个值
SPIDER_LOADER_WARN_ONLY = False

SPIDER_MIDDLEWARES = {}


load_object的实现
# 代码块B 为了方便,我把异常处理的去除
from importlib import import_module #导入第三方库

def load_object(path):
dot = path.rindex('.')
module, name = path[:dot], path[dot+1:]
# 上面把路径分为基本路径+模块名

mod = import_module(module)
obj = getattr(mod, name)
# 获取模块里面那个值

return obj


测试代码:
In [33]: mod = import_module(module)                                                                                                                                             

In [34]: mod
Out[34]: <module 'scrapy.spiderloader' from '/home/xda/anaconda3/lib/python3.7/site-packages/scrapy/spiderloader.py'>

In [35]: getattr(mod,name)
Out[35]: scrapy.spiderloader.SpiderLoader

In [36]: obj = getattr(mod,name)

In [37]: obj
Out[37]: scrapy.spiderloader.SpiderLoader

In [38]: type(obj)
Out[38]: type

在代码块A中,loader_cls是SpiderLoader,最后返回的的是SpiderLoader.from_settings(settings.frozencopy())
接下来看看SpiderLoader.from_settings,
    def from_settings(cls, settings):
return cls(settings)

返回类对象自己,所以直接看__init__函数即可
class SpiderLoader(object):
"""
SpiderLoader is a class which locates and loads spiders
in a Scrapy project.
"""
def __init__(self, settings):
self.spider_modules = settings.getlist('SPIDER_MODULES')
# 获得settting中的模块名字,创建scrapy的时候就默认帮你生成了
# 你可以看看你的settings文件里面的内容就可以找到这个值,是一个list

self.warn_only = settings.getbool('SPIDER_LOADER_WARN_ONLY')
self._spiders = {}
self._found = defaultdict(list)
self._load_all_spiders() # 加载所有爬虫


核心就是这个_load_all_spiders:
走起:
def _load_all_spiders(self):
for name in self.spider_modules:

for module in walk_modules(name): # 这个遍历文件夹里面的文件,然后再转化为类对象,
# 保存到字典:self._spiders = {}
self._load_spiders(module) # 模块变成spider

self._check_name_duplicates() # 去重,如果名字一样就异常


接下来看看_load_spiders
核心就是下面的。
def iter_spider_classes(module):
from scrapy.spiders import Spider

for obj in six.itervalues(vars(module)): # 找到模块里面的变量,然后迭代出来
if inspect.isclass(obj) and \
issubclass(obj, Spider) and \
obj.__module__ == module.__name__ and \
getattr(obj, 'name', None): # 有name属性,继承于Spider
yield obj

这个obj就是我们平时写的spider类了。
原来分析了这么多,才找到了我们平时写的爬虫类

待续。。。。
 
原创文章
转载请注明出处
http://30daydo.com/article/530
 

发现numpy一个很坑的问题,要一定级别的高手才能发现问题

量化交易李魔佛 发表了文章 • 0 个评论 • 2622 次浏览 • 2019-04-30 00:04 • 来自相关话题

一个二元一次方程:
y=X0**2+X1**2   # **2 是平方def function_2(x):
return x[0]**2+x[1]**2

 
下面是计算y的偏导数,分布计算X0和X1的偏导def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret

return grad
然后调用numerical_gradient(function_2,np.array([3,4]))
计算的是二元一次方程 y=X0**2+X1**2  在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果? 
小白一般要花点时间才能找到原因。
  查看全部
一个二元一次方程:
y=X0**2+X1**2   # **2 是平方
def function_2(x):
return x[0]**2+x[1]**2

 
下面是计算y的偏导数,分布计算X0和X1的偏导
def numerical_gradient(f,x):
grad = np.zeros_like(x)
h=1e-4
for idx in range(x.size):
temp_v = x[idx]
x[idx]=temp_v+h
f1=f(x)
print(x,f1)
x[idx]=temp_v-h
f2=f(x)
print(x,f2)
ret = (f1-f2)/(2*h)
print(ret)
x[idx]=temp_v
grad[idx]=ret

return grad

然后调用
numerical_gradient(function_2,np.array([3,4]))

计算的是二元一次方程 y=X0**2+X1**2  在点(3,4)的偏导的值
得到的是什么结果?
为什么会得到这样的结果? 
小白一般要花点时间才能找到原因。
 

numpy和dataframe轴的含义,axis为负数的含义

量化交易李魔佛 发表了文章 • 0 个评论 • 2895 次浏览 • 2019-04-28 14:22 • 来自相关话题

比如有数组:
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])
a
array([[[ 1, 2],
[ 3, 4]],

[[11, 12],
[13, 14]]])
 a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
 
a.sum(axis=0)得到:
array([[12, 14],
[16, 18]])意思是去掉一个中括号,然后运行。
 
同理:
a.sum(axis=1)对a去掉2个中括号,然后运行。
得到:
array([[ 4, 6],
[24, 26]])那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
 
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
 
a.sum(axis=-3)
array([[12, 14],
[16, 18]])
  查看全部
比如有数组:
a=np.array([[[1,2],[3,4]],[[11,12],[13,14]]])

a
array([[[ 1,  2],
[ 3, 4]],

[[11, 12],
[13, 14]]])

 a有3个中括号,那么就有3条轴,从0开始到2,分别是axis=0,1,2
那么我要对a进行求和,分别用axis=0,1,2进行运行。
 
a.sum(axis=0)
得到:
array([[12, 14],
[16, 18]])
意思是去掉一个中括号,然后运行。
 
同理:
a.sum(axis=1)
对a去掉2个中括号,然后运行。
得到:
array([[ 4,  6],
[24, 26]])
那么对a.sum(axis=2)的结果呢?读者可以自己上机去尝试吧。
 
而轴的负数,axis=-3和axis=0的意思是一样的,对于有3层轴的数组来说的话。
 
a.sum(axis=-3)

array([[12, 14],
[16, 18]])

 

可转债如何配债

股票李魔佛 发表了文章 • 0 个评论 • 9152 次浏览 • 2019-03-29 16:24 • 来自相关话题

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

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





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

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










 

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



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

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

1.jpg

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

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

2.jpg


3.jpg

 

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



 

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

量化交易李魔佛 发表了文章 • 4 个评论 • 2304 次浏览 • 2019-03-16 18:03 • 来自相关话题

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





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

echarts.png

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

Linux下自制有道词典 - python 解密有道词典JS加密

python爬虫李魔佛 发表了文章 • 0 个评论 • 2594 次浏览 • 2019-02-23 20:17 • 来自相关话题

对于爬虫新手来说,JS解密是一道过不去的坎,需要不断地练习。
平时在linux下开发,鉴于没有什么好用翻译软件,打开网易也占用系统资源,所以写了个在控制台的翻译软件接口。
 
使用python爬虫,查看网页的JS加密方法,一步一步地分析,就能够得到最后的加密方法啦。
 
直接给出代码:
 # -*- coding: utf-8 -*-
# website: http://30daydo.com
# @Time : 2019/2/23 19:34
# @File : youdao.py
# 解密有道词典的JS


import hashlib
import random
import requests
import time


def md5_(word):
s = bytes(word, encoding='utf8')
m = hashlib.md5()
m.update(s)
ret = m.hexdigest()
return ret

def get_sign(word, salt):
ret = md5_('fanyideskweb' + word + salt + 'p09@Bn{h02_BIEe]$P^nG')
return ret


def youdao(word):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
'Host': 'fanyi.youdao.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'http://fanyi.youdao.com/',
'Content-Length': '252',
'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=1672542763@10.169.0.83; JSESSIONID=aaaWzxpjeDu1gbhopLzKw; ___rl__test__cookies=1550913722828; OUTFOX_SEARCH_USER_ID_NCOO=372126049.6326876',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
}

ts = str(int(time.time()*1000))
salt=ts+str(random.randint(0,10))
bv = md5_("5.0 (Windows)")
sign= get_sign(word,salt)

post_data = {
'i': word,
'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt,
'sign': sign, 'ts': ts, 'bv': bv, 'doctype': 'json', 'version': '2.1',
'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false'
}

r = requests.post(
url=url,
headers=headers,
data=post_data
)

for item in r.json().get('smartResult',{}).get('entries'):
print(item)

word='student'
youdao(word)
得到结果:





 
Github:
https://github.com/Rockyzsu/CrawlMan/tree/master/youdao_dictionary
原创文章,转载请注明出处
http://30daydo.com/article/416 查看全部
对于爬虫新手来说,JS解密是一道过不去的坎,需要不断地练习。
平时在linux下开发,鉴于没有什么好用翻译软件,打开网易也占用系统资源,所以写了个在控制台的翻译软件接口。
 
使用python爬虫,查看网页的JS加密方法,一步一步地分析,就能够得到最后的加密方法啦。
 
直接给出代码:
 
# -*- coding: utf-8 -*-
# website: http://30daydo.com
# @Time : 2019/2/23 19:34
# @File : youdao.py
# 解密有道词典的JS


import hashlib
import random
import requests
import time


def md5_(word):
s = bytes(word, encoding='utf8')
m = hashlib.md5()
m.update(s)
ret = m.hexdigest()
return ret

def get_sign(word, salt):
ret = md5_('fanyideskweb' + word + salt + 'p09@Bn{h02_BIEe]$P^nG')
return ret


def youdao(word):
url = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
headers = {
'Host': 'fanyi.youdao.com',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Requested-With': 'XMLHttpRequest',
'Referer': 'http://fanyi.youdao.com/',
'Content-Length': '252',
'Cookie': 'YOUDAO_MOBILE_ACCESS_TYPE=1; OUTFOX_SEARCH_USER_ID=1672542763@10.169.0.83; JSESSIONID=aaaWzxpjeDu1gbhopLzKw; ___rl__test__cookies=1550913722828; OUTFOX_SEARCH_USER_ID_NCOO=372126049.6326876',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Cache-Control': 'no-cache',
}

ts = str(int(time.time()*1000))
salt=ts+str(random.randint(0,10))
bv = md5_("5.0 (Windows)")
sign= get_sign(word,salt)

post_data = {
'i': word,
'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb', 'salt': salt,
'sign': sign, 'ts': ts, 'bv': bv, 'doctype': 'json', 'version': '2.1',
'keyfrom': 'fanyi.web', 'action': 'FY_BY_REALTIME', 'typoResult': 'false'
}

r = requests.post(
url=url,
headers=headers,
data=post_data
)

for item in r.json().get('smartResult',{}).get('entries'):
print(item)

word='student'
youdao(word)

得到结果:

youdao.PNG

 
Github:
https://github.com/Rockyzsu/CrawlMan/tree/master/youdao_dictionary
原创文章,转载请注明出处
http://30daydo.com/article/416

县城赚钱的暴利生意背后,收割穷人的血汗钱

闲聊李魔佛 发表了文章 • 0 个评论 • 2098 次浏览 • 2019-02-14 17:56 • 来自相关话题

文章来源: 网上转载的,大部分都同意,除了最后一点。

年关难过年年过,但2019年的年关,着实有些不一样。
赶上年底办公地点搬迁,失去工位的评论君,被迫早早返乡,代号也从5A写字楼的Jeffrey转换成村头的二狗子。
作为长年在外务工人员,每次回乡过年,都是来去匆匆。
这次难得在家呆的时间长,年前穿梭在家乡的江南小城地级市,县城和乡村之间走亲戚。
见到听到的人和事, 让我意识到,这个世界的折叠程度,远远超过自己的想象。
最震惊我的,是那些县城里赚钱未遂的人。

01
堂哥的灯具店要关门了
回乡见得第一个亲人,是堂哥。堂哥开了三年的灯具店终于撑不住了,考虑关掉,想听听我的意见。
堂哥是大伯家的独子,刚过而立之年。念书不行,高中毕业就跟着大伯做早餐生意,但起早贪黑,对年轻人来说,确实太难。
三年前, 举全家之力,给堂哥在县城开了一家灯具店。
县城的生意逻辑在造势。为此,堂哥在银行贷了15万,把门店装修的很讲究。就这样,毫无灯具经营经验的堂哥一下子当上了老板。
店铺开起来,才知道有那么多活儿。
销售,上门安装,拉业务,催账,堂哥夫妻两根本忙不过来。于是,大伯的早餐店也盘出去,帮忙上门安装灯具,伯母负责做饭。
全家人围着店铺转,可生意还是每况愈下。
三年忙活下来,店铺的灯具品牌,从欧普、美的等知名品牌降级到杂牌产品。店铺租金太高,堂哥重找了个便宜店面。
最要命的是,三年前借的15万一分钱也没还。整个家庭陷入了进退不得的状态,还不如当初开早餐店。
对此,我觉得不可思议。问堂哥:
去年县城的房子不是卖得很不错嘛,怎么装修生意这么难做?
“炒房的太多了,哪有人真的装修。”
堂哥觉得很无力,我感到很震惊。“县城不到30万人,炒啥房!”
堂哥接触到最真实的市场情况,2018年,绝大多数县城的房子,都是被占坑式买房人买走的。
在外打工,听闻房价会涨,赶紧回家占个坑,或者是附近乡村的居民为了孩子念书,提前在县城买房。
这两类购房者,都不买堂哥的灯具。
堂哥的顾客,主要是周边乡镇自建房的农民。但自建房往往上门安装远,账又难收,利润薄如纸。
县城房地产市场火爆,与堂哥的灯具生意不仅毫无关系,还掏空了县城人们的腰包,导致堂哥的品牌灯具滞销,只能卖质差价廉的杂牌灯具。
堂哥盘点了一下,如果8万外账能顺利收回来。加上店里4万的灯具货量。再加上价值3万不到的拉货二手面包车,差不多还掉银行的贷款。
全家四个劳动力,忙活了三年,一分存款也没剩下。
堂哥盘算着:年底把店关了,明年大伯继续做早餐,自己考虑别的营生。
反正不开店不创业了。
如果说堂哥的灯具店的失败,是县城传统行业的缩影。另一件事,让我对县城的未来更担心了。

02
在老家卖水果的小刘
这是一个乡村创业故事,主人翁是我爷爷家隔壁邻居小孩小刘。
爷爷家是一个人口不到20万的乡镇,镇上只有一条街,底下还有七八个自然村,小刘比我小几岁。
我每次暑假回爷爷家,小刘每次就跟着我满田野里跑,他很机灵,但是不会念书。
长大后,我交了更厉害的朋友,便和小刘没了交集。
他成了我躺在好友列表里的微信好友。
通过他的朋友圈,我了解到,小刘初中肄业之后,一直在杭州一家百果园水果店工作。
2018年中,小刘突然微信找我,说自己要回乡创业,想听听我的建议。
我确认他不是借钱之后,松了一口气。正准备以受过高等教育的高级白领身份,好好点拨他。
小刘聊了他的想法,自己的家乡(我爷爷家的小镇)和大多是乡村一样,留守老人孩子多,但不舍得消费水果。
而在杭的老乡群里,很多老乡在外务工,想给家里留守儿童和老人买水果,既买不到,也无法送货上门。
小刘脑袋灵光,这可是一片蓝海。
杭州水果店的工作经验,让他基本摸清了生鲜店的进货渠道,和成本把控的诀窍。
再加上他长年担任门店的熟客微信群群主,对社群营销,更是有独到的见解。
我没想到,小刘的对于to C模式的理解,竟然如此深刻。
在我看来,这是典型的一线城市营销套路,对乡村市场的降维打击,无疑小刘真的是一个奇才。
于是,他决定回小镇开这样一个水果配送店。店很快开起来了。
小刘每天在群里,发当天水果照片和价格。
顾客大多是在外务工的年轻人,他们为尽孝心,也愿意花钱,通过微信转账的方式付款,小刘给客户家里留守老人和孩子配送,并拍视频作为反馈。
全新的营销方式,加上热心肠的小刘的服务态度,水果店的生意非常好。
但没想到,小刘的水果店还是没撑过春节。
自从开店以来,小刘开始每天凌晨进货,早上运营微信群,接单,配送。即使雇了人帮忙,小刘依然累得开车差点睡着。
忙不要紧,但不挣钱的瞎忙,就最致命了。
对生鲜产品来说,乡村的进货成本,远远超过了小刘的预期。为了控制坏果率,小刘每天凌晨,去最近的城市衢州市进货,结果是坏果率没下来,运输成本先上去了。
老家的人口本来就不多,加上很多老人一辈子节约惯了,心疼钱,所以对子女买来的新鲜水果有天然抗性。
人均收入低的乡村,自然客单价也提不上去,两边一挤压,小刘受不了。
这时候,小刘意识到,乡村的生鲜市场,被各大电商抛弃,不是没有原因的。
他在杭州这样的大城市看到的生鲜的刚性需求,到了乡村,一下子就变成伪需求了。
还没撑到车厘子上市的季节,小刘的店就关掉了,小刘重新回到杭州,找了一份月薪4000的工作。

03
县城的消费市场逻辑
不仅仅传统行业,在县城乡村的土壤无法生长,连小刘这样新颖的商业模式,也无法生存。
县城乡村的消费市场为什么如此萎靡?
我在思考,应该是是消费人口的缺失,导致购买力低下引起的。
年轻人是消费的主力军,但村里的上大学的年轻人,留在省会城市工作。没上学的年轻人,去沿海城市打工。
县城,好就好在消费水平低,坏就坏在,只有消费水平低。
县城缺乏机会,没有热钱,人情社会严重,缺乏工作岗位。寥寥的年轻人选择不多,不是挤破头考公务员,就是考教师资格证。
只有公务员和教师,才是体面的工作。
而就算是体面的工作,依然不会是高薪。这注定了县城的日常用品消费总需求固定,利润低。
消费升级的产品,根本没有对应消费人群。
当一线城市的杯均30RMB的喜茶/瑞幸咖啡/鹿角巷等遍地开花的时候,县城卖得最好的茶饮还是古茗,杯均10RMB。
罗胖在演讲里提到古茗成功的秘诀,县城和镇上晚上的灯光一般不够亮,你只要做一个很简单的事:就是把奶茶店门头的灯调得更亮,最好是能成为那条街上的路灯。
这样就能引起消费者的注意。
其实不然,客单价贴合县城的消费水准,才是奶茶店存活的不二法则。
否则,40块一杯的精品咖啡店开在县城,就算是用上疝气大灯照亮,依然没有市场。
我以为我找到了县城消费萎靡的元凶:购买力低下。
但后来的认知告诉我,我被重重地打脸了。

04
在县城,很多人都用力活着,但很少人用脑活着
虽然这么形容很刻薄,但看到人们花钱做出各种看似“无脑”的事情,真的很痛心。
在县城,似乎只有坑蒙拐骗,才能赚到钱。
和初中同学的饭桌上,听闻当年隔壁班的小美,做床垫生意,如今成为了县城排得上号的富婆。
联想到堂哥口中说的,县城里灯具生意,稍贵的品牌灯具卖不出去,只好卖便宜的杂牌灯具。
卖床垫能如此挣钱?我有些质疑真实性。
后来我知道,原来小美卖的,是玉石床垫,要价3万元到5万元不等,买的人络绎不绝。
没错,就是你第一时间想到的坑老年人的保健品床垫。
以送鸡蛋或大米的小恩惠,召集老年人开会、听课,宣传洗脑玉石床垫包治百病的功效,免费体验试睡。
每天大清早都有老人排队,等着免费“试睡”。不愿意排队的,或者觉得确实有功效的,就把养老钱掏出来买回家。
县城每一个赚钱的暴利生意背后,都是靠收割穷人的血汗钱而来的。
第二个血汗钱收割机,就是低价旅游。99元西湖两日游,399元香港三日游,699元三亚双飞豪华游。
这样大城市玩剩下的低价旅游骗局,在地方被受欢迎。结果可想而知,各种被套路买高价乳胶枕,玉石,名贵中药材等等案例遍地开花。
第三个血汗钱收割机,是民间借贷。p2p以及各种高息揽储的项目,你盯着别人的利息,别人看重的却是你的本金。
我爸告诉我,小时候带我练球的乒乓球教练,因为禁不住年化40%利息诱惑,民间借贷借出去200万遭遇爆雷,抛妻弃子,已经跑路了。
我很震惊,也很忿恨。
起早贪黑开球馆,抛去场地和雇教练的成本,净利润也不过年化20%,连腾讯这样的互联网独角兽的财报,净利润也达不到年化30%。
凭什么你会相信,你的全部养老钱可以躺赚年化40%的利润。

05
跳出这个财富链底层的四点劝诫
这个社会里,信息和财富的扩散,像是冲泡一杯蜜水,蜜总是从杯口慢慢渗透到杯底。
因为认知和信息的差距,导致县城和乡村,就是社会这杯蜜水的杯底。
在城市被淘汰的保健品骗局,入侵着这里的老年人。在大城市卖不动的假货,摆满了这里的货架。
这里的人们赚的不多,还最容易被骗。能不能跳出杯底,我有一些劝诫:
第一,保证全家人都能有健康的生活方式。
别说刚过温饱线的家庭,在疾病面前,连中产家庭也显得不堪一击。
ICU的床位费是1万一个晚上,特效药的报销比例接近于零。别听信“酒是粮食精,越喝越年轻”的鬼话。酒精和隔夜菜里的亚硝酸盐一样,都是一类致癌物。
第二,不要创业不要开店。
不要投入50万装修,开当地最大的网咖,因为等待着你的,是遥遥无期的回本之路。
不要开加工厂,一次工伤事故可能会吃掉你一年的利润。
不要试图开衣食住行以外的店,你的一己之力,无法违背市场规律。
小刘和堂哥,都是县城乡村创业的缩影。
作为一个没背景没资源的普通人,尽量找一份依靠技术和资源赚钱的工作,如果非要创业,请选择轻资产创业模式,不要梭哈。
第三,不要投资,不要炒股。
股票,是资本操纵下的负和游戏,穷人根本没有资格上牌桌。
徐翔案被曝光出的交易内幕,以及今年1月4号,央行降准消息发布前,券商入场拉升大盘等事件,都在说明一个真相:
我们生活在一个信息极不对等的世界里,那些先知先觉的人的背后,是一把把明晃晃的镰刀,等待收割散户。
而投资,同样是一件高门槛高风险的事情。
如果你遇到了一笔很容易的投资机会,它一定是个陷阱,包括但不限于p2p,民间借贷,分红型保险,原油螺纹钢等期货。
第四,为了孩子和自己的起点,请在能力范围内,在最高级别的城市,买房置业。
能买北上深,就不买杭广蓉,能买省会,就不买县城和地级市。
三四线房产只有居住属性,无金融属性。
如果还来得及,请卖掉三四线城市投资属性的房子。
未来三四线城市,将迎来滞涨时代 查看全部
文章来源: 网上转载的,大部分都同意,除了最后一点。

年关难过年年过,但2019年的年关,着实有些不一样。
赶上年底办公地点搬迁,失去工位的评论君,被迫早早返乡,代号也从5A写字楼的Jeffrey转换成村头的二狗子。
作为长年在外务工人员,每次回乡过年,都是来去匆匆。
这次难得在家呆的时间长,年前穿梭在家乡的江南小城地级市,县城和乡村之间走亲戚。
见到听到的人和事, 让我意识到,这个世界的折叠程度,远远超过自己的想象。
最震惊我的,是那些县城里赚钱未遂的人。

01
堂哥的灯具店要关门了
回乡见得第一个亲人,是堂哥。堂哥开了三年的灯具店终于撑不住了,考虑关掉,想听听我的意见。
堂哥是大伯家的独子,刚过而立之年。念书不行,高中毕业就跟着大伯做早餐生意,但起早贪黑,对年轻人来说,确实太难。
三年前, 举全家之力,给堂哥在县城开了一家灯具店。
县城的生意逻辑在造势。为此,堂哥在银行贷了15万,把门店装修的很讲究。就这样,毫无灯具经营经验的堂哥一下子当上了老板。
店铺开起来,才知道有那么多活儿。
销售,上门安装,拉业务,催账,堂哥夫妻两根本忙不过来。于是,大伯的早餐店也盘出去,帮忙上门安装灯具,伯母负责做饭。
全家人围着店铺转,可生意还是每况愈下。
三年忙活下来,店铺的灯具品牌,从欧普、美的等知名品牌降级到杂牌产品。店铺租金太高,堂哥重找了个便宜店面。
最要命的是,三年前借的15万一分钱也没还。整个家庭陷入了进退不得的状态,还不如当初开早餐店。
对此,我觉得不可思议。问堂哥:
去年县城的房子不是卖得很不错嘛,怎么装修生意这么难做?
“炒房的太多了,哪有人真的装修。”
堂哥觉得很无力,我感到很震惊。“县城不到30万人,炒啥房!”
堂哥接触到最真实的市场情况,2018年,绝大多数县城的房子,都是被占坑式买房人买走的。
在外打工,听闻房价会涨,赶紧回家占个坑,或者是附近乡村的居民为了孩子念书,提前在县城买房。
这两类购房者,都不买堂哥的灯具。
堂哥的顾客,主要是周边乡镇自建房的农民。但自建房往往上门安装远,账又难收,利润薄如纸。
县城房地产市场火爆,与堂哥的灯具生意不仅毫无关系,还掏空了县城人们的腰包,导致堂哥的品牌灯具滞销,只能卖质差价廉的杂牌灯具。
堂哥盘点了一下,如果8万外账能顺利收回来。加上店里4万的灯具货量。再加上价值3万不到的拉货二手面包车,差不多还掉银行的贷款。
全家四个劳动力,忙活了三年,一分存款也没剩下。
堂哥盘算着:年底把店关了,明年大伯继续做早餐,自己考虑别的营生。
反正不开店不创业了。
如果说堂哥的灯具店的失败,是县城传统行业的缩影。另一件事,让我对县城的未来更担心了。

02
在老家卖水果的小刘
这是一个乡村创业故事,主人翁是我爷爷家隔壁邻居小孩小刘。
爷爷家是一个人口不到20万的乡镇,镇上只有一条街,底下还有七八个自然村,小刘比我小几岁。
我每次暑假回爷爷家,小刘每次就跟着我满田野里跑,他很机灵,但是不会念书。
长大后,我交了更厉害的朋友,便和小刘没了交集。
他成了我躺在好友列表里的微信好友。
通过他的朋友圈,我了解到,小刘初中肄业之后,一直在杭州一家百果园水果店工作。
2018年中,小刘突然微信找我,说自己要回乡创业,想听听我的建议。
我确认他不是借钱之后,松了一口气。正准备以受过高等教育的高级白领身份,好好点拨他。
小刘聊了他的想法,自己的家乡(我爷爷家的小镇)和大多是乡村一样,留守老人孩子多,但不舍得消费水果。
而在杭的老乡群里,很多老乡在外务工,想给家里留守儿童和老人买水果,既买不到,也无法送货上门。
小刘脑袋灵光,这可是一片蓝海。
杭州水果店的工作经验,让他基本摸清了生鲜店的进货渠道,和成本把控的诀窍。
再加上他长年担任门店的熟客微信群群主,对社群营销,更是有独到的见解。
我没想到,小刘的对于to C模式的理解,竟然如此深刻。
在我看来,这是典型的一线城市营销套路,对乡村市场的降维打击,无疑小刘真的是一个奇才。
于是,他决定回小镇开这样一个水果配送店。店很快开起来了。
小刘每天在群里,发当天水果照片和价格。
顾客大多是在外务工的年轻人,他们为尽孝心,也愿意花钱,通过微信转账的方式付款,小刘给客户家里留守老人和孩子配送,并拍视频作为反馈。
全新的营销方式,加上热心肠的小刘的服务态度,水果店的生意非常好。
但没想到,小刘的水果店还是没撑过春节。
自从开店以来,小刘开始每天凌晨进货,早上运营微信群,接单,配送。即使雇了人帮忙,小刘依然累得开车差点睡着。
忙不要紧,但不挣钱的瞎忙,就最致命了。
对生鲜产品来说,乡村的进货成本,远远超过了小刘的预期。为了控制坏果率,小刘每天凌晨,去最近的城市衢州市进货,结果是坏果率没下来,运输成本先上去了。
老家的人口本来就不多,加上很多老人一辈子节约惯了,心疼钱,所以对子女买来的新鲜水果有天然抗性。
人均收入低的乡村,自然客单价也提不上去,两边一挤压,小刘受不了。
这时候,小刘意识到,乡村的生鲜市场,被各大电商抛弃,不是没有原因的。
他在杭州这样的大城市看到的生鲜的刚性需求,到了乡村,一下子就变成伪需求了。
还没撑到车厘子上市的季节,小刘的店就关掉了,小刘重新回到杭州,找了一份月薪4000的工作。

03
县城的消费市场逻辑
不仅仅传统行业,在县城乡村的土壤无法生长,连小刘这样新颖的商业模式,也无法生存。
县城乡村的消费市场为什么如此萎靡?
我在思考,应该是是消费人口的缺失,导致购买力低下引起的。
年轻人是消费的主力军,但村里的上大学的年轻人,留在省会城市工作。没上学的年轻人,去沿海城市打工。
县城,好就好在消费水平低,坏就坏在,只有消费水平低。
县城缺乏机会,没有热钱,人情社会严重,缺乏工作岗位。寥寥的年轻人选择不多,不是挤破头考公务员,就是考教师资格证。
只有公务员和教师,才是体面的工作。
而就算是体面的工作,依然不会是高薪。这注定了县城的日常用品消费总需求固定,利润低。
消费升级的产品,根本没有对应消费人群。
当一线城市的杯均30RMB的喜茶/瑞幸咖啡/鹿角巷等遍地开花的时候,县城卖得最好的茶饮还是古茗,杯均10RMB。
罗胖在演讲里提到古茗成功的秘诀,县城和镇上晚上的灯光一般不够亮,你只要做一个很简单的事:就是把奶茶店门头的灯调得更亮,最好是能成为那条街上的路灯。
这样就能引起消费者的注意。
其实不然,客单价贴合县城的消费水准,才是奶茶店存活的不二法则。
否则,40块一杯的精品咖啡店开在县城,就算是用上疝气大灯照亮,依然没有市场。
我以为我找到了县城消费萎靡的元凶:购买力低下。
但后来的认知告诉我,我被重重地打脸了。

04
在县城,很多人都用力活着,但很少人用脑活着
虽然这么形容很刻薄,但看到人们花钱做出各种看似“无脑”的事情,真的很痛心。
在县城,似乎只有坑蒙拐骗,才能赚到钱。
和初中同学的饭桌上,听闻当年隔壁班的小美,做床垫生意,如今成为了县城排得上号的富婆。
联想到堂哥口中说的,县城里灯具生意,稍贵的品牌灯具卖不出去,只好卖便宜的杂牌灯具。
卖床垫能如此挣钱?我有些质疑真实性。
后来我知道,原来小美卖的,是玉石床垫,要价3万元到5万元不等,买的人络绎不绝。
没错,就是你第一时间想到的坑老年人的保健品床垫。
以送鸡蛋或大米的小恩惠,召集老年人开会、听课,宣传洗脑玉石床垫包治百病的功效,免费体验试睡。
每天大清早都有老人排队,等着免费“试睡”。不愿意排队的,或者觉得确实有功效的,就把养老钱掏出来买回家。
县城每一个赚钱的暴利生意背后,都是靠收割穷人的血汗钱而来的。
第二个血汗钱收割机,就是低价旅游。99元西湖两日游,399元香港三日游,699元三亚双飞豪华游。
这样大城市玩剩下的低价旅游骗局,在地方被受欢迎。结果可想而知,各种被套路买高价乳胶枕,玉石,名贵中药材等等案例遍地开花。
第三个血汗钱收割机,是民间借贷。p2p以及各种高息揽储的项目,你盯着别人的利息,别人看重的却是你的本金。
我爸告诉我,小时候带我练球的乒乓球教练,因为禁不住年化40%利息诱惑,民间借贷借出去200万遭遇爆雷,抛妻弃子,已经跑路了。
我很震惊,也很忿恨。
起早贪黑开球馆,抛去场地和雇教练的成本,净利润也不过年化20%,连腾讯这样的互联网独角兽的财报,净利润也达不到年化30%。
凭什么你会相信,你的全部养老钱可以躺赚年化40%的利润。

05
跳出这个财富链底层的四点劝诫
这个社会里,信息和财富的扩散,像是冲泡一杯蜜水,蜜总是从杯口慢慢渗透到杯底。
因为认知和信息的差距,导致县城和乡村,就是社会这杯蜜水的杯底。
在城市被淘汰的保健品骗局,入侵着这里的老年人。在大城市卖不动的假货,摆满了这里的货架。
这里的人们赚的不多,还最容易被骗。能不能跳出杯底,我有一些劝诫:
第一,保证全家人都能有健康的生活方式。
别说刚过温饱线的家庭,在疾病面前,连中产家庭也显得不堪一击。
ICU的床位费是1万一个晚上,特效药的报销比例接近于零。别听信“酒是粮食精,越喝越年轻”的鬼话。酒精和隔夜菜里的亚硝酸盐一样,都是一类致癌物。
第二,不要创业不要开店。
不要投入50万装修,开当地最大的网咖,因为等待着你的,是遥遥无期的回本之路。
不要开加工厂,一次工伤事故可能会吃掉你一年的利润。
不要试图开衣食住行以外的店,你的一己之力,无法违背市场规律。
小刘和堂哥,都是县城乡村创业的缩影。
作为一个没背景没资源的普通人,尽量找一份依靠技术和资源赚钱的工作,如果非要创业,请选择轻资产创业模式,不要梭哈。
第三,不要投资,不要炒股。
股票,是资本操纵下的负和游戏,穷人根本没有资格上牌桌。
徐翔案被曝光出的交易内幕,以及今年1月4号,央行降准消息发布前,券商入场拉升大盘等事件,都在说明一个真相:
我们生活在一个信息极不对等的世界里,那些先知先觉的人的背后,是一把把明晃晃的镰刀,等待收割散户。
而投资,同样是一件高门槛高风险的事情。
如果你遇到了一笔很容易的投资机会,它一定是个陷阱,包括但不限于p2p,民间借贷,分红型保险,原油螺纹钢等期货。
第四,为了孩子和自己的起点,请在能力范围内,在最高级别的城市,买房置业。
能买北上深,就不买杭广蓉,能买省会,就不买县城和地级市。
三四线房产只有居住属性,无金融属性。
如果还来得及,请卖掉三四线城市投资属性的房子。
未来三四线城市,将迎来滞涨时代

python 中文图片文字识别

python李魔佛 发表了文章 • 0 个评论 • 3872 次浏览 • 2019-02-01 10:47 • 来自相关话题

pytesseract这个库识别率偏低,也就菜鸟才会用。
使用方法很简单,安装好pytesseract(里面很多坑,小白的话不可避免要折腾一番),然后下载一个中文的字库,百度网盘:https://pan.baidu.com/s/1_jom2d95IeR40gsvkhUuvQ
 
然后把文件放到tesseract的文件夹中 C:\Program Files (x86)\Tesseract-OCR\tessdata 
然后就可以拿来识别了:
from PIL import Image
im = Image.open('chinese.jpg')
plt.figure(figsize=(20,20))
plt.imshow(im)

pytesseract.image_to_string(im,lang='chi_sim')
图片的内容是这样的:





 
然后识别效果如下:
 
'可L又使用以下的语句i上图片显示大 此'
还是不咋地。
 
那么可以换成大厂的API。试试百度的:
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()

image = get_file_content('example.jpg')

""" 调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

from aip import AipOcr

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)


""" 带参数调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image, options)

url = "https//www.x.com/sample.jpg"

""" 调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

""" 带参数调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url, options)
先去百度云申请一个API,免费的。
https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.html#.E9.85.8D.E7.BD.AEAipOcr
然后把key复制到上面的代码中就可以了。
 
然后再调用看看结果:
可以使用以下的语句让图片显示大些正确率明显高很多了。
 
 
 
  查看全部
pytesseract这个库识别率偏低,也就菜鸟才会用。
使用方法很简单,安装好pytesseract(里面很多坑,小白的话不可避免要折腾一番),然后下载一个中文的字库,百度网盘:https://pan.baidu.com/s/1_jom2d95IeR40gsvkhUuvQ
 
然后把文件放到tesseract的文件夹中 C:\Program Files (x86)\Tesseract-OCR\tessdata 
然后就可以拿来识别了:
from PIL import Image
im = Image.open('chinese.jpg')
plt.figure(figsize=(20,20))
plt.imshow(im)

pytesseract.image_to_string(im,lang='chi_sim')

图片的内容是这样的:

中文1.JPG

 
然后识别效果如下:
 
'可L又使用以下的语句i上图片显示大 此'

还是不咋地。
 
那么可以换成大厂的API。试试百度的:
""" 读取图片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()

image = get_file_content('example.jpg')

""" 调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

from aip import AipOcr

""" 你的 APPID AK SK """
APP_ID = '你的 App ID'
API_KEY = '你的 Api Key'
SECRET_KEY = '你的 Secret Key'

client = AipOcr(APP_ID, API_KEY, SECRET_KEY)


""" 带参数调用通用文字识别, 图片参数为本地图片 """
client.basicGeneral(image, options)

url = "https//www.x.com/sample.jpg"

""" 调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url);

""" 如果有可选参数 """
options = {}
options["language_type"] = "CHN_ENG"
options["detect_direction"] = "true"
options["detect_language"] = "true"
options["probability"] = "true"

""" 带参数调用通用文字识别, 图片参数为远程url图片 """
client.basicGeneralUrl(url, options)

先去百度云申请一个API,免费的。
https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.html#.E9.85.8D.E7.BD.AEAipOcr
然后把key复制到上面的代码中就可以了。
 
然后再调用看看结果:
可以使用以下的语句让图片显示大些
正确率明显高很多了。
 
 
 
 

可转债价格分布堆叠图 绘制 可视化 python+pyecharts

量化交易李魔佛 发表了文章 • 0 个评论 • 4063 次浏览 • 2019-01-30 10:59 • 来自相关话题

这一节课带大家学习如何利用可视化,更好的呈现数据。
即使你有很多数据,可是,你无法直观地看到数据的总体趋势。使用可视化的绘图,可以帮助我们看到数据背后看不到的数据。 比如我已经有每一个可转债的价格,评级。数据如下:





 点击查看大图

如果我用下面的图形就可以看出规律:




 点击查看大图

横坐标是价格,纵坐标是落在该价格的可转债数量,不同颜色代表不同评级的可转债。
 
可以看到大部分AA-评级(浅橙色)的可转债价格都在100元以下,而AA(浅蓝色)的可转债价格分布较为平均,从90到110都有。而AA+和AAA的一般都在100以上。
 
那么如何使用代码实现呢?from setting import get_mysql_conn,get_engine
import pandas as pd
import pymongo
from pyecharts import Geo,Style,Map
engine = get_engine('db_stock',local='local')
# 堆叠图
from pyecharts import Bar
df = pd.read_sql('tb_bond_jisilu',con=engine)

result ={}
for name,grades in df.groupby('评级'):
# print(name,grades[['可转债名称','可转债价格']])
for each in grades['可转债价格']:
result.setdefault(name,)
result[name].append(each)


# 确定价格的范围

value = [str(i) for i in range(85,140)]
ret = [0]*len(value)
ret1 = dict(zip(value,ret))

ret_A_add = ret1.copy()
for item in result['A+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
ret_A_add[k]+=1

retAA_ = ret1.copy()
for item in result['']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_[k]+=1

retAA = ret1.copy()
for item in result['AA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA[k]+=1

retAA_add = ret1.copy()
for item in result['AA+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_add[k]+=1

retAAA = ret1.copy()
for item in result['AAA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAAA[k]+=1

bar = Bar('可转债价格分布')
bar.add('A+',value,list(ret_A_add.values()),is_stack=True,yaxis_max=11)
bar.add('',value,list(retAA_.values()),is_stack=True,yaxis_max=11)
bar.add('AA',value,list(retAA.values()),is_stack=True,yaxis_max=11)
bar.add('AA+',value,list(retAA_add.values()),is_stack=True,yaxis_max=11)
bar.add('AAA',value,list(retAAA.values()),is_stack=True,yaxis_max=11)
如果没有安装pyecharts,需要用pip安装即可。
 

 

原创文章
转载请注明出处:
 http://30daydo.com/article/400 

  查看全部
这一节课带大家学习如何利用可视化,更好的呈现数据。
即使你有很多数据,可是,你无法直观地看到数据的总体趋势。使用可视化的绘图,可以帮助我们看到数据背后看不到的数据。 比如我已经有每一个可转债的价格,评级。数据如下:

可转债数据.JPG

 点击查看大图

如果我用下面的图形就可以看出规律:
可转债价格分布.JPG

 点击查看大图

横坐标是价格,纵坐标是落在该价格的可转债数量,不同颜色代表不同评级的可转债。
 
可以看到大部分AA-评级(浅橙色)的可转债价格都在100元以下,而AA(浅蓝色)的可转债价格分布较为平均,从90到110都有。而AA+和AAA的一般都在100以上。
 
那么如何使用代码实现呢?
from  setting import get_mysql_conn,get_engine
import pandas as pd
import pymongo
from pyecharts import Geo,Style,Map
engine = get_engine('db_stock',local='local')
# 堆叠图
from pyecharts import Bar
df = pd.read_sql('tb_bond_jisilu',con=engine)

result ={}
for name,grades in df.groupby('评级'):
# print(name,grades[['可转债名称','可转债价格']])
for each in grades['可转债价格']:
result.setdefault(name,)
result[name].append(each)


# 确定价格的范围

value = [str(i) for i in range(85,140)]
ret = [0]*len(value)
ret1 = dict(zip(value,ret))

ret_A_add = ret1.copy()
for item in result['A+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
ret_A_add[k]+=1

retAA_ = ret1.copy()
for item in result['']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_[k]+=1

retAA = ret1.copy()
for item in result['AA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA[k]+=1

retAA_add = ret1.copy()
for item in result['AA+']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAA_add[k]+=1

retAAA = ret1.copy()
for item in result['AAA']:
for k in ret1:
if float(k)+0.5>item and float(k)-0.5<=item:
retAAA[k]+=1

bar = Bar('可转债价格分布')
bar.add('A+',value,list(ret_A_add.values()),is_stack=True,yaxis_max=11)
bar.add('',value,list(retAA_.values()),is_stack=True,yaxis_max=11)
bar.add('AA',value,list(retAA.values()),is_stack=True,yaxis_max=11)
bar.add('AA+',value,list(retAA_add.values()),is_stack=True,yaxis_max=11)
bar.add('AAA',value,list(retAAA.values()),is_stack=True,yaxis_max=11)

如果没有安装pyecharts,需要用pip安装即可。
 

 

原创文章
转载请注明出处:
 http://30daydo.com/article/400