営業キャッシュフローマージンとは企業の競争優位性を示す指標値で、営業キャッシュフローを売上高で割った数値になります。一般的には15%以上だと競争優位性が高いと言われています。100万円の売上があった場合15万円以上のキャッシュが入ってくるイメージですね。企業によっては同じ売上高でも、原価が高すぎて1万円しか入ってこないケースや、商品競争力の弱さなどから、顧客からのキャッシュが数ヶ月後まで入ってこない場合もあり、営業キャッシュフローマージンとはつまり「本業でゲンナマをゲットする力」とも言えます。
言い換えれば、商品力を含めた企業のトータル的な強さであり、その企業の力を推し量る上で非常にわかりやすい指標です。
さらに詳しく知りたい方はこのあたりの記事をお勧めします。
https://finance.logmi.jp/64522
http://www.butikomi.tokyo/archives/10355117.html
http://buffett-taro.net/archives/27944566.html
株を買う際には当然競争優位性の高い会社を選別する必要があるため、この営業キャッシュフローマージン(営業CFM)を銘柄選定の指標値にしている投資家も多く、私のクライアントさんもその一人です。
営業CFMは営業CFを売上高で割るだけで出すことができますので、今回はこの数値を計算してPandasのデータフローに列として追加する方法を勉強しましょう。
1 2 3 |
df = pd.DataFrame({"stock_code": ["1111", "2222", "3333", "4444"], "sales_cf": [21, 14, 20, 30], "sales_amount": [210, 123, 251, 50]}) |
証券コード、営業キャッシュフロー、売上高を列に持つ3行のデータフレームを例にとります。
1 2 3 4 5 6 7 |
print(df) --- stock_code sales_cf sales_amount 0 1111 21 210 1 2222 14 123 2 3333 20 251 3 4444 30 50 |
こんな感じですね。
さて、営業キャッシュフローマージンはsales_cfをsales_amountで割ったものですので、それを列に追加したいと思います。
その前にそれぞれの列を変数に取ってみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
se_cf = df['sales_cf'] se_amount = df['sales_amount'] print(type(se_cf)) print(se_cf) --- <class 'pandas.core.series.Series'> 0 21 1 14 2 20 3 30 |
データフレームに列名を指定するとSeriesのオブジェクトが返ってくることがわかりますね。
1 2 3 4 5 6 7 8 |
se_cf = df['sales_cf'] se_amount = df['sales_amount'] se_margin_sales_cf = se_cf / se_amount df['margin_sales_cf'] = se_margin_sales_cf print(df) |
Series同士のse_cfとse_amountを割り算した結果をse_margin_sales_cfというSeriesに格納します。
さらに元のデータフレームの新しい列margin_sales_cfとしてそのシリーズを追加します。
1 2 3 4 5 |
stock_code sales_cf sales_amount margin_sales_cf 0 1111 21 210 0.100000 1 2222 14 123 0.113821 2 3333 20 251 0.079681 3 4444 30 50 0.600000 |
こんな感じでできました。
桁数が多いので小数点第二位に丸めておきます。
1 2 3 4 5 6 7 8 |
df['margin_sales_cf'] = round(df['margin_sales_cf'], 3) --- stock_code sales_cf sales_amount margin_sales_cf 0 1111 21 210 0.100 1 2222 14 123 0.114 2 3333 20 251 0.080 3 4444 30 50 0.600 |
これまでのところを一気に書くとこうなります。
1 2 3 4 5 |
df = pd.DataFrame({"stock_code": ["1111", "2222", "3333", "4444"], "sales_cf": [21, 14, 20, 30], "sales_amount": [210, 123, 251, 50]}) df['margin_sales_cf'] = round(df['sales_cf'] / df['sales_amount'], 3) |
- df[‘sales_cf’]はSeriesであること
- Series同士の計算ができること
- Seriesをデータフレームに追加する際の記載方法
この辺りを押さえておけば、自由に欲しい情報を追加できるようになりますね。
さてせっかくなので、営業CFMが10%以上の行を抜き出す方法も記載しておきます。
1 2 3 4 5 6 |
print(df[df['margin_sales_cf'] > 0.10]) --- stock_code sales_cf sales_amount margin_sales_cf 1 2222 14 123 0.114 3 4444 30 50 0.600 |
df[‘margin_sales_cf’] > 0.10とすることで、margin_sales_cf列で0.10より大きい行のBool値が返ってきます。これを元のデータフレームに入れるとTrueだけの行が返ってくるわけです。
最初の例もそうですが、記載方法の裏にある動きをきちんと理解しながら進めるとよいですね。
次回はデータフレームをエクセルに出力する方法を勉強する予定です。
これを片手に学習中です。