您现在的位置是: 首页> 学无止境> PHP> PHP
PHP实现K线筹码分布
张伟江2020-04-18 14:08【PHP】4031人已围观
简介筹码分布就是将历史上在每个价位成交的量叠加起来,并以此来判断当前市复场上所有流通股的持仓成本。
筹码分布就是将历史上在每个价位成交的量叠加起来,并以此来判断当前市场上所有流通股的持仓成本。
当然历史上成交中的一部分会在后面的交易日中被抛出,也就是说不能简单地将以前的成交累积到现在,而应该有一定的衰减。这个衰减的比例也就是每天的换手率。
假设有1000的盘子,前天10元成交量300股,换手率即为30%,昨天10元成交量100股,10.5元成交量200股,换手率即为30%,今天10元300股,11元100股,换手率即为40%,那么前天10元成交量300股怎么样了?成本分析假定,前天10元的300成交量在昨天以30%换手掉了,那么昨天10元的筹码即为300*(1-0.3)+100 = 310股,今天又被40换手掉了,今天10元的筹码即为(300*(1-0.3)+100)*(1-0.4)+300=486股,10.5元的筹码为200*(1-0.4)=120股,11元筹码为100股。
代码如下
/**
* foreach将二维数组的某列值当作该数组的键名
* @param $array
* @param $key
* @return mixed
*/
function arrayBindKey($array, $key)
{
foreach ((array)$array as $value) {
if (!empty($value[$key])) {
$k = $value[$key];
$result["$k"] = $value;
}
}
return $result;
}
/**
* 计算筹码分布
*/
function calc_chip(){
// 流通股本1000股
$float_share = 1000;
$data1 = [
[
'trade_date'=>'20200413',
'price'=>10,
'volume'=>300,
]
];
// 将二维数组用某个字段的值当做键名
$data1 = arrayBindKey($data1,'price');
$data2 = [
[
'trade_date'=>'20200414',
'price'=>10,
'volume'=>100,
],
[
'trade_date'=>'20200414',
'price'=>10.5,
'volume'=>200,
]
];
// 将二维数组用某个字段的值当做键名
$data2 = arrayBindKey($data2,'price');
// 计算20200414的总成交量
$volume = array_sum(array_column($data2,'volume'));
// 计算换手率
$turnover_rate = $volume / $float_share;
// 计算筹码分布
foreach($data2 as &$val){
// 前一天的筹码*(1-当日换手率) + 当日的成交量
$prev_volume = isset($data1["{$val['price']}"])? $data1["{$val['price']}"]['volume']:0;
$val['volume'] = $prev_volume*(1-$turnover_rate) + $val['volume'];
}
unset($val);
// 处理前一日价格在当日价格没出现的筹码并追加在当日筹码中
$price_arr = array_keys($data2);
foreach($data1 as $v){
if(!in_array($v['price'],$price_arr)){
$data2["{$v['price']}"] = [
'trade_date'=>end($data2)['trade_date'],
'price'=>$v['price'],
'volume'=>$v['volume']*(1-$turnover_rate),
];
}
}
echo '20200414的筹码分布';
dump($data2);
$data3 = [
[
'trade_date'=>'20200415',
'price'=>10,
'volume'=>300,
],
[
'trade_date'=>'20200415',
'price'=>11,
'volume'=>100,
]
];
// 将二维数组用某个字段的值当做键名
$data3 = arrayBindKey($data3,'price');
// 计算20200415的总成交量
$volume = array_sum(array_column($data3,'volume'));
// 计算换手率
$turnover_rate = $volume / $float_share;
// 计算筹码分布
foreach($data3 as &$val){
// 前一天的筹码*(1-当日换手率) + 当日的成交量
$prev_volume = isset($data2["{$val['price']}"])? $data2["{$val['price']}"]['volume']:0;
$val['volume'] = $prev_volume*(1-$turnover_rate) + $val['volume'];
}
unset($val);
// 处理前一日价格在当日价格没出现的筹码并追加在当日筹码中
$price_arr = array_keys($data3);
foreach($data2 as $v){
if(!in_array($v['price'],$price_arr)){
$data3["{$v['price']}"] = [
'trade_date'=>end($data3)['trade_date'],
'price'=>$v['price'],
'volume'=>$v['volume']*(1-$turnover_rate),
];
}
}
echo '20200415的筹码分布';
dump($data3);
}
calc_chip()
结果如下:- END -
发表评论 取消回复