您现在的位置是: 首页> 学无止境> PHP> PHP

PHP实现K线筹码分布

陈健2020-04-18 14:08PHP3023人已围观

简介筹码分布就是将历史上在每个价位成交的量叠加起来,并以此来判断当前市复场上所有流通股的持仓成本。

筹码分布就是将历史上在每个价位成交的量叠加起来,并以此来判断当前市场上所有流通股的持仓成本。

当然历史上成交中的一部分会在后面的交易日中被抛出,也就是说不能简单地将以前的成交累积到现在,而应该有一定的衰减。这个衰减的比例也就是每天的换手率。

假设有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 -

点赞(2) 打赏

文章评论 共有 0 条评论

暂无评论

站点信息

  • 建站时间:2018年10月24日
  • 网站程序:fastadmin
  • 文章统计301篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 微信号:zwj982215226

打赏本站

  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!
  • 微信扫码:你说多少就多少~
  • 支付宝扫码:你说多少就多少~

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部