オリジナルポートフォリオの作成

オリジナルポートフォリオの作成

メモはkobito.app

使う技術
*プログラム言語ruby
*webサービス構築sinatra
*データベース管理sqlite3
*データベースをrubyのオブジェクト化activerecord

まずsinatraから攻める
前回インストール済み
>Markdown: [これができればwebサービスは作れる-sinatra](http://kimioka.com/2015/02/これができればwebサービスは作れる-sinatra/ )

構造
k-portfolio
┣main.rb
┣import.sql
┣stock.db
┗views
__┣layout.erb
__┗index.erb


┗┣は「けいせん」で変換
  


```erb:layout.erb
<!DOCTYPE html>
<html lang="ja">
<head>
	<mata charset="utf-8">
	<title>k-portfolio</title>
</head>
<body>
	<%= yield %>
</body>
</html>
```

stock.dbの作成、import.sqlの読み込み

```sql:import.sql
drop table if exists posts;
create table posts( 
    id integer primary key,
    title text,
    body text, 
    created_at, 
    updated_at
);
```

```bash
Mac-no-MacBook-Pro:k-portfolio Mac$ sqlite3 stock.db
SQLite version 3.8.5 2014-08-15 22:37:57
Enter ".help" for usage hints.
sqlite> .read import.sql

sqlite> .shema
Error: unknown command or invalid arguments:  "shema". Enter ".help" for help
sqlite> .shcema
Error: unknown command or invalid arguments:  "shcema". Enter ".help" for help
sqlite> .schema
CREATE TABLE posts( 
    id integer primary key,
    title text,
    body text, 
    created_at, 
    updated_at
);
sqlite> 
```

main.rbにsinatra,active_record読み込み
stock.dbと関連付け,Postクラスの作成

```ruby:main.rb
require "sinatra"
require "sinatra/reloader"
require 'active_record'

ActiveRecord::Base.establish_connection(
    "adapter" => "sqlite3",
    "database" => "./stock.db"
)

class Post < ActiveRecord::Base
end

get "/" do 
	@title = "index"
	@content = "this is index"
	@posts = Post.order("id").all

	erb :index
end

post "/new" do 
    Post.create({:body => params[:body]})
    redirect '/'    
    erb :index
end
```


```erb:index.erb
<h1><%= @title %></h1>
<%= @content %>
    <h2>Add new</h2>
    <form method="post" action="/new">
        <input type= "text" name="body"><input type= "submit" value="post!">
    </form>
    <br>

    <table border="1">
    	<tr>
    		<td>id</td><td>comment</td><td>created_at</td>
    	</tr>
    		<% @posts.each do |post| %>
    	<tr>
    		<td><%= post.id %></td><td><%= post.body %></td><td><%= post.created_at %></td>
    	</tr>
    		<% end %>
    </table>	
```

![スクリーンショット 2015-02-14 02.24.16.png](https://qiita-image-store.s3.amazonaws.com/0/68769/aa6e9eca-f22a-98b7-65f2-ae12d5835a5d.png "スクリーンショット 2015-02-14 02.24.16.png")

これでフォームに入力した文字はcomment欄に表示され、その日時も記録される。出力はテーブル表。

##ここからどうするか
###株ポートフォリオに必要な変数名の用意
-コード
-市場
-名称
-損益
-当時購入価格
-現在取引値
-単元株数
-前日比
-出来高

###シンプルなものを作るために変数名を絞る
####やりたいこと
簡単に言えばYahooポートフォリオを自作する

1.気になる銘柄を選定後、その銘柄をtextファイルに保存。
textファイルから読み出し以下のことをする。

a.コード(code)
	textファイルに保存してあるので、そこからインポートしDBのcodeに追加
b.名称(name)
	codeから名称を検索しDBのnameに追加
c.当時購入価格(price)（終値*最低単元株数）
	codeから終値、最低単元株数を検索し、計算。計算結果をDBのpriceに追加

2.または気になる銘柄を選定後そのままDB(stock_日付.db)に追加する。

####シンプルに考えて
1.引け後銘柄選定
2.日付ごとにcodeだけ保存(.db OR .text)
3.終値*最低単元株数を計算し購入価格を算出
4.上書き保存
┗とりあえずここまでやってみる
5.最新の株価と照らし合わせ日付ごとの損益を出す

##引け後銘柄選定
自作chart.rbより選択
今はhtmlファイルとして保存(XXXX-XX-XX.text)

```ruby
<% if focus != nil
    File.open("./stockfile/#{today}.html","a") do |file|
        file.puts focus
    end
end %>
```

**これをdbファイルに保存したい(XXXX-XX-XX.db)がよくわからないので**textファイルとして保存しdbファイルから読み込むようにする

```ruby
<% if focus != nil
    File.open("./stockfile/#{today}.text","a") do |file|
        file.puts focus
    end
end %>
```
##2.日付ごとにcodeだけ保存(.db OR .text)
###dbファイルからtextファイルを読み込む
まずk-portfolio下に新規dbを作成。stock.db

```
:string     #=> 文字列
:text       #=> string読みも長い文字列
:integer    #=> 整数
:float      #=> 少数点を含む数
:decimal    #=> floatよみも精度の高い少数点を含む数
:datetime   #=> 日時
:timestamp  #=> より細かい日時
:time       #=> 日付
:date       #=> 日付 
:binary　　　#=> バイナリデータ
:boolean    #=> Boolean型(true or false)
```


>参考http://morizyun.github.io/blog/active-record-rails-beginner-tutorial/

>外部データからデータを取り込む - ドットインストール#17

SQL文

```sql:import.sql
drop table if exists posts;
create table posts( 
   	codes integer
);
```

```bash
Mac>sqlite3 stock.db
sqlite> .read import.sql

sqlite> .import ./2015-01-23.text posts
sqlite> select * from posts
   ...> ;
1883
1944
2002
2193
4114
4272
6517
9008
9021
9375
9739
```
stock.dbにコードが記録された

##3.終値*最低単元株数を計算し購入価格を算出

```名称取得方針メモ
-stock.dbからコードを１つずつ抽出
-それをyahoofinanceで検索し、正規表現でparse
時間がかかる、サーバーに負担がかかる

-銘柄,名称のDBを作っておきそこから反映
DB構築の最初だけ時間がかかる、新しい会社の反映、更新が面倒
```

終値データ取得方針
-yahoofinanceから

最低単元株数データ取得方針
o-yahoofinenceから
x-100,1000から選択できるようにする

結局yahoofinenceから取らなければいけないから
名称、終値、最低単元株数は同じようにスクレイピングする
スクレイピングしたのをtext→db保存になる

でもrubyから直接dbに保存することはできないのか

「db　保存　ruby」「ruby 保存 sqlite3」で検索してみた

```
# 仮データを入れてみる
Stat.create(
            :update_id => '1234556',
            :name => 'zanmai',
            :text => '肉が食べたい'
            )
```
>引用http://d.hatena.ne.jp/shokai/20080308/1205002736

なるほどchart1.rbからaciverecordをつかって
<form>の出力先にPost.createをすればいい
ってことはchart1.rbをsinatraで作り変えなければいけない。
いつかはしたほうがいいと思っていたが...

それをまずやって、保存先をstock.dbにする！
そうすればtextファイルを経由しなくていい！
次に続く